初识JAVA反射<一>_0626

反射

一.最开始接触javaSE的时候就没有怎么学过反射,感觉好难,老师讲的也很晦涩,然后就没有然后了,最近项目中用到了AOP切面编程,全都是运用的反射,不学不行了,索性问问过来人。

1.一种说法是java反射实际上就是转换,讲java代码转换为二进制。

2.第二种说法就是将javaBean什么的转换成你需要的形式。

现在给我的想法,我觉得在SpingMVC上就用到了反射,我前台的ajax传过来的值,可以直接传到我的Controller的参数中得类,比如说,

$.ajax{

....

data:{deptCode:deptCode,

    deptName:deptName

}

}

public void getDeptController(HttpsevletRequest req,Dept dept){

}

public class Dept{

  private String deptCode;

  private String deptName;

.....getter///setter///省略了

}

 类似这样的一个例子,我自认为就是运用的反射,将穿过来的值,转换到javaBean当中去,然而具体的源代码我没有看过,还是觉得殊途同归,然后经过园子里的一位高人,在他的基础上,我改造了一下,算是初探java反射吧:

Java 反射机制是指Java程序可以在执行期载入,探知,使用编译期间完全未知的classes.这句话可能有点难以理解,我们可以通过一个例子来看。在Java程序中我们经常会用到这样一条语句来创建一个对象。Date date = new Date();在这条语句中date的类型(Java.util.Date)在编译时 已经确定。那么,有没有办法使我们把对象类型的确定时间由编译转到运行,答案是肯定的。这就是Java反射机制所提供的便利。而且它不单单可以生成对象还可以获取Field,对Field设值,及调用方法等。
  谈及Java反射机制就一定要知道一个名为“Class”的类,它是Java反射机制的基础。“Class”和其它类一样继承于Object类,它的实例对象用来描述Java运行时的一种类型,接口,或者原始类型(比如int).“Class”的实例要由JVM创建,它没有公用的构造方法。下面我们来看一下如何获得"Class"类实例。
  主要有三种方法。
     一,通过Class类的静态方法forName获取。Class cla = Class.forName("java.lang.String");
     二,通过.Type或.class属性获得。Class cla = String.class;Class cla1 = int.Type;
     三,通过实例变量的getClass方法获得。String s = ""; Class cla = s.getClass();
  如上所示实例对象cla就是对String类型的描述,通过它我们就可以创建一个String实例,并调用其中的方法。下一篇我将通过一个例子来展示如何使用Java反射机制。
JAVA反射机制
    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

下面我以顾客买相机为例来说明Java反射机制的应用。例子中涉及的类和接口有:
Camera接口:定义了takePhoto()方法。
Camera01类:一种照相机的类型,实现Camera接口。
Camera02类:另一种照相机的类型,实现Camera接口。
Seller类:卖照相机。
Customer类:买相机,有main方法。

(转自http://www.cnblogs.com/ksyou/archive/2009/03/21/1418279.html)

具体的实现我还是上我自己的吧:

 1 package com.zxd.June_26;
 2
 3 public interface Camera {
 4     public void takePhoto();
 5 }
 6 
 7 
 8 
 9 package com.zxd.June_26;
10 
11 public class Camera01 implements Camera{
12     private int prefix = 300;
13     private String zoom = "10times";
14     public void takePhoto() {
15         System.out.println("Camera01 takes a photo!!");
16     }
17     
18     
19     public void takeVidio(){
20         System.out.println("Camera01 takes a video!!");
21     }
22 
23 }
24 
25 
26 
27 package com.zxd.June_26;
28 
29 public class Customer {
30     
31     public static void main(String[] args) throws Exception{
32         
33         Seller seller = new Seller();
34         seller.getAttr("com.zxd.June_26.Camera01");
35 
36         seller.getMethod("com.zxd.June_26.Camera01");
37     
38         seller.testFunction("com.zxd.June_26.Camera01");    
39     }
40     
41 }
42 
43 
44 
45 package com.zxd.June_26;
46 
47 import java.lang.reflect.Field;
48 import java.lang.reflect.Method;
49 
50 public class Seller {
51     
52 
53     public void getAttr(String args) throws Exception{
54             Class cla = Class.forName(args);
55             Object obj = cla.newInstance();
56             Field[] field = obj.getClass().getDeclaredFields();
57             
58             for(int i = 0; i < field.length; i++){
59                 field[i].setAccessible(true);
60                 System.out.println("第"+i+"个成员变量为:"+field[i].getName()+"="+field[i].get(obj));
61             }
62 
63     }
64     
65     public void getMethod(String args) throws Exception{
66         Class cls = Class.forName(args);
67         Object obj = cls.newInstance();
68         Method[] method = obj.getClass().getDeclaredMethods();
69         
70         for(int i = 0; i < method.length; i++){
71             System.out.println("第"+i+"个方法名为:"+method[i].getName() );
72         }
73     }
74     
75     public void testFunction(String args) throws Exception{
76         Class cla = Class.forName(args);
77         Object obj = cla.newInstance();
78         Method[] method = obj.getClass().getDeclaredMethods();
79         
80         for(int i = 0 ;i < method.length; i++){
81             String methodName = method[i].getName();
82         
83             Method methodFunction = cla.getMethod(methodName, null);
84         //    System.out.println(methodFunction.getName());
85             System.out.print("遍历调用Camera的第"+i+"方法");
86             methodFunction.invoke(obj, null);
87         //    System.out.println(methodFunction.invoke(obj, null));;
88         }
89     }
90     
91 
92 }

 

测试结果为:

第0个成员变量为:prefix=300
第1个成员变量为:zoom=10times
第0个方法名为:takePhoto
第1个方法名为:takeVidio
遍历调用Camera的第0方法Camera01 takes a photo!!
遍历调用Camera的第1方法Camera01 takes a video!!

 

现在我还有一些问题,就是对于Method.invoke这个方法,请诸位等待我的第二个版本,我看看,在Method类下面有没有获得形参的方法,这样我就可以用invoke这个方法传递一些参数。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

初识JAVA反射<一>_0626,布布扣,bubuko.com

初识JAVA反射<一>_0626

上一篇:app、web测试其他测试点


下一篇:spring+springmvc+ibatis整合小结