• java反射


    • 创建一个Person类

    public class Person{
        private String name;
        private Integer age;
    
        public String getName(){
            return name;
        }
    
        public void setName(String name){
            this.name = name;
        }
    
        public Integer getAge(){
            return age;
        }
    
        public void setAge(Integer age){
            this.age = age;
        }
    
        public Person(){
    
        }
    
        public Person(String name, Integer age){
            this.name = name;
            this.age = age;
        }
    
        public Person(String name){
            this.name = name;
        }
    
        public Person(Integer age){
            this.age = age;
        }
    
    }
    • 反射的基石是:字节码对象

      • 创建类的对象时是根据类的内存中的字节码文件对象来创建

      • 一个类的字节码文件对象只加载一次

    Person p = new Person();
    Person p2 = new Person();
    
    Class c1 = p.getClass();
    Class c2 = p2.getClass();
    System.out.print(c1 == c2);  // 输出为true,说明创建的两个对象使用的是同一份字节码文件对象
    • 字节码文件的加载时机:

      • new一个类的时候

      • 访问一个类的静态成员的时候

      • 调用一个类的静态方法的时候

      • 通过反射的方式创建一个类的字节码对象的时候

      • 创建一个子类对象的时候

      • java命令执行一个字节码文件的时候

    • 字节码对象的组成:

      • 构造方法-->Constructor对象

      • 成员方法-->Method对象

      • 成员变量-->Field对象

    • 构造方法对象

    import java.lang.reflect.Constructor;
    Class c3 = Person.class;  //得到字节码文件对象
    
    Constructor [] constructors = c3.getConstructors(); // 获得构造器对象
    
    for(Constructor constructor:constructors){
        System.out.println(constructor);
    }
    • 结果输出为:
    • 通过构造器对象来创建实例

    Constructor constr = c3.getConstructor(String.class); // 得到指定的构造器对象
    Object obj = constr.newInstance("tom"); // 用得到的构造器对象创建该类的实例
    Person cp = (Person)obj;
    System.out.println(cp.getName());  //输出为tom
    • 当构造器私有后,无法通过new来创建实例

    public class Student{
    
        private Student(){
    
        }
    
        public String toString(){
            return "Student [getClass()=" + getClass() + ",hashCode()=" +hashCode()+ ",toString()=" + super.toString() +"]";
        }
    }
    • getConstructor()无法得到私有的构造方法,通过getDeclaredConstructor()方法获取





  • 相关阅读:
    Android推送服务——百度云推送
    关于HierarchyViewer的使用
    Android开发者的演示工具——asm.jar
    重装huson遇到的一些错误及解决
    对比语法错误、语义错误以及运行时错误
    对比常量存储与堆栈
    php下载文件夹目录下的文件
    B/S(WEB)系统中使用Activex插件调用扫描仪实现连续扫描并上传图像(IE文件扫描并自动上传
    上传文件夹
    如何在Web页面里使用高拍仪扫描上传图像
  • 原文地址:https://www.cnblogs.com/baiyifengyun/p/14398736.html
Copyright © 2020-2023  润新知