一、反射的作用
1、反编译:从.class文件到.java文件。
2、通过反射机制访问java类的属性,方法,构造方法等。
创建一个普通类:
class User{
String name;
User(){}
public void m1(){}
}
以前我们访问属性name,会这样做: User u = new User(); u.name
二、获取Class类型对象的三种方式
1、先创建个普通类
public class Employee{
//Field 属性
private String name;
//Constructor 构造方法
public Employee(){}
public Employee(Sring name){
this.name = name;
}
//Method 方法
public void work(){
System.out.println(name + “在工作!”);
}
}
2、获取Class类型对象:3种方式
Employee.java编译生成Employee.class文件,现在通过反射机制,在反射机制中,Class代表的就是Employee.class这个文件整个的东西。
以下c1,c2,c3指向的对象代表的都是Employee这个类。
public class ReflectTest{
public static void main(String[] args) throws Exception{
//第一种方式: Class.forName()
Class c1 = Class.forName(“Employee”);
//c1代表引用保存内存地址指向堆中的对象,该对象代表的是Employee整个类
//因为在中文API中,forName()方法具有异常,所以主方法要抛出异常
//第二种方式:java中每个类型都有class属性
Class c2 = Employee.class;
//第三种方式: java语言中任何一个java对象都有getClass()方法,getClass()返回运行类
Employee e = new Employee();
Class c3 = e.getClass();
}
}
三、对获取Class类型对象的三种方式的个人理解
注意:为了便于抽象理解,我个人按自己的想法来假设:这个假想本质上是错误的,只是为了方便自己理解吸收而已!!!
假想:
1、因为通常类都是这样定义的,class 实现类 都是class关键字+实现类的名字
比如 class Student class User class Dog 等,基本每个类在定义时都需要
class这个关键字,因此,这正好侧面印证了java中每个类型都有class属性。
即Student.class User.class Dog.class
2、既然都是class User这种形式的,我们可以假想一下,把class变成大写的。这下,Class是个类,User也是个类,我们是不是可以这么看,Class User把User看成是Class类型的类,为什么要class小写呢?Class User{} 两个大写的类在这里,你不觉的很突兀吗?索性将Class写成小写的class,class User{} 这样是不是看起来舒服呢?
3、好了,既然Class User把User看成是Class类型的类。那么当看到Class c1这样的语句时,是不是可以把c1看成是Class类型的引用变量呢?因为Class User这种形式存在,那就意味这c1肯定是指向User、Student、Dog这样的类。按照java语言当中说法,c1通常指向的是堆中的对象。那么:
(1)从我个人想假想:c1指向的是Class类型的类,如User、Student、Dog这样的类
(2)java语言中语法:c1通常指向的是堆中的对象。
因此,总结起来,c1指向堆中的对象,该对象代表的是User、Student、Dog这样的类。
使用归纳:
1、因此:我们可以假设这样的结论成立:拿类 class User做比方
1. 但凡出现 User c1 = new xxx; 那么c1肯定是指向的是堆中的对象,这个对象是类User的对象。
2.一旦出现 Class c1= xxx; 那么我们肯定要联想到我的这个假想:
(1)class User看成Class User,Class User看成:把User看成是Class类型的类
(2)c1是小写,跟Class排在一起,首先确定c1不是类了。那么Class c1排在一起,c1肯定指向对象,而Class User排在一起看成:把User看成是Class类型的类。那么c1指向的对象肯定就是代表User这个类。
可以确定,Class c1= xxx; c1指向堆中的对象,该对象代表的是跟Class User排在一起的User这样的类。
2、好了,通过上面3、中的假想,面对Class c1= xxx; c1指向堆中的对象,该对象代表的是跟Class User排在一起的User这样的类。
而我们恰好想要获取Class类型对象的三种方式。
因此,就有以上的三种方式,Class类型的c1、c2、c3,它们指向的对象都是Employee这个类。
所以,Class c1= xxx; xxx肯定是要想方设法获取或者返回或者还原到Employee这个类。