一. 反射机制描述
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() -- 获得类声明的所有方法 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 getMethodTest========== |
|
来自: deepblue > 《JAVA Reflection》