Java注解与反射(七)

169 阅读2分钟

这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战

2.8 获取运行时类的完整结构

 package refection;
 ​
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 ​
 // 获得类的名称
 public class Test07 {
     @SuppressWarnings("all")
     public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
         Class c1 = Class.forName("refection.User");
 ​
         //获得类的名字
         System.out.println(c1.getName());       // 包名 + 类名
         System.out.println(c1.getSimpleName());     // 类名
 ​
         // 获得类的属性
         System.out.println("————————————————————————————————————————————");
         Field[] fields = c1.getFields();    // 只能找到public属性
         System.out.println(fields);
 ​
         System.out.println("—————————————————————————————————————————————");
         fields = c1.getDeclaredFields();    //找到全部的属性
         for (Field field : fields) {
             System.out.println(field);
         }
 ​
         System.out.println("——————————————————————————————————————————————");
         // 获得指定属性的值
         Field name = c1.getDeclaredField("name");     // getDeclaredField 需要输入一个属性字段
         System.out.println(name);
 ​
 ​
         System.out.println("——————————————————————————————————————————————");
         //获得类的方法
         Method []methods = c1.getMethods();
         for (Method method : methods) {
             System.out.println("正常的:" + method);
         }
 ​
         methods = c1.getDeclaredMethods();
         for (Method method : methods) {
             System.out.println("getDeclaredMethods:" + method);
         }
 ​
         // 获取指定方法
         Method getName = c1.getMethod("getName",null);
         Method setName = c1.getMethod("setName", String.class);
         System.out.println(getName);
         System.out.println(setName);
 ​
 ​
         // 获取构造器
         Constructor[] constructors = c1.getConstructors();
         for (Constructor constructor : constructors) {
             System.out.println(constructor);
         }
 ​
         Constructor []constructors1 = c1.getDeclaredConstructors();
         for (Constructor constructor : constructors1) {
             System.out.println( "#" + constructor);
         }
 ​
         Constructor constructor = c1.getDeclaredConstructor(String.class , int.class , int.class);
         System.out.println("指定:" + constructor);        // 指定全参构造
         constructor = c1.getDeclaredConstructor();
         System.out.println("指定:" + constructor);        // 指定无参构造
     }
 }
 ​

2.9 动态创建对象执行方法

  • 首先需要创建对象

    • Class c1 = Class.forName("位置") ;
  • 再者运用无参构造或者全参构造创建一个对象

    • 无参:newInstance();
    • 全参:获取构造器,填入参数
  • 通过反射调用普通的方法

    • 获取一个方法: invoke("对象" ,"方法的值");

    • 获取属性Field

      • 解决权限不够的问题:关闭安全属性
      • 变量名.setAccessible(true);
      • 传入值:属性名.set();
 package refection;
 ​
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 ​
 // 反射的综合应用
 public class Test08 {
     /**
      * - 首先需要创建对象
      *   - Class c1 = Class.forName("位置") ;
      * - 再者运用无参构造或者全参构造创建一个对象
      *   - 无参:newInstance();
      *   - 全参:获取构造器,填入参数
      * - 通过反射调用普通的方法
      *   - 获取一个方法: invoke("对象" ,"方法的值");
      *   - 获取属性Field
      *     - 解决权限不够的问题:关闭安全属性
      *     - 变量名.setAccessible(true);
      *     - 传入值:属性名.set();
      * */
 ​
     @SuppressWarnings("all")
     public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
         // 创建对象
         Class c1 = Class.forName("refection.User");
 ​
         // 无参构造
         User user = (User)c1.newInstance();
         System.out.println(user);
 ​
         // 全参构造
         Constructor constructor = c1.getDeclaredConstructor(String.class , int.class , int.class);
         User user1 = (User)constructor.newInstance("张三" , 1 , 18);
         System.out.println(user1);
 ​
         // 通过反射调用方法
         User user2 = (User)c1.newInstance();
         Method setName = c1.getDeclaredMethod("setName", String.class);
         setName.invoke(user2 , "张三2");
         System.out.println(user2.getName());
 ​
         // 通过反射操作属性
         User user3 = (User)c1.newInstance();
         Field name = c1.getDeclaredField("name");
         name.setAccessible(true);
         name.set(user3 , "张三3");
         System.out.println(user3.getName());
 ​
 ​
     }
 ​
 }
 ​