反射,什么是反射
Java的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类所属的属性和方法,都能够调用他的属性和方法。这种动态获取的信息或者动态调用的方法的功能,我们称之为Java的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。
Class类
通过查阅API可以得知,Class类没有公共构造方法,Class对象在加载类时,由JVM以及通过调用类加载器中defineClass 方法自动构造的
获取Class对象的三种方法。
方式一:通过Object中的getObject()方法
Person p=new Person();
Class c=p.getPerson();
方式二:通过类名.class获取到字节码文件对象上(任意数据类型都具备一个class静态属性,看上去要比第一种方式简单)。
Class c2 = Person.class;
方式三:通过Class类中的方法(将类名作为字符串传递给Class类中的静态方法forName即可)。
Class c3 = Class.forName(“Person”);
第三种方式与前两种不同之处在于前两种必须明确Person类型,而第三种只需要指定这种类型的字符串就行.这种扩展更强
代码演示:
Person类
package exercise;
public class Person {
public String name;
private int age;
public Person() {
System.out.println("空参构造!");
}
public Person(String name) {
this.name = name;
System.out.println("带String的构造");
}
private Person(int age) {
this.age = age;
System.out.println("私有构造!");
}
//没有返回值没有参数的方法
public void method1(){
System.out.println("没有返回值没有参数的方法");
}
//没有返回值,有参数的方法
public void method2(String name){
System.out.println("没有返回值,有参数的方法 name= "+ name);
}
//有返回值,没有参数
public int method3(){
System.out.println("有返回值,没有参数的方法");
return 123;
}
//有返回值,有参数的方法
public String method4(String name){
System.out.println("有返回值,有参数的方法");
return "哈哈" + name;
}
private void method5(){
System.out.println("私有方法");
}
}
测试类
public class Demo_1 {
public static void main(String[] args) throws ClassNotFoundException {
// 1: 通过Object类中的getObject()方法
Person p1 = new Person();
Class c1 = p1.getClass();
System.out.println("c1 = "+ c1);
//2: 通过 类名.class 获取到字节码文件对象
Class c2 = Person.class;
System.out.println("c2 = "+ c2);
// 3: 反射中的方法
Class c3 = Class.forName("exercise.Person");// 包名.类名
System.out.println("c3 = " + c3);
}
}
//未完待续