java反射

2021-03-03 04:30

阅读:474

标签:hashcode   struct   java   tostring   获得   lang   div   方式   field   

  • 创建一个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)

java反射

标签:hashcode   struct   java   tostring   获得   lang   div   方式   field   

原文地址:https://www.cnblogs.com/baiyifengyun/p/14398736.html

上一篇:java的三种注释

下一篇:java递归思想


评论


亲,登录后才可以留言!