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对象调用方法相比,反射的方法执行权在方法手中,由方法来执行调用过程。

浙公网安备 33010602011771号