反射java
JAVA反射机制是在运行状态中,对于任意一个类,都可以知道这个类的全部属性和方法;对于任意一个对象,都可以调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。spa
Class Foo{}orm Foo foo1 = new Foo(); Class c1 = Foo.class;get Class c2 = foo1.getClass();it //c1和c2都表示了foo类的实例对象,一个类只多是一个Class类的实例对象编译 //类也是对象,是class类的实例对象,这个对象咱们称为此类的类型table //第三种表达方式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中集合的泛型,是防止错误输入的,只在编译阶段有效。
能够经过反射来操做,绕过编译。