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



来自为知笔记(Wiz)


posted on 2021-02-12 13:24  白衣风云  阅读(49)  评论(0编辑  收藏  举报

导航