什么是反射
可以在运行期间获得一个类的所有方法和属性
比如一个类ReflectDemo有count变量,有setCount()方法,我们可以初始化一个类,用这个实例调用函数
也可以用反射
public class TestOnly {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("com.yy.ReflectionDemo");
Object object = clazz.newInstance();
Method method = clazz.getMethod("setCount", int.class);
method.invoke(object, 1);
}
}
在运行时么,通过字符串得知要运行的类
反射的使用
一,获取class对象
1,类名
Class clazz = Class.forName(“com.yy.ReflectionDemo”);
2,直接.class
Class clazz = ReflectionDemo.class;
3,getClass()
ReflectionDemo demo = new ReflectionDemo();
Class clazz = demo.getClass();
二,创建实例对象
1,先创建对应class,在用newInstance()
Class clazz = Class.forName("com.yy.ReflectionDemo");
Object object = clazz.newInstance();
2,有参构造,需要获取构造器
Class clazz = Class.forName("com.yy.ReflectionDemo");
Constructor constructor = clazz.getConstructor(int.class);
Object object = constructor.newInstance(1);
三,获取构造器,如上
四,获取并使用变量
Class clazz = Class.forName("com.yy.ReflectionDemo");
//获取所有自己的和继承的公共变量
Field[] fields = clazz.getDeclaredFields();
//获取指定的可见变量
Field pubVarField = clazz.getField("pubVar");
//获取私有变量
Field countField = clazz.getDeclaredField("count");
五,获取指定方法
Class clazz = Class.forName("com.yy.ReflectionDemo");
//获取可见方法,第一个参数是方法名,第二个参数是入参类型
Method setCountMethod = clazz.getMethod("setCount", int.class);
//获取私有方法
Method privatemethod = clazz.getDeclaredMethod("privateMethod");
Spring中的反射
Spring的IOC用到了反射,当我们需要一个对象时,定义是在Spring容器初始化的时候,将这个Bean转换成IOC容器内部的数据结构BeanDefinition,注册到容器中用HashMap管理,如果lazyinit设置为false,则不懒加载,都在Springboot启动时完成依赖注入,实例化。否则知道用户使用GetBean时才实例化
结语
本文对 Java 反射机制进行了介绍,学习到了它的使用和原理,反射是我们学习许多框架的一个敲门砖,像 Spring、Mockito 和 Jackson 都使用了反射。反射能够在运行时动态地创建类的实例,提高程序的灵活性,但是因为是在运行时去加载类,使得编译器没办法对代码进行优化,同时还无法得到编译期代码检测的安全保障,所以我们得选择恰当的场景使用反射。