概述
java的反射机制是指在运行状态中(注意是运行状态),对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能调用这个它的任意一个方法和属性;这种动态获取的信息,以及动态调用对象的方法的功能称为java语言的反射机制。
获取class文件的方式
一共有三种方式:
方式一:Object类的getClass方法;
方式二:数据类型的静态属性class;
方式三:Class类中的静态方法:public static class<?> forName(String className)
下面通过代码展示一下:
(1)先创建实体类Person
public class Person {
private String name;
int age;
public String address;
public Person() {
}
Person(String name) {
this.name = name;
}
private Person(String name,int age) {
this.name = name;
this.age = age;
}
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
private void function() {
System.out.println("function");
}
public String getString(String s,int i) {
return s+"--"+i;
}
public void method (String s) {
System.out.println(s);
}
public void show() {
System.out.println("show");
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
}
}
(2)再创建测试类进行测试
public class ReflctDemo {
public static void main(String[] args) throws ClassNotFoundException {
// 使用Object类的getClass方法
Person p1 = new Person();
Class c1 = p1.getClass();
Person p2 = new Person();
Class c2 = p2.getClass();
System.out.println(p1 == p2);
System.out.println(c1 == c2);
// 使用数据类型的静态属性class
Class c3 = Person.class;
System.out.println(c1 == c3);
// 使用Class类中的静态方法forName
Class c4 = Class.forName("cn.myReflect.Person"); //全路径
System.out.println(c1 == c4);
}
}
运行结果如下:
下面对运行结果进行分析:
p1和p2是分别通过new创建的对象,每次新new出来的对象都不一样,所以输出结果为false;
c1和c2是通过getClass方法获取对象的字节码文件,不管怎么new,只要是同一个对象,字节码文件都是一样的,所以运行结果为true;
同理,无论通过数据类型的class属性还是Class类的forName方法得到的都是同一个对象的字节码文件,所以输出结果也是true。
注:对于以上三种方法,在项目开发中,一般使用第三种方法,原因是第三种方法的参数是一个字符串,而不是一个具体的类名,这样我们就可以把这样的字符串配置到配置文件中。
通过反射获得构造方法
Person类