java反射总结

时间:2022-07-25
本文章向大家介绍java反射总结,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

反射相关总结

获取class对象

  1. 通过对象的getClass()方法
  2. 使用类的静态属性.class
  3. 通过class类的静态方法forName(String name)

一般只使用第三种方式

// 参数为你的完整包路径
Class clazz = Class.forName("com.earthchen.constructors.Student");

获取构造方法

批量获取构造方法

clazz.getConstructors() : 所有”公有的”构造方法

Constructor[] conArray = clazz.getConstructors();

clazz.getDeclaredConstructors() :获取所有的构造方法(包括私有、受保护、默认、公有)

Constructor[] conArray = clazz.getDeclaredConstructors();

获取单个构造方法

clazz.getConstructor(Class… parameterTypes); 获取单个的”公有的”构造方法

//1>、因为是无参的构造方法所以类型是一个null,不写也可以:这里需要的是一个参数的类型,切记是类型
//2>、返回的是描述这个无参构造函数的类对象。
Constructor con = clazz.getConstructor(null);

clazz.getDeclaredConstructor():获取”某个构造方法”可以是私有的,或受保护、默认、公有

Constructor con = clazz.getDeclaredConstructor(char.class);

调用构造方法

con.newInstance(): 调用构造方法

如果在构造实体时,需要传参数,直接在newInstance()方法中添加相关参数即可

obj=con.newInstance('男')

在访问私有方法时,需要设置允许访问

con.setAccessible(true);

获取成员变量

批量获取成员变量

clazz.getFields() : 所有”公有的”字段

Field[] fieldArray = stuClass.getFields();

clazz.getDeclaredFields() :获取所有的构造方法(包括私有、受保护、默认、公有)

Field[] fieldArray = stuClass.getDeclaredFields();

获取单个成员变量

clazz.getField(String name): 获取某个”公有的”字段

Field f = stuClass.getField("name");

clazz.getDeclaredField(String name):获取某个字段(可以是私有的)

Field f = stuClass.getDeclaredField("phoneNum");

设置字段的值

obj:要设置的字段所在的对象value:要为字段设置的值

f.set(obj, "18888889999");

f.set(Object obj,Object value): 设置字段的值在设置字段的时候,首先需要构造出obj的对象,也就是需要调用构造方法实例化在访问私有属性时,需要设置允许访问

f.setAccessible(true);

获取成员方法

批量获取方法

clazz.getMethods() : 所有”公有的”方法(包含了父类的方法也包含Object类)

Method[] methodArray = stuClass.getMethods();

clazz.getDeclaredMethods() :获取所有的成员方法,包括私有的(不包括继承的)

Method[] methodArray = stuClass.getDeclaredMethods();

获取单个方法

clazz.getMethod(String name,Class<?>… parameterTypes): 获取某个”公有的”方法

Method m = stuClass.getMethod("show1", String.class);

clazz.getDeclaredMethod(String name,Class<?>… parameterTypes):获取某个方法(可以是私有的)

Method m = stuClass.getDeclaredMethod("show4", int.class);

调用方法

Method –> public Object invoke(Object obj,Object… args): 调用方法obj : 要调用方法的对象;args:调用方式时所传递的实参;

m.invoke(obj, 20);

在设置字段的时候,首先需要构造出obj的对象,也就是需要调用构造方法实例化在访问私有方法时,需要设置允许访问

m.setAccessible(true);

参考:https://blog.csdn.net/sinat_38259539/article/details/71799078