zoukankan      html  css  js  c++  java
  • 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()方法获取





  • 相关阅读:
    PCB设计流程
    第一次PCB画板实战MiniDVPart1/3
    程序人生
    MCU死掉了
    一花一世界,一码一人生,谓之程序人生
    神船·神舟
    程序猿的选择
    android得到strings.xml文件中的内容
    Android特效 五种Toast详解
    Java字符串转换为日期和时间比较大小
  • 原文地址:https://www.cnblogs.com/baiyifengyun/p/14398736.html
Copyright © 2011-2022 走看看