reflect

反射

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

可以通过反射来操作,绕过编译。




你可能感兴趣的:(reflect)