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