概念:
反射机制指的是程序在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法。
我们都知道我们写的源文件需要编译成字节码文件,然后通过解释器在JVM中运行的,
而反射就是通过在JVM运行的程序,推出该字节码文件,然后获取一些别的东西。
可见获取字节码文件是反射的关键。
获取字节码对象的三种方式:
1,创建类的对象,再由对象获取
如:User user=new User();
Class<?> c1=user.getClass();
2,通过类名获取
如:Class<?> c2=User.class;
3,Class类中一个静态方法forName()
如:Class<?> c3=Class.forName("类的全路径");
这种方式因为传入的是一个字符串,而这个字符串可以通过配置文件配置,满足了设计的开闭原则。
得到了字节码文件对象,我们就可以获取该类的成员变量,成员方法以及构造方法了。
获取成员变量
1,Field[] f=c.getFields();
获取该类和其父类的public成员变量数组,
2,Field [] f1=c.getDeclaredFields();
获取该类的所有成员变量数组
3,Field f3=c.getField("属性名");
获取该类或其父类的单个指定的public成员变量
4Field f4=c.getDeclaredField("属性名");
获取该类单个指定的成员变量
获取成员方法
1,Method[] methods = c.getMethods();
获取该类和其父类所有的public成员方法数组
2,Method[] declaredMethods = c.getDeclaredMethods();
获取该类所有的成员方法数组
3,Method method = c.getMethod("方法名")
获取该类或其父类所有单个指定的public成员方法
4,Method method = c.getDeclaredMethod("方法名")
获取该类所有单个指定的成员方法
获取构造方法
1.Constructor<?>[] con1 = c.getConstructors();
获取所有的public构造方法 数组
2,Constructor<?>[] con2=c.getDeclaredConstructors()
获取所有的构造方法 数组
3,Constructor<?> con3=c.getConstructor (参数类型.class,...);
获取单个public的构造方法
4,Constructor<?> con4=c.getDeclaredConstructor(参数类型.class,...);
获取单个的所有构造方法
在实际开发中,没有必要使用反射来访问已知类的方法和属性,只有当程序要动态创建某个类的对象的时候才会考虑使用
获取到构造方法后我们便可以创建对象了
Object obj=constructor.newInstance();
如果是私有构造方法,可以通过
con.setAccessible(true);开启访问权限。
注意一个私有构造方法可以通过throw new error("禁止访问该构造方法")来防止通过反射访问该构造方法。