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()方法获取





  • 相关阅读:
    如何将windows版的vim界面语言(默认为中文)设置成英文(转)
    hdu 1023 Train Problem II 完整高精度模板(以输出大Catalan为例)
    第三届蓝桥杯预赛真题解答
    hdu 1016 Prime Ring Problem (dfs)
    博客搬家
    void main()是错的!
    c,c++产生随机数详解
    高性能网站的十四条黄金法则
    云端
    jQuery Tools:Web开发必备的 jQuery UI 库
  • 原文地址:https://www.cnblogs.com/baiyifengyun/p/14398736.html
Copyright © 2011-2022 走看看