`

Java面向对象-JavaBean 和反射转载

    博客分类:
  • java
阅读更多

JavaBean和反射
  JavaBean
    规范
1.必须包含一个无参数的public构造方法

2.必须包含符合命名规范的get和set方法以便访问JavaBean的属性

3.应该是可以序列化(serializable)的

4.必须支持内省(进行自我检查看是否符合规范比如有正确的get/set方法无参的构造方法等)
5.如果有运行时的外观,就必须扩展java.awt.Component类

    JavaBean的类型
1.简单属性的JavaBean Set和Get方法比较简单,只负责设置属性值或者取得属性
2.绑定属性的JavaBean Set和Get除了负责属性值或者取得属性值外,还可以通知其他JavaBean自身改变的信息
3.约束属性的JavaBean 比绑定属性的JavaBean功能更复杂.
  反射
    获得Class对象
   
  方法1:得到一个类的实例,可以根据该对象的实例来获取模板
TextField t = new TextField();
Class mode1 = t.getClass();//实例.getClass(); 

方法2:通过类的名称来获取模板
TextField t = new TextField();

Class mode1 = TextField.class;//类的对象名.class 

方法3:根据类的名称来获取模板
Class mode1 = Class.forName(""com.test7.Students"");//注意还有包名
  
通过模板获取属性,构造方法,普通方法
   获取属性
        
Students stu = new Students();  

Class mode1 = stu.getClass();  //获取单个属性,并且私有属性无法获取

Field field = mode1.getField("name"); 
System.out.println(field);  //获取单个属性,并且可以获得私有

  Field field = mode1.getDeclaredField("age");
//  System.out.println(field);  
//获取多个属性,并且私有属性无法获取 
Field fields[] = mode1.getFields(); 
for(Field f:fields){   
System.out.println(f);
}

//获取多个属性,并且可以获取私有属性

//  Field fields[] = mode1.getDeclaredFields();

//  for(Field f:fields){

//   System.out.println(f);} 
      获取构造方法
      Constructor getConstructor(Class[] params)//通过参数类型来获取公共构造方法

//举例通过参数来获取公共构造方法

Class param[] = new Class[3]; 

param[0] = String.class;

  param[1] = int.class; 

param[2] = int.class; 

Constructor c = mode1.getConstructor(param); 

System.out.println(c);

Constructo[] getConstructors()//获取类中所有的公共构造方法

//举例 获取所有公共的构造方法
Constructor  cons[] = mode1.getConstructors(); 
for(Constructor c:cons){  
System.out.println(c);

Constructor getDeclaredConstructor(Class[] params)//通过参数类型获取所有类型的构造方法

//举例获取所有类型的构造方法
Class param[] = new Class[3];  
param[2] = String.class;  
param[0] = int.class; 
param[1] = int.class; 
Constructor con = mode1.getDeclaredConstructor(param);   System.out.println(con);
Constructor[] getDeclaredConstructors()//获得所有类型的构造方法

//举例获取所有类型的构造方法 

Constructor cc[]  = mode1.getDeclaredConstructors();   

for(Constructor sd:cc){  
  System.out.println(sd);}
      获取普通方法
        Method getMethod(String name,Class[] params)//使用特定的参数类型,获取命名的公共方法
//举例
Students stu = new Students();  
Class mode1 = stu.getClass();  
Class param[] = new Class[1];   
param[0] = int.class; 
Method m = mode1.getMethod("setAge", param);  
System.out.println(m); 
Method[] getMethods()//获得类的所有公共方法

//举例   
Students stu = new Students(); 
Class mode1 = stu.getClass(); 
Method m[] = mode1.getMethods();  
for(Method df:m){ 
System.out.println(df);}
Method[] getDeclaredMethods()//获得类声明的所有方法

Method getDeclaredMethod(String name,Class[] params)//使用特定参数类型获取声明的命名的方法

    反射的定义: 根据一个类的名称去得到对象里的类,属性,方法的技术
反射的作用:
1.判断某个对象所属的类型
2.取得类型(Class)的属性,方法,构造体和父类的相关信息
3.找出接口中的常量和方法定义
4.为一个执行期才得知名称的类产生对象(即动态创建对象创建好对象在NEW它就是静态创建) 
反射的原理:
比如创建Dog类的三个对象 
Dog d1 = new Dog();
Dog d2 = new Dog();
Dog d3 = new Dog();
这个过程中JVM在底层的实现过程:

1.JVM利用DogClassLoader先将Dog类加载到内存, 然后马上产生一个Class类型的对象,该对象可以看成一个模板, 以后不管创建几个Dog类的实例都是利用该模板生成的,所以一个 类所对应的Class类型对象只有一个
2.根据这个模型生成Dog类的三个实例d1,d2,d3 反射正是利用Java的这种加载方式主动完成了对象的创建及使用 
反射使用步骤 1.获得想操作的类的java.lang.Class对象(获取模板)
2.调用诸如getDeclaredMethods的方法(查看模板中的属性和方法)
3.使用reflection API来操作这些信息(知道模板中的属性和方法后对其调用)
  知识点
1.小写的class是个关键字用来定义一个类,而大写的Class是Java lang包下的一个类  2.String 的全称 java.lang.String 而由于编辑器默认加载所以只需要写String 
3.基本数据类型是.TYPE来获取对象例如Class mode1 = Integer.TYPE; 
4.由于构造方法方法名和类名相同所以只需要由参数加以判断,而普通方法的方法名不确定所以在加参数判定的同时还需要获取方法名
5.获取属性,构造方法,普通方法 都是导入java.lang.reflect.包

www.nijieyan.info
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics