反射详解

概念:

反射机制指的是程序在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法。

我们都知道我们写的源文件需要编译成字节码文件,然后通过解释器在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("禁止访问该构造方法")来防止通过反射访问该构造方法。

 

 
原文地址:https://www.cnblogs.com/zzjlxy-225223/p/11285405.html