JavaBean和反射
<!-- [if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:AllowPNG/> </o:OfficeDocumentSettings></xml><![endif]-->
理解JavaBean
JavaBean是一种JAVA语言写成的可重用组件。从用户的观点来看,一个组件可以是一个与你交互的按钮。
最初,JavaBean的目的是为了将可以重复使用的软件代码打包标准。包括按钮可以拖放到开发环境中。之后,JavaBean更被扩展为一个java web 应用的标准部件。在J2EE框架中, JavaBean更被扩展为企业及的应用Enterprise JavaBean(EJB)。
第一节???????????JavaBean的作用
JavaBean组件在任意地方的重用说的是它能够在包括应用程序、其他组件、文档、Web站点和应用程序构造器工具的多种方案中再利用
JavaBean必须包含一个无参数的public构造方法。
JavaBean必须包含符合命名规范的get和set方法,以便访问JavaBean的属性。
JavaBean应该是可串行化(serializable)的。
JavaBean必须支持内省,如果Bean有运行时的外观,就必须扩展java.awt.Component类
简单属性的JavaBean:该JavaBean中的SetXXX()和GetXXX()方法比较简单,只负责设置属性值或者取得属性值
绑定属性的JavaBean:该JavaBean中的SetXXX()和GetXXX()方法,除了负责设置属性值或者取得属性值外,还可以通知其他JavaBean自身改变的信息
约束属性的JavaBean:比绑定属性的JavaBean功能更复杂。
JavaBean支持内省,利用这种机制,我们可以知道JavaBean的哪些方法是可以被其他对象访问或被GUI生成工具访问。这种内省被认为是JavaBean API规范使用的一种特殊形式的“反射”。
Java的反射技术是java程序的特征之一,它允许运行中的Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。
使用反射可以获得Java类中各个成员的名称并显示出来。简单的说,反射就是让你可以通过名称来得到对象(类,属性,方法)的技术。
判断某个对象所属的类型(Class)。
取得类型(Class)的属性,方法,构造体和父类的相关信息。
找出接口中的常量和方法定义。
为一个执行期才得知名称的类产生对象(即动态创建对象)。
对象创建过程:比如要创建Dog类的三个对象
Dog d1 = newDog();
Dog d2 = newDog();
Dog d3 = newDog();
在这个过程中,JVM的底层实现过程如下:
第一步?????? ????? JVM利用DogClassLoader先将Dog类加载到内存,然后马上产生了一个Class类型的对象,该对象可以看成是一个模型,以后无论创建多少个Dog类的实例都是利用该模型来生成。所以一个类所对应的Class类型的对象只有一个。
第二步?????? 根据这个模型生成Dog类的三个实例d1、d2、d3。
第三步? ????? 反射正是利用了java的这种加载方式主动完成了对象的创建及使用。
遵循三个步骤:
第一步?????? 获得你想操作的类的 java.lang.Class 对象
第二步?????? 调用诸如 getDeclaredMethods 的方法
第三步?????? 使用 reflection API 来操作这些信息
获得Class对象的方式主要有以下三种:
方式一:如果一个类的实例已经得到,你可以使用
【Class c = 对象名.getClass(); 】
????????? 例: TextField t = new TextField();
???????????????? ?Class c = t.getClass();?
???????????????? ?Class s = c.getSuperclass();
方式二:如果你在编译期知道类的名字,你可以使用如下的方法
【 Class c =JButton.class;? 】或者【Class c = Integer.TYPE;】
方式三:如果类名在编译期不知道, 但是在运行期可以获得, 你可以使用下面的方法
【 Class c =Class.forName(strg); 】
一个类通常由三部分组成——属性、普通方法、构造方法。反射机制中为获取以上三个部分分别提供了常用类及方法。
Filed类:????????????? 提供有关类或接口的属性信息。
Constructor类:?? 提供关于类的单个构造方法的信息以及对它的访问权限。
Method类:???????? 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。
Field????????? getField(String name)?获得指定的公共字段
Field[]??????? getFields()??获得类的所有公共字段
Field????????? getDeclaredField(String name)?获得指定的字段
Field[]??????? getDeclaredFields()?获得类声明的所有字段
ConstructorgetConstructor(Class[] params)???
获得使用特殊的参数类型的公共构造函数
Constructor[]getConstructors()
获得类的所有公共构造函数
ConstructorgetDeclaredConstructor(Class[] params)?
获得使用特定参数类型的构造函数(与访问级别无关)
Constructor[]getDeclaredConstructors()
获得类的所有构造函数(与访问级别无关)
MethodgetMethod(String name, Class[] params)
使用特定的参数类型,获得命名的公共方法
Method[]getMethods()
获得类的所有公共方法
MethodgetDeclaredMethod(String name, Class[] params)
使用特定的参数类型,获得类声明的命名的方法
Method[]getDeclaredMethods()
获得类声明的所有方法
在(二)中我们已经可以获得了类的几个主要组成部分——属性、构造方法、方法各自的对象了,接下来我们就可以控制这些对象来完成一些操作了。
利用反射技术而进行的常用操作主要有两个:
一、动态的创建对象
二、执行方法
使用new操作符创建对象是我们比较熟悉的方式,使用反射技术在程序执行过程中可以动态的创建对象。
既然可以在程序执行过程中动态的创建对象,那么当然可以利用方法的名称来执行方法了。