posts - 297,  comments - 1618,  trackbacks - 0
一. 反射机制描述
      Java的反射机制允许程序在运行时透过反射API取得任何一个已知名称的class的内部信息,主要包括属性名,属性名的修饰符,方法名,方法返回值,方法修饰符等信息。

二. Java类反射中的主要方法
     Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数,

     Constructor[] getConstructors() -- 获得类的所有公共构造函数

     Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)

     Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关) 

     获得字段信息的Class 反射调用不同于那些用于接入构造函数的调用,在参数类型数组中使用了字段名:

     Field getField(String name) -- 获得命名的公共字段

     Field[] getFields() -- 获得类的所有公共字段

     Field getDeclaredField(String name) -- 获得类声明的命名的字段

     Field[] getDeclaredFields() -- 获得类声明的所有字段 

     用于获得方法信息函数:

     Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法

     Method[] getMethods() -- 获得类的所有公共方法

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

     Method[] getDeclaredMethods() -- 获得类声明的所有方法 

三. Java反射机制应用初探
   
     现在一堆框架搞得人云里雾里的,例如spring等等,大都利用了Java的反射机制,eg. 大名鼎鼎的IOC.昨天晚上闲着没事的时候,初试了下反射,下面是一个简单的测试例子:
   

import java.awt.Button;
import java.lang.reflect.Method;
import java.util.Hashtable;

/**
 * 测试Java的反射机制
 * 
@author Amigo Xie(xiexingxing1121@126.com)
 * 
@since 2007/04/20 21:40
 
*/

public class ReflectionTest {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) throws Exception {
        ReflectionTest reflection 
= new ReflectionTest();
        reflection.getNameTest();
        System.out.println(
"");
        reflection.getMethodTest();
    }

    
    
/**
     * Class的getName()方法测试
     * 
@throws Exception
     
*/

    
public void getNameTest() throws Exception {
        System.out.println(
"===========begin getNameTest============");
        String name 
= "amigo";
        Class cls 
= name.getClass();
        System.out.println(
"string class name: " + cls.getName());
        
        Button btn 
= new Button();
        Class btnClass 
= btn.getClass();
        System.out.println(
"button class name: " + btnClass.getName());
        Class superBtnClass 
= btnClass.getSuperclass();
        System.out.println(
"super button class name: " + superBtnClass.getName());
        
        Class clsTest 
= Class.forName("java.awt.Button");
        System.out.println(
"clsTest name: " + clsTest.getName());
        System.out.println(
"===========end getNameTest============");
    }

    
    
/**
     * Class的getMethod()方法测试
     * 
@throws Exception
     
*/

    
public void getMethodTest() throws Exception {
        System.out.println(
"===========begin getMethodTest==========");
        Class cls 
= Class.forName("ReflectionTest");
        Class ptypes[] 
= new Class[2];
        ptypes[
0= Class.forName("java.lang.String");
        ptypes[
1= Class.forName("java.util.Hashtable");
        Method method 
= cls.getMethod("testMethod", ptypes);
        Object args[] 
= new Object[2];
        args[
0= "hello, my dear!";
        
        Hashtable ht 
= new Hashtable();
        ht.put(
"name""amigo");
        args[
1= ht;
        
        String returnStr 
= (String) method.invoke(new ReflectionTest(), args);
        System.out.println(
"returnStr= " + returnStr);
        System.out.println(
"===========end getMethodTest==========");
    }


    
public String testMethod(String str, Hashtable ht) throws Exception {
        String returnStr 
= "return str";
        System.out.println(
"begin testMethod invoked");
        System.out.println(
"str= " + str);
        System.out.println(
"name= " + (String) ht.get("name"));
        System.out.println(
"end testMethod invoked");
        
return returnStr;
    }

}


       控制台输出如下:
       ===========begin getNameTest============
       string class name: java.lang.String
       button class name: java.awt.Button
       super button class name: java.awt.Component
       clsTest name: java.awt.Button
       ===========end getNameTest============

       ===========begin getMethodTest==========
       begin testMethod invoked......
       str= hello, my dear!
       name= amigo
       end testMethod invoked......
       returnStr= return str
       ===========end getMethodTest==========
参考文章:
      《侯捷观点--Java反射机制》
      《java反射机制》  http://hi.baidu.com/javatwt/blog/item/9aeffd13ddfb65025aaf53d4.html
     

posted on 2007-04-21 11:45 阿蜜果 阅读(11644) 评论(7)  编辑  收藏 所属分类: Java


FeedBack:
# re: Java反射机制学习笔记(一)[未登录]
2007-04-21 15:12 | αβγ
出差,也不忘写blog啊  回复  更多评论
  
# re: Java反射机制学习笔记(一)
2007-04-25 10:33 | 王凌华
加油!  回复  更多评论
  
# re: Java反射机制学习笔记(一)
2007-07-09 19:54 | lcs
这个似乎用处不怎么大,写的不深刻,只是皮毛  回复  更多评论
  
# re: Java反射机制学习笔记(一)
2007-08-19 19:26 | tanl
太肤浅了,就是演示了一下它的方法!  回复  更多评论
  
# re: Java反射机制学习笔记(一)[未登录]
2007-08-19 22:40 | jack
文章mm自己写的吗  回复  更多评论
  
# re: Java反射机制学习笔记(一)
2008-09-19 11:35 | x-pei
恩 这只是些基本的语法!
没有什么 ~  回复  更多评论
  
# re: Java反射机制学习笔记(一)
2010-01-27 21:52 | IBM-dr.smith
这样的代码一点意义也没有,看了反而有副作用!  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

      生活将我们磨圆,是为了让我们滚得更远——“圆”来如此。
      我的作品:
      玩转Axure RP  (2015年12月出版)
      

      Power Designer系统分析与建模实战  (2015年7月出版)
      
     Struts2+Hibernate3+Spring2   (2010年5月出版)
     

留言簿(262)

随笔分类

随笔档案

文章分类

相册

关注blog

积分与排名

  • 积分 - 2285120
  • 排名 - 3

最新评论

阅读排行榜

评论排行榜