1、反射概述
Java反射机制是在 运行状态下,对于任意一个类,都能够知道这个类所有的属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及 动态调用对象的方法的功能 称为Java的反射机制。
加载完类之后,在堆内存中的方法区就会产生了一个 Class 类型的对象 (一个类只有一个Class对象) ,这个对象就包含了完整的类的信息结构。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,通过镜子可以看到类的结构,所以我们称之为反射。
2、反射的优缺点
优点: 可以实现动态的创建对象和编译,体现出很大的灵活性。
缺点: 对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于直接执行相同的操作。
3、获取一个类的Class对象的三种方式:
/**
* 获取一个类的Class对象的三种方式
*/
public class Test2 {
public static void main(String[] args) throws ClassNotFoundException {
//方式1:通过类的实例对象和Object类的getClass()方法获取
String s = new String("hello");
Class class1 = s.getClass();
System.out.println(class1);
//方式2:通过类名.class获取到Class文件对象
Class<String> class2 = String.class;
System.out.println(class2);
//方式3:通过Class类的静态方法forName()获取
Class class3 = Class.forName("java.lang.String");
System.out.println(class3);
//获取到的都是一个对象,一个类只有一个Class类对象
System.out.println(class1 == class2);
System.out.println(class2 == class3);
}
}
执行结果:
4、通过反射获取类的构造方法并使用
在反射机制中,把类中的成员(构造方法、成员方法、成员变量)都封装成了对应的类进行表示。构造方法类使用类 Constructor 表示。通过Class 类提供的方法获取构造方法:
1、 返回一个构造方法:
public Constructor<T> getConstructor(Class<?> ... parameterTypes) : 获取public修饰,指定参数类型所对应的构造方法。
public Constructor<T> getDeclaredConstructor(Class<?> ... parameterTypes) : 获取指定参数类型所对应的构造方法(包含私有的)。
2、 返回多个构造方法:
public Constructor<T> [] getConstructors() : 获取所有的public修饰的构造方法。
public Constructor<T> [] getDeclaredConstructors() : 获取所有的构造方法(包含私有的)。
代码演示:
//自定义Person类
public class Person {
int id;
String name;
int age;
public Person(){
}
private Person(int id) {
this.id = id;
}
public Person(String name) {
this.name = name;
}
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name