什么是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());
发表评论