Java 反射篇——对属性和方法的读写操作
Java 反射篇——对属性和方法的读写操作
代码
- 对属性的操作
Class<?> myClass = Class.forName("com.zhang.reflect.Student");
Object o = myClass.getDeclaredConstructor().newInstance();
// 对公有属性的读取
Field catName = myClass.getDeclaredField("catName");
System.out.println(catName.getName()); // 读取这个属性的名
System.out.println(catName.get(o)); // 读取这个属性的值
// 对属性的私有的属性进行读取
Field name = myClass.getDeclaredField("name");
name.setAccessible(true);
System.out.println(name.getName());
System.out.println(name.get(o));
// 对私有属性的写入
Field name1 = myClass.getDeclaredField("name");
name1.setAccessible(true); // 设置可以访问
System.out.println(String.format("写入前的值:%s = %s ", name1.getName(),name1.get(o)));
name1.set(o, "小张"); // 写入 ; 需要操作的对象,需要写入的值
System.out.println(String.format("写入后的值: %s = %s",name1.getName(),name1.get(o)));
- 对方法的操作
Class<?> myClass = Class.forName("com.zhang.reflect.Student");
Object o = myClass.getDeclaredConstructor().newInstance();
// 调用公有方法 无参数 无返回值
System.out.println("------------");
Class[] paramsClass = {}; // 数组大小为空 确定具体是哪个方法 参数的类型个数
Object[] params = {}; // 需要调用的方法 需要 传递几个参数
Method s1 = myClass.getDeclaredMethod("s1", paramsClass);
s1.invoke(o, params); // o.s1() 与这个等价 只会调用输出语句 默认不会返回结果
// 调用公有方法 有参数 有返回值
System.out.println("-----------------");
Class[] paramsClass1 = {};
paramsClass1 = new Class[1]; // 设置数组大小为1 重新创建了一个大小为1的数组
paramsClass1[0] = String.class;
Method eat = myClass.getDeclaredMethod("eat", paramsClass1);
Object[] params1 = {};
params1 = new Object[1];
params1[0] = "鱼";
Object result = eat.invoke(o, params1); // 将返回值赋予一个变量
System.out.println(result.toString()); // 输出返回值
// 调用私有方法 无参数 有返回值
System.out.println("------------");
Class[] paramsClass2 = {};
Object[] params2 = {};
Method s2 = myClass.getDeclaredMethod("s2", paramsClass2);
s2.setAccessible(true); // 设置为可以访问
Object invoke = s2.invoke(o, params2);
System.out.println(invoke);
// 调用私有方法 有参数 有返回值
System.out.println("-------------");
Class[] paramsClass3 = {};
Object[] params3 = {};
paramsClass3 = new Class[1];
paramsClass3[0] = String.class;
Method sleep = myClass.getDeclaredMethod("sleep", paramsClass3);
params3 = new Object[1];
params3[0] = "晚上睡觉";
sleep.setAccessible(true); // 设置为可以访问
Object invoke1 = sleep.invoke(o, params3);
System.out.println(invoke1.toString());
- 测试的实体类Student
private String name = "张三";
public String catName = "Tom";
public Student() {
}
public Student(String name, String catName) {
this.name = name;
this.catName = catName;
}
public String s2(){
return "this is s2";
}
public void s1(){
System.out.println("this is s1");
}
public String eat(String food){
return food + " is a good food";
}
private String sleep(String msg){
return msg + " is a good ";
}
public static void Stu(String name){
System.out.println("this is stu");
}
本文来自博客园,作者:ElloeStudy,转载请注明原文链接:https://www.cnblogs.com/ElloeStudy/p/16064009.html