Java反射机制

反射是一种机制,利用该机制可以在程序运行时得到类中的成员变量、成员方法、构造方法等。

当我们第一次使用一个类的时候,必须把这个类加载到方法区中才能使用。类加载器把类加载到方法区时,同时会给被加载的类创建一个Class类型的对象,这个Class类型的对象用来描述这个类,里面保存的是这个类的信息。

Class类型的对象,用于描述被加载的类,里面保存所有的信息。反射操作的就是这个对象。

获取Class对象的三种方式:

1.通过对象.getClass()获取

2.通过类名.class获取

3.(常用)通过Class类的forName(String className)方法Class.forName()获取类的Class对象(全限定类名)

不管通过哪种方式获取Class对象,获取到的都是同一个Class对象。

Class对象的常用方法

String getName();  //获取全限定类名

String getSimpleName();  //获取简单类名

T newInstance();  //使用空参构造创建该类的对象

Constructor<?>[] getConstructors();  //获取类中全部的构造方法,只能获取公共构造方法

Constructor<T> getConstructor(Class<?>... parameterTypes);  //获取类中指定的构造方法,参数是构造方法的参数列表(的Class对象)

constructor类的构造方法

T newInstance(Object... initargs);  //参数是执行构造方法时实际传递的参数,返回值是创建的对象

注:以上方式(反射)只能获取到公共构造方法,如果需要获取其他修饰符修饰的构造方法需要使用暴力反射

暴力反射:

暴力反射可以获取到类中所有权限的成员并使用。

但并不推荐使用,因为会破坏封装性。

 Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes);//获取类中指定的构造方法
 Constructor<?>[] getDeclaredConstructors();//获取类中全部的构造方法

获取类中的成员方法并进行使用

在Class中有一些方法可以获取成员方法

 Method getMethod(String name, Class<?>... parameterTypes);//获取类中指定的成员方法,指定成员方  法的方法名和方法的参数类型
 Method[] getMethods();//获取类中全部的成员方法

Method类的执行方法

 Object invoke(Object obj, Object... args) 
 //第一个参数传对象,表示调用哪个对象的成员方法,如果调用静态方法可以为null。
 //第二个可变参数传实际传递的参数。

同构造方法,只能获取到公共的成员方法。
跟直接new对象调用方法相比,反射的方法执行权在方法手中,由方法来执行调用过程。

posted @ 2020-07-23 15:28  shiroshiro  阅读(114)  评论(0)    收藏  举报