• Java 反射机制 ( Java Reflection Mechanism )


    Example

    @Data
    public class Student {
      
        private int age;
    }
    
    public class Reflection {
    
        public static void main(String[] args) throws Exception {
          	// 正常调用
            Student student = new Student();
            student.setAge(18);
            System.out.println(student.getAge());
    
            // Reflection
            Class studentClass = Class.forName("com.git.Reflection.Student");
          
            // get method
            Method setAge = studentClass.getMethod("setAge", int.class);
            Method getAge = studentClass.getMethod("getAge");
          
          	// Constructor
            Constructor studentClassConstructor = studentClass.getConstructor();
          
          	// new 一个 Object
            Object o = studentClassConstructor.newInstance();
          
            setAge.invoke(o, 18);
          	Object age = getAge.invoke(o);
            System.out.println(age);
        }
    }
    

    执行结果完全是一样的,区别就在,

    第一段在代码未执行的时就已经确定了要运行的类(Student)

    第二段代码则是在运行的时候通过类的全类名确定要运行的类 (Student)

    反射就是在代码运行的时候才确定需要执行的类并且可以拿到其所有的方法

    反射常用的 API

    获取反射中的Class对象
    • Class.forName 需要类的全类名

      Class studentClass = Class.forName("com.java.Reflection.Student");
      
    • Object.class

      Class<Student> studentClass = Student.class;
      
    • Object.getClass() 类对象的 getClass() 方法

      String s = new String("qqq");
      Class<? extends String> aClass1 = s.getClass();
      
    通过反射创建对象
    • Class对象的 newInstance()方法
    Class<Student> aClass = Student.class;
    Student student = constructor.newInstance();
    
    • ConstructornewInstance()方法
    Class<Student> studentClass = Student.class;
    Constructor<Student> constructor = studentClass.getConstructor();
    Student student = constructor.newInstance();
    
    通过反射获取类属性、方法、构造器
    • 非私有属性

      Class studentClass = Student.class;
      Field[] fields = studentClass.getFields();
      
      Constructor constructor = studentClass.getConstructor();
      System.out.println(constructor.toString());
      
      for (Field field : fields) {
      System.out.println(field.getName());
      }
      

      输出结果

      public com.java.Reflection.Student()
      

      没有输出属性,原因是 Student就没有非私有的属性,获取私有的属性需要用到关键字 declared

    • 全部属性

    Class studentClass = Student.class;
    Field[] fields = studentClass.getDeclaredFields();
    
    Constructor declaredConstructor = studentClass.getDeclaredConstructor();
    System.out.println(declaredConstructor.toString());
    
    for (Field field : fields) {
    System.out.println(field.getName());
    }
    

    输出结果

    public com.ali.Reflection.Student()
    age
    
  • 相关阅读:
    Linux 命令汇总总结相关
    数据结构---python---表
    python-----Queue模块
    再看python多线程------threading模块
    <转> Struct 和 Union区别 以及 对内存对齐方式的说明
    python装饰器
    HTTP权威指南----缓存
    HTTP权威指南----连接管理
    以python理解Linux的IO多路复用,select、poll、epoll
    <转载> pycharm快捷键及一些常用设置
  • 原文地址:https://www.cnblogs.com/hellojava404/p/13701059.html
Copyright © 2020-2023  润新知