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");
}
posted @ 2022-03-27 19:26  ElloeStudy  阅读(88)  评论(0编辑  收藏  举报