Class类深入探究及使用
class类是java反射的核心类,当我们使用反射时,一般都要通过class来映射出我们需要的内容。
整篇博客我们使用User类的方法,Field等(只是为了以下方便一下方法的使用);
public class User { //类的构造函数 public User(){} public User(String name){} private User(String name,int n){} //类的Field private String name="小张"; public int age=20; //类的方法 public void A(){ System.out.println("无:A"); } public void B(int B){ System.out.println("int:B"); } public void C(String C){ System.out.println("String C"); } private void D(String D,int d){ System.out.println("String D,int d"); } }
一、如何获得class类的对象呢?
1.对象.getClass(); User user=new User(); Class clz=user.getClass(); 2.Class.forName(String name);//动态的根据类名称加载类 Class clz=Class.forName("类名称"); 3.类型.Class;//直接使用类型 Class clz=User.Class;
二、Class类的一些常用的方法
1、getName() 返回String类型的类名
2、newInstance() 创建一个类的实例,例如:xxxxx.getClass.newInstance(),创建了一个同xxxxx一样类型的实例。newInstance()方法调用默认构造器(无参数构造器)初始化新建对象。
3、getClassLoader() 返回该类的类加载器。
4、getComponentType() 返回表示数组组件类型的 Class。
5、getSuperclass() 返回表示此 Class 的实体(类、接口、基本类型或 void)的超类的 Class。
6、isArray() 判定此 Class 对象是否表示一个数组类。
三、通过反射的核心类Class类获得类的构造函数
1、getConstructors() 获取类中所有的public修饰的构造函数
2、getConstructor(parameterTypes) 获取指定的public修饰的构造函数,parameterTypes方法的参数的类型
3、getDeclaredConstructors(); 获取所有的构造函数,包括priavte和protected修饰的构造函数
4、getDeclaredConstructor(parameterTypes) 获取指定的构造函数,可以获得private和protected修饰的构造函数
下面的代码有几个方法的使用示例,可以参考一下
//通过反射获得类的构造函数 public class CreatesConstructor{ public static void main(String[] args) throws Exception { Class clz = User.class; // 获取所有的构造函数 Constructor[] c = User.class.getConstructors(); for (Constructor m : c) { System.out.println(m); } System.out.println("--------------------"); // 获取所有的构造函数 c = User.class.getDeclaredConstructors(); for (Constructor m : c) { System.out.println(m); } System.out.println("--------------------"); // 获取指定的构造函数 Constructor con = User.class.getConstructor(String.class); System.out.println(con); System.out.println("--------------------"); // 获取private修饰的构造函数 con = clz.getDeclaredConstructor(String.class, int.class); con.setAccessible(true); System.out.println(con); } } 输出结果:public cn.baidu.User(java.lang.String) public cn.baidu.User() -------------------- private cn.baidu.User(java.lang.String,int) public cn.baidu.User(java.lang.String) public cn.baidu.User() -------------------- public cn.baidu.User(java.lang.String) -------------------- private cn.baidu.User(java.lang.String,int)
四、通过反射的核心类Class类获得类的方法
1、getMethods() 获取类中所有的public修饰的方法,包括继承的父类的方法
2、getMethds(name,parameterTypes) 获取指定的public修饰的方法,name是类名
3、getDeclaredMethods() 获取本类所有的方法,包括priavte和protected修饰的方法
4、getDeclaredMethod(name,parameterTypes) 获取本类中指定的方法,可以获得private和protected修饰的方法
下面的代码有几个方法的使用示例,可以参考一下
public class CreatesMethod { public static void main(String[] args) throws Exception { // getAllMethod(); getAssignMethod(); } // 获取类中所有public修饰的方法 public static void getAllMethod() { Method[] m = User.class.getMethods(); for (Method c : m) { System.out.println(c); } System.out.println("--------------"); // 获取本类的所有方法 m = User.class.getDeclaredMethods(); for (Method c : m) { System.out.println(c); } } // 获取指定的方法 public static void getAssignMethod() throws Exception { Method m = User.class.getDeclaredMethod("D", String.class, int.class); System.out.println(m); } }
getAllMethod()方法输出的结果:public void cn.baidu.User.B(int)
public void cn.baidu.User.User.C(java.lang.String)
public void cn.baidu.User.User.A()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
--------------
public void cn.baidu.User.User.B(int)
public void cn.baidu.User.User.C(java.lang.String)
private void cn.baidu.Usere.User.D(java.lang.String,int)
public void cn.baidu.User.User.A()
getAssignMethod()方法输出的结果:private void cn.baidu.User.D(java.lang.String,int)
如何获取Field和Annotation就不作介绍了,和获取方法和构造函数是类似的
五、通过反射的核心类Class类调用类的方法
invoke(obj, args) 调用方法,通过Method类型调用的,obj为当前类的实例,args为参数类型
下面代码示例
import java.lang.reflect.InvocationTargetException; public class UseInvoke { public static void main(String[] args) throws Exception{ User.class.getMethod("B",int.class).invoke(User.class.newInstance(),11); } }
输出结果:int:B
浙公网安备 33010602011771号