一、获取Class实例的三种方式
Ps:Fool f=new Fool();
Class c1=f.getClass; //已知类的名称
Class c2=Fool.class; //已知类的实例对象
Class c3=Class.forName("com.aa.bb.Fool"); //已知类的全限定名
二、静态加载类与动态加载类
1、静态加载类(编译时,加载的类是静态加载类)
Foo foo = new Foo();
new创建对象是静态加载类,编译时就要加载所有要用到的类,如果其中一个类有问题,就无法通过编译。
2、动态加载类(运行时,加载的类是动态加载类)
Class.forName("com.reflect.Foo");
编译时不检查用到的类是否存在,运行时再检查。
三、常用方法
public class TestReflect {
public static void printClassmessage(Object obj){
Class c=obj.getClass();
try {
//通过参数获得指定的构造方法
Constructor ctr= c.getConstructor(int.class,String.class);
//创建一个对象
ctr.newInstance(999,"小米");
} catch (Exception e) {
e.printStackTrace();
}
//获取该类的所有public构造函数;
Constructor[] ct = c.getConstructors();
//获取该类自行声明的所有构造函数;
Constructor[] cts = c.getDeclaredConstructors();
try {
//通过方法名和参数获得指定的方法(两种写法)
Method m1 = c.getMethod("eat",new Class[]{int.class,String.class});
Method m2 = c.getMethod("eat",int.class,String.class);
//如果无参
Method m3 = c.getMethod("eat",new Class[]{});
Method m4 = c.getMethod("eat");
//执行一个方法,第一个参数是执行方法的对象,第二个参数是方法所需要的参数
m1.invoke(obj,1,"1");
m2.invoke(obj,new Object[]{1,"1"});
} catch (Exception e) {
e.printStackTrace();
}
//获取该类的所有public方法,包括从父类继承的方法;
Method[] ms=c.getMethods();
//获取该类自行声明的所有方法,不论访问权限;
Method[] mes=c.getDeclaredMethods();
//获取该类的所有public成员变量
Field[] fl=c.getFields();
//获取该类自行声明的所有成员变量,不包括从父类继承来的
Field[] fld=c.getDeclaredFields();
for (int i=0;i<ms.length;i++){
//获取方法的返回值类类型,如:int.class
Class returnType=ms[i].getReturnType();
//获取方法的返回值类型的名字
returnType.getName();
//获取方法名
ms[i].getName();
//获得参数列表类型的类类型,如:int.class
Class[] paramTypes = ms[i].getParameterTypes();
for (Class cl:paramTypes){
System.out.println(cl.getName());
}
}
for (Field field:fl){
//获取成员变量类型的类类型
Class fieldType = field.getType();
fieldType.getName();
//获取成员变量的名称
String fieldName = field.getName();
}
for (Constructor constructor:ct){
//获取构造函数的名称
constructor.getName();
//获取构造函数的参数列表
Class[] paramTypes = constructor.getParameterTypes();
for (Class cz:paramTypes){
//获取构造函数的参数名称
cz.getName();
}
}
}
}