最近刚刚开始接触java的反射API,然后使用对j2EE或j2ME中许多框架的设计中有了一个大概的实现途径。现就自己学习到的知识做一个归纳。以后自己也会继续写java Reflect 机制的文章。
Reflect更改介绍:我们可以将java中的各种各样的部分看成是一个一个的对象---也就将类(class)中的各种各种的成分(例如,方法、属性、构造函数、描述符)映射成一个一个的类(Class)。
重要的类:
Method 指类中的方法对象
Field 指类中的属性对象
constructor 指类中的构造函数对象
modifier 指类中的修饰符对象
Class 指某个类的字节码文件对象-----注意,我个人理解,一个类的字节码文件在内存中只有一份,不会有多余的一份。之所以有很多这个类的对象,那是因为JVM用这个字节码文件创建了多个相对应的对象。如下的代码,就能验证这个说法:其输出结果就是true。虽然是不同的对象,但是这两个对象对应的字节码文件是相同的。也就是说都是指向同一个字节码文件对象。总结:我们可以把这个Class对象看作是一个字节码文件对象,在JVM中的只有一份字节码文件对象,不会出现重名的字节码文件,因为java语言的包机制是不允许的,字节码文件是以类全名存于JVM中的。
Method类中的重要的方法简介及其需要主要的点儿:
1、得到一个method对象的方法:oneclassobj.getDeclaredMethod(methodname,methodparaType) (注意:methodname值是必须指定的,methodParaType可以为null,因为某些方法是不需要参数的。如果methodparatype为null的话,那么在调用这个方法的时候一定不要再为这个方法添加参数,否则就回报错。)
1、invoke(majorobj,values) majorobj:方法所属的对象,也可以为null(当这个方法是static类型的时候,因为static方法是不属于某个对象的,是属于类的)。
在编程的过程中要注意的几点:
1、从某个类文件中得到什么样的方法(参数的类型,参数的个数),那么在调用(invoke方法)这个方法的时候也要注意参数类型、参数个数的匹配。
2、当方法有多个参数,参数的传递是个难点。当没有参数时,调用方法时就不用指定参数类型(设置为null),。总结如下,我们可以通过代码展示
客户端代码:
业务代码: