壹影博客.
我在下午4点钟开始想你
Java反射技术应用场景与常见问题
  • 2023-7-16日
  • 0评论
  • 856围观

什么是Java反射?

Java反射是指在运行时,通过获取类的信息并操作类或对象的属性、方法和构造函数等成员,而无需提前知道这些类的具体信息。它允许程序在运行时动态地探知和使用类的成员,以及在运行时创建对象、调用方法、访问属性等。

Java反射提供了一组类和接口,这些类和接口包含在java.lang.reflect包中。主要涉及的类包括:
①Class类:表示在Java运行时的类和接口。通过Class类,可以获取类的名称、修饰符、方法、属性、构造函数等信息,还可以创建类的实例对象。
②Constructor类:表示类的构造函数,可以用于创建类的实例。
③Method类:表示类的方法,可以用于调用类的方法。
④Field类:表示类的字段(属性),可以用于访问和设置类的字段值。

实现Java反射的三种方式

//假设我们有一个类 位于com.yyge.student

//实现反射的三种方式如下
//第一种:Class.fomName(类路径)
Class.forName("com.yyge.student");

//第二种 类名称.class
Student.class;

//第三种 实例对象.getClass()
Student stu = new Student();
stu.getClass();

具体的使用

 伪需求:获取一个Student类中的所有方法

1.获取类中某个方法 getMethod(方法名称,方法参数)

//反射对象
Class<?> aClass = Class.forName("com.yyge.Student");

//1.获取实体类中的某个方法 getMethod(方法名称,方法参数)
Method getName = aClass.getMethod("getName",方法参数);

2.获取类中所有方法 getMethods()

//反射对象
Class<?> aClass = Class.forName("com.yyge.Student");

//2.获取实体类中的某个方法 getMethods(方法名称,方法参数)
 Method[] methods = aClass.getMethods();

3.获取类中某个字段(变量) getField(字段名称)

//反射对象
Class<?> aClass = Class.forName("com.yyge.Student");

//3.获取实体类中的某个字段(变量) getField(字段名称)
Field field1 = aClass.getField(字段名称);

4.获取类中所有字段(变量) getFields ()

//反射对象
Class<?> aClass = Class.forName("com.yyge.Student");

//4.获取实体类中的所有字段(变量) getFields(字段名称)
Field[] field2 = aClass.getFields();
    

5.获取一个方法的参数getGenericParameterTypes()

//反射对象
Class<?> aClass = Class.forName("com.yyge.Student");

//5.获取一个方法的参数 getGenericParameterTypes()
Method method = aClass.getMethod("getName");
Type[] types =method.getGenericParameterTypes()

6.执行一个Method方法invoke(参数1,参数2....)
//参数1:存在当前方法的类
//参数2...:方案的参数
 //返回值:Object对象

//反射对象
Class<?> aClass = Class.forName("com.yyge.Student");

//获取到Method对象
Method method = aClass.getMethod("getName");
Object invoke = method.invoke(aClass,参数);

 

实际案例

反射获取并执行如下接口中的MAPPER,并执行MAPPER返回的MerchandiserConverter中的conver方法
接口代码如下:

public interface MerchandiserConverter {
    MerchandiserConverter MAPPER = Mappers.getMapper(MerchandiserConverter.class);

    Merchandiser conver(ProcessReq req);
}

解决思路

1.先反射该对象
2.通过反射获取对象的MAPPER字段
3. 获取MAPPER字段对应的对象
4. 将得到的对象继续进行反射处理
5. 获取反射后对象中的conver方法
6. 准备参数执行conver

//反射原对象
Class<?> object = Class.forName("com.yyge.MerchandiserConverter")

//获取MAPPER字段
Field field = object.getDeclaredField("MAPPER");

//获取字段对应的值
Object mapper = field.get(null);

//创建Mapper对应的实例对象 newInstance创建实例对象
Object ob = mapper.getClass().newInstance();

//实例化后又对这个对象进行反射获取
Class<?> object = ob.getClass();

//获取到实例化后对象的conver方法
 Method conver = mapper.getClass().getMethod("conver");

//执行这个方法 参数1:这个方法所在的类,参数2是方法的参数ProcessReq对象
Object after = conver.invoke(mapper.getClass(),new ProcessReq());

 

发表评论