Java反射机制学习笔记

一. 反射机制描述
      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==========

posted on 2008-01-08 17:31 灵! 阅读(239) 评论(0)  编辑  收藏 所属分类: Java技术-反射


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


网站导航:
 
<2008年1月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

随笔分类

随笔档案

最新评论

阅读排行榜

评论排行榜