反射相关方法
-
访问类的字段
-
访问类的方法
-
访问类的构造器
// 获取到类对象的方式(三种)
User user = new User("lisi","123abc");
Class clazz = user.getClass();// 第一种
Class<?> userClazz = Class.forName("com.example.demo.myenum.User");// 第二种,需要处理异常
Class userClazz1 = User.class;// 第三种
// 获取类的所有字段(私有,公开,默认,受保护)
Field[] fields = clazz.getDeclaredFields();
// 获取指定字段,需要处理异常
Field username = clazz.getDeclaredField("username");
// 获取父类
Class superClass = class.getSuperClass();
// 获取到所有父类的字段
while(superClass != null && superClass != Object.class) {
Field[] superFields = superClass.getDeclareFields();
superClass = superClass.getSuperClass();
}
// 访问字段
for(Field field : fields) {
// 设置访问权限,打开后可以访问私有修饰的字段
field.setAccessible(ture);
// 获取到字段名字
String name = field.getName();
// 获取字段值
Object object = field.get(user);
// 获取字段的类型,当需要判断类型时使用
Class<?> type = field.getType();
// 判断字段的访问修饰符
Modifier.isPrivate(field.getModifiers());
// 判断字段是否静态
Modifier.isStatic(field.getModifiers());
// 往字段中set值
Object o = clazz.getConstructor(String.class, String.class).newInstance();
field.set(o,"666");
}
// 访问方法
Method[] methods = clazz.getMethods();// 获取所有方法
Method method = clazz.getMethod("test", String.class);// 获取指定方法,参数为方法名,参数类型
// 调用方法
for(Method method1 : methods) {
method1.setAccessible(true);
Object o = clazz.getConstructor(String.class, String.class).newInstance();
method1.invoke(o,"hello world");// 参数
}
// 访问构造器
// 获取所有的public的构造器
Constructor[] constructors = clazz.getConstructors();// 批量
// 获取所有的构造器(四种访问修饰符都可)
Constructor[] constructors1 = clazz.getDeclaredConstructors();
// 获取public的无参构造器
Constructor constrctor = clazz.getConstructor(null);// 指定
// 获取private的有参构造器
Constructor constructor1 = clazz.getDeclaredConstructor(String.class,String.class);// 参数类型要传
// 通过构造器获取对象
Object object = constructor1.newInstance("lisi","1236565");// 使用时要注意类型强转