我对反射和代理的理解(1)

本文深入浅出地介绍了Java反射机制的基本原理及应用场景,探讨了如何通过四种方式获取Class实例,并解释了Class实例的本质。

 

至于反射和代理的定义以及它们所带来的好处,我就不多说了,这方面的资料网上很多,想了解的朋友,可以自己查.
   我还是从实用角度出发,来谈谈反射和代理的一些相关知识.
 
一 反射(reflect)
    java的反射是通过反射API来实现的,也就是说在java JDK中提供了一个反射类reflect,它位于java.lang.reflect包中.
    在学习和理解reflect时,一定要尽量理解”万事万物皆对象”的含义,以及对面向对象编程思想有一定了解.
    首先灌输一个思想:
现实生活中有形或无形的事物,甚至一种思想或者概念都可以抽象以后用一个java类来描述。不可否认的是,Java语言JDK中提供的类我们也同样可以把它们理解为一种事物,既然它们是事物,那它们也可以被抽象之后用另外的Java类描述,这个特殊的类名就叫做Class(呵呵,这个思想还是比较抽象,尽量去理解吧,能够理解一个大概也就可以了,通过以后的实践,你一定会有更大的收获)。
接下来举个例子:      public class Student{}
这一句我想应该所有人都可以看的懂,否则你就不要学反射和代理了,还是回去先学学java基础吧.
   上面这个例子定义了一个名字为”Student”的类,也就是说,有一群学生,尽管他们的年龄,性别,身高,体重等属性不相同,可他们还是有一些相同的属性可以被我们用一个类来描述.那接下来我要做的就是抽象这些学生,然后就可以定义一个名为”Student”的类了,这个名为”Student”和”学生”相对应,再说的专业一些:”Student”就是对这些”学生”的抽象.好了,理解了”Student”类的抽象和描述过程,那我现在的问题就是在javaJDK中提供的那些类,比如说:INTEGER类,String类,Boolean类等等,我们有没有办法把它们抽象以后用一个类来描述呢?我们知道这些类就像每一个学生个体,虽然它们有很多属性并不相同,可我们还是可以找到一些它们共同具有的属性,通过抽象用一个类来描述它们.这个类是……
哈哈,我想心细的朋友应该早已经看到答案了.对,就是你看到的,我们用来描述java JDK中提供的类就是这种特殊的类”Class”,这个”Class”与”Student”的意义相同,它们各自描述不同的东西.
 
上面的思想比较难以理解,如果理解了,那下面的思想就容易多了.下面就是反射的知识了,当然看下面这些文章之前,你一定要先了解,什么是反射,它有什么作用,否则你会认为反射真是无聊透顶,又复杂又不实用.好了,废话不多说,开说:
首先给出四种获取Class实例的方法:
(1)使用getClass()方法获取Class类的实例.例如:str是一个String类的一个实例:
 Class cls=str.getClass();
(2)知道类名,使用”类名.class”形式来获取Class类的实例.
 
Class cls=String.class; 
Class cls=Integer.TYPE;    //等效于int.class
(3)知道子类,使用getSuperclass方法从子类获取Class实例:
 Class subCls=String.class;
 Class superCls=subCls.getSuperclass();
(4)使用Class类的静态方法forName(String className)来获取某个类的Class实例:
 Class cls=Class.forName(“java.lang.String”)
     注意:传递进来的参数必须是字符串型,且格式必须为完整的”包.类名”,否则forName方法会抛出ClassNotFoundException异常.
 
这四种获取Class实例的方法是java反射技术经常用到的.
Class获得的实例到底是什么,我运用了第一种方法:             Class cls=str.getClass();并在控制台打印出cls的值,最后结果是:”java.lang.String”,对,没错,这就是Class的一个实例.试想一下,”Student”类是对所有学生的一个抽象和描述,这就类似于”Class”类是对所有java JDK 中提供的所有类的一个抽象描述;如果我要得到姓名为”张三”的学生,这时的这个名为”张三”的学生就是”Student”类的一个实例,因为”Student”类包括了学生”张三”;同样,因为”Class”类是对所有其它类的一个抽象和描述,也包括String类,所以String类就是”Class”类的一个实例.在程序中如果加上完整的包名就会如上述结果一样:java.lang.String.
当然最后需要说明的就是”Class”类的实例是通过反射技术得到的,而”Student”类的实例则与之不同.
在实际工作中,“Class”类还有很多方法需要用到,比如说获取类的构造方法,成员变量,方法等等.
这些都可以通过查阅JDK帮助文档来获取.
 
 
 
                                       未完.待续……
 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值