版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012153184/article/details/82626914
Java 中的反射巩固
反射如何获取类的对象
方法一: 通过内部私有的对象名称获取
Field field=Unsafe.class.getDeclaredField("theUnsafe");
//设置可以被访问
field.setAccessible(true);
Unsafe unsafe= (Unsafe) field.get(null);
System.out.println(unsafe);
方法二: 通过访问私有的构造函数获取
// System.out.println(Unsafe.class.getName());
Class ca=Class.forName("sun.misc.Unsafe");
Constructor constructor= ca.getDeclaredConstructor(null);
constructor.setAccessible(true);
Unsafe unsafe1= (Unsafe) constructor.newInstance(null);
System.out.println(unsafe1);
获取相关的类的信息
//获取类的所有构造方法信息
Constructor[] constructor=clazz.getDeclaredConstructors();
for(Constructor c:constructor){
System.out.println(c.toString());
}
//获取类的所有方法信息
Method[] method=clazz.getDeclaredMethods();
for(Method m:method){
System.out.println(m.toString());
}
//获取类的所有成员属性信息
Field[] field=clazz.getDeclaredFields();
for(Field f:field){
System.out.println(f.toString());
}
遍历对象的属性
/**
* 遍历属性
*/
try {
for (Field field : fields) {
System.out.println("数据类型:" + field.getType().getName());
System.out.println("字段名称 :" + field.getName());
//属性类型的过滤以及赋值
if("java.lang.String".equals(field.getType().getName())){
/**
* 把 private 设置成可访问的 否则会报错
* can not access a member of class java_reflect.A with modifiers "private"
*/
field.setAccessible(true);
field.set(a, "测试");
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}