反射调用方法时的两种情况,走get set和不走get set

时间:2024-01-12 12:47:02

@Test
 public void test1() throws Exception{
  //获取User类
  Class class1=Class.forName("cn.jbit.bean.User");
  //获取所有字段包括私有的
  Field[] fileds=class1.getDeclaredFields();
  for (Field field : fileds) {
   System.out.println(field.getName());
  }
  //获取所有方法
  Method[] methods = class1.getDeclaredMethods();
  for (Method method : methods) {
   System.out.println(method.getName());
  }
  //获取构造方法
  Constructor[] constructors = class1.getDeclaredConstructors();
  for (Constructor constructor : constructors) {
   System.out.println("构造方法:"+constructor);
  }
  //调用所有方法
  Method method = class1.getMethod("show");
  Object obj=class1.newInstance();
  //method.invoke(obj);
  //调用set方法赋值
  Field field = class1.getDeclaredField("name");
  //设置为Accessible可进入的,因为name是*字段
  field.setAccessible(true);
  //给私有字段赋值
  field.set(obj,"sp");
  method.invoke(obj);
 }

//上面的给私有字段赋值的方法是不走get,set方法的,那么有时在get,set方法里进行判断就不管用了
 //这时需要用PropertyDescriptor
 @Test
 public void test2() throws Exception{
  //获取User类
  Class class1=Class.forName("cn.jbit.bean.User");
  //获取所有字段包括私有的
  Field[] fileds=class1.getDeclaredFields();
  for (Field field : fileds) {
   System.out.println(field.getName());
  }
  //获取所有方法
  Method[] methods = class1.getDeclaredMethods();
  for (Method method : methods) {
   System.out.println(method.getName());
  }
  //调用所有方法
  Method method = class1.getMethod("show");
  Object obj=class1.newInstance();
  //method.invoke(obj);
  //调用set方法赋值
  Field field = class1.getDeclaredField("name");
  //属性描述
  PropertyDescriptor pd=new PropertyDescriptor("name", class1);
  //调用
  Method method2 = pd.getWriteMethod();
  method2.invoke(obj, "小红");
  Method method3 = pd.getReadMethod();
  String name = method3.invoke(obj).toString();
  System.out.println(name);
  
 }