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==========

参考文章:

      《侯捷观点--Java反射机制》

      《java反射机制》  http://hi.baidu.com/javatwt/blog/item/9aeffd13ddfb65025aaf53d4.html

转自:http://www.blogjava.net/amigoxie/archive/2007/04/21/112421.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值