reflect

反射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中集合的泛型,是防止错误输入的,只在编译阶段有效。

能够经过反射来操做,绕过编译。

相关文章
相关标签/搜索