反射,内省与javaBean

来源:互联网 发布:广发白发大数据001731 编辑:程序博客网 时间:2024/05/29 18:31
---------------------- android培训、java培训、期待与您交流! ----------------------

Class类介绍:

    Java类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则是由这个类的实例对象来确定的,不同的实例对象有不同的属性值。Java程序中的各个Java类,它们是否属于同一类事物,是不是可以用一个类来描述这类事物呢?这个类的名字就是Class,要注意与小写class关键字的区别。Class类描述了哪些方面的信息呢?类的名字,类的访问属性,类所属于的包名,字段名称的列表、方法名称的列表,等等。学习反射,首先要明白Class这个类。

Class类代表Java类,它的各个实例对象又分别对应什么呢?
 Class
类的实例表示正在运行的 Java应用程序中的类和接口。
如何得到各个字节码对应的实例对象(Class类型)
*
类名.class。例如:System.class
*
对象getClass()。例如:new Date().getClass()
*Class.forName("
类名")。例如:Class.forName("java.util.Date")

九个预定义Class实例对象:
   
表示八个基本类型和void。这些类对象由Java虚拟机创建,与其表示的基本类型同名,即booleanbytecharshortintlongfloatdouble
查看JDK帮助文档,isPrimitive方法的帮助:
int.class==Integer.TYPE

总之,只要是在源程序中出现的类型,都有各自的Class实例对象,例如,Stringint[],void.


反射:
*
反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示Java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是FieldMethodContructorPackage等等。
   
一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象。


Constructor类代表某个类中的一个构造方法

得到某个类的所有构造方法:

Constructor[] constructors = Class.forName(“java.lang.String”).getConstructors();

 

得到某一构造方法:

Constructor constructor = Class.forName(“java.lang.String”).getConstructors(StringBuffer.class);

//获得方法时要用到的类型

 

得到某一方法后创建实例对象

通常方式:Stringstr = new String(new StringBuffer(“abc”));

反射方式:Stringstr = (String) constructor.newInstance(new StringBuffer(“abc”));

//调用获得的方法时要用到上面相同类型的实例对象

 

 

Method类代表某个类中的一个成员方法

得到类中的某一个方法:

Method charAt = Class.forName(“java.lang.String”).getMethod(“charAt”,int.class);

 

调用方法:

通常方式:System.out.println(str.charAt(1));

反射方式:Systemout.println(charAt.invoke(str,1));

在反射方法中如果传递给Method对象的invoke()方法的第一个参数为Null,就说明该Method对象对应的是一个静态方法。

*Class.newInstance()方法:
   
例子:Stringobj=(String)Class.forName("java.lang.String").newInstance();
该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。
该方法内部的具体代码是怎样写的呢?用到了缓存机制来保存默认构造方法的实例对象。

反射会导至程序性能严重下降。

Field
Field
类代表某个类中的一个成员变量。

Methods
Methods
类代表某个类中的一个成员方法。
*
得到类中的某一个方法:
例子:Methods charAt=
 Class.forName("java.lang.String").getMethod("charAt",int.class);
*
调用方法:
    
通常方式:System.out.println(str.charAt(1));
    
反射方式:System.out.println(charAt.invoke(str,1));
*
如果传递给Method对象的invoke()方法的第一个参数为null,这说明该Method对象对应的是一个静态方法!

数组的反射:
   
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。
   
代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class
   
基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。


反射的作用->实现框架功能
*
框架与框架要解决的核心问题
   
我做房子卖给用户住,由用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入进我提供的框架中。框架与工具类有区别,工具类被用户的调用,而框架则是调用用户提供的类。    
*框架要解决的核心问题
   
我在写框架(房子)时,用户的程序还没写,类也没法提供。我写的框架程序怎样能调用你以后写的类(门窗)呢?
   
因为在写程序时无法知道要被调用的类名,所以,在程序中无法直接new某个类的实例对象,而要用反射方式来做。   

 

内省(IntroSpector)主要用于对javaBean进行操作。神马是JavaBean呢?
    JavaBean
是一种特殊的Java类,它的方法名要符合某种命名规则,这种Java类中的方法主要用于访问私有的字段。主要用于传递数据信息,譬如要获取age的属性,那他的方法名就必须是getAge(),再譬如给age设置属性,那就是setAge(),而其中get,set等名称字段就是符合某种特定的规则。而javaBean的属性也是根据方法名来的,JavaBean的属性是根据其中的settergetter方法来确定的,而不是根据其中的成员变量。比如getAge方法中的肯定要返回一个值,那么这个值的名字就是age了,同样对于setAge方法中的属性名就应该是age了。这里属性名跟方法名来是有规律的,也即去掉前面的“动作”字段后(剩下Age),如果剩下的单词第二个字母(如Age的字母’g’)是小写的,则把第一个字母变成小写的,再如方法getCPU()方法,字母CPU第二字母是大写的,则不需要将第一个字母C变成小写,对应的属性名还为CPU。总之,一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。

一个符合javaBean特点的类可以当做普通类一样尽进行使用,但为什么我们要把他当做javaBean来用呢?必然是他能带来一般来不能带来的好处,javaBean的好处如下:

1,在javaEE开发中,经常要使用到javaBean,很多环境就要求按javaBean方式进行操作,别人都这么用也是这么要求的,那就没有了其他选择的必要了。

2Jdk中提供了对javaBean进行操作的一些API,这套API就称为内省。如果要自己去通过getX方法来访问私有的x,不然是麻烦的,用内省这套API操作javaBean比普通类的方式更方便。

 

---------------------- android培训、java培训、期待与您交流! ----------------------
原创粉丝点击