反射(反编译):简单的说就是:通过.class文件得到.java文件。
package Reflect;
public class Student {
//属性
public String name;
protected int age;
String address;
private int idNum;
//静态代码块,类加载的时候执行
static{
System.out.println("加载类-->我是静态代码块");
}
{
System.out.println("生成了对象-->我是构造代码块");
}
}
public class Demo1 {
/**
* @param args
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws ClassNotFoundException {
//第一种(只会加载类)
Class class1=Class.forName("Reflect.Student");
//第二种(不会加载类,也没有生成对象)
Class class2=Reflect.Student.class;
//第三种(既会加载类,也生成了对象)
Student s1=new Student();
Class class3=s1.getClass();//Object类有一个getClass方法
//第四种(忽略)
String path="Reflect.Student";
Class class4=path.getClass(); //这里得到的是String类的Class对象
System.out.println(class1==class2);
System.out.println(class1==class3);
System.out.println(class3==class4);
}
}
重点:这里主要讲解三种创建Class对象的方法(特别注意:一个类只会创建一个Class对象,在实验的时候请将其他创建Class对象的方法注释掉):
(1)Class class1=Class.forName("Reflect.Student");// 会加载类,则Student类中的静态代码块也会被加载。
(2)Class class2=Reflect.Student.class;//不回加载类,也没有生成对象
(3)Student s1=new Student();
Class class3=s1.getClass();//既加载类,也生成了对象,(Object类有一个getClass方法)