Java反射

什么是反射
可以在运行期间获得一个类的所有方法和属性
比如一个类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 都使用了反射。反射能够在运行时动态地创建类的实例,提高程序的灵活性,但是因为是在运行时去加载类,使得编译器没办法对代码进行优化,同时还无法得到编译期代码检测的安全保障,所以我们得选择恰当的场景使用反射。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值