1、Class类的使用
1)在面向对象世界中,万事万物都是对象。每一个类也是对象,类是java.lang.Class类的实例对象。There is a class named Class.
任何一个类都是Class的实例对象,这个实例对象有三种表示方式。
第一种方法实际告诉我们任何一个类都有一个隐含的静态成员变量class;
Class c1 = 某类.class;
第二种方法通过getClass方法;
Class c2 = 某类实例对象.getClass();
Class c3 = Class.forName("com.imooc.reflect.Foo");//返回的是加载类的类类型即Foo类的类类型
反射可以绕过编译,在运行时操作
2、方法的反射
Method类,方法对象
一个成员方法就是一个Method对象
getMethods()方法获取的是所有的public的函数,包括父类继承而来的
getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限
public static void printClassMessage(Object obj){
Class c=obj.getClass();
Method[] ms=c.getMethods();getmethods获取所有的public的函数,包括父类继承而来的。
获取某一个,c.getMethod("name",参数类型1.class,参数类型2.class)
c.getDeclaredMethods()获取所有该类自己声明的方法,不问访问权限
for(int i=0;i<ms.length;i++){
Class a=ms[i].getReturnType();得到方法的返回值类型的类类型
String b=ms[i].getName();得到方法的名称
Class[] c=ms[i].getParameterTypes();获取参数类型。得到的是参数列表的类型的类类型
for(Class d:c){
String a=d.getName()
}
}
方法的反射操作:
1)如何获取某个方法
方法的名称和方法的参数列表唯一决定某一个方法
2)方法反射的操作(用Method的实例对象来进行调用)
method.invoke(对象,参数列表)
一般:a1.print(10,20);
现在:m.invoke(a1,new Object[]{10,20});(方法没有返回值返回null,有返回值返回具体的值但需要强制转换)
3)获取方法:获取一个方法就是获取类的信息,获取类的信息首先获取类类型。
3、成员变量的反射
Field[] fs=c.getFields()获取所有的public 的成员变量的信息
Field[] fs=c.getDeclaredFields()获取该类自己声明的成员变量的信息
for(Field a:fs){
Class b=a.getType();得到成员变量的类型的类类型
}
4、构造函数的反射
构造函数也是对象java.lang.constructor封装了构造函数的信息
getConstructor获取所有的public的构造函数
constructor[] a=c.getConstructor();
constructor[] a=c.getDeclaredConstructor();
for(constructor b:a){
Class[] c=b.getParameterTypes();获取构造函数的参数列表,得到参数列表的类类型
}