反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Class Foo{} Foo foo1 = new Foo(); Class c1 = Foo.class; Class c2 = foo1.getClass(); //c1和c2都表示了foo类的实例对象,一个类只可能是一个Class类的实例对象 //类也是对象,是class类的实例对象,这个对象我们称为此类的类型 //第三种表达方式 Class c3= Class.forName("com.imooc.reflect.Foo"); //结果是c3==c2;c2==c1; //我们完全可又通过类的类类型创建此类的对象实例。 Foo foo = (Foo)c1.newInstance(); |
//new 创建对象,是静态加载类,在编译时刻就需要加载所有的可能使用到的类
//通过动态加载类,可解决这个问题。
Object obj = new Object();
Class c1 = obj.class;
Method[] ms = c.getMethods();
for(int i=0;i<ms.length;i++){
ms[i].getName();
}
getDeclaredMethods()获取的是所有该类自己声明的方法。
反射获取成员变量的信息
成员变量也是对象,java.lang.reflect.Field封装了关于成员变量 的操作
1.获取构造han数的信息
c.getDeclaredConstructor();
关于 方法的反射
2.如何获取某个方法
方法的名称和方法的参数列表才能唯决定某个方法
3.方法反射的操作
method.invoke(对象,参数列表)
要获取一个方法就是要获取类的信息,获取类的信息首先就要获取类的类型。
Class A{
public void print(int a,int b){
}
}
方法的反射操作是用m对象来进行方法调用。
class A {
public void print(int a,int b){
System.out.println(a+b);
}
}
A a1 = new A();
Class c = a1.class;
Method m = c.getMethod("print",int.class,int.class);
Object o = m.invoke(a1,new Object[]{10,20}); 或者 Object o = m.invoke(a1,10,20);
反射的操作都是编译之后的操作
编译之后的泛型是去泛型化的,java中集合的泛型,是防止错误输入的,只在编译阶段有效。
可以通过反射来操作,绕过编译。