2007-09-30
java reflection
关键字: java reflectionJava Reflection(反射)是一种在运行期间查看Java对象内部情况的技术,包括Java对象的变量、支持的方法、实现的接口、扩展的类——基本上在编译时你能想知道的关于对象的任何东西。
Reflection API位于java.lang.reflect包中。
载入指定的类,Class c = Class.forName(String className); 例,Class c = Class.forName("java.lang.String");
访问类的内部成员和其他相关信息:
- getMethods():返回一组表示类或接口的所有公共方法的方法对象数组。
- getConstructors():返回一组表示类的所有公共构造器的构造器对象数组。
- getFields():返回一组表示类或接口所有公共字段的字段对象数组。
- getClasses():返回一组表示所有属于类或接口的公共类和接口(例如,内部类)的类对象数组。
- getSuperclass():返回表示类或接口的超类的类对象(接口返回为空值)。
- getInterfaces():返回一组表示类或接口执行的所有接口的类对象数组。
更精确的一些方法:
- getMethod("methodName", Class...):返回表示接受类参数指定参数的类或接口中名为“methodName”的公共方法的方法对象。
- getConstructor(Class...):返回表示接受类参数指定参数的类公共构造器的构造器对象。
- getField("fieldName"):返回表示类或接口中名为“fieldname”的公共字段的字段对象。
动态调用类内部的方法:
- Field.get(Object):返回一个包含输入get()对象实例的字段值对象。(如果字段对象表示静态字段,那么对象参数便被忽略,也可能为空。)
- Method.invoke(Object, Object...):返回一个包含为输入invoke()的第一个对象参数实例调用方法的结果的对象。其余对象参数被传递给输入方法。(如果方法对象表示一个静态方法,那么第一个对象参数便被忽略,也可能为空。)
- Constructor.newInstance(Object...):返回调用构造器的新对象实例。对象参数输入构造器。(注意类的无参数构造器也可以通过newInstance()被调用。)
调用内部方法:
java 代码
- // method
- public int add(int a, int b) {
- return a + b;
- }
- // sample
- Class cls = Class.forName("method2");
- Class partypes[] = new Class[2];
- partypes[0] = Integer.TYPE;
- partypes[1] = Integer.TYPE;
- Method meth = cls.getMethod("add", partypes);
- method2 methobj = new method2();
- Object arglist[] = new Object[2];
- arglist[0] = new Integer(37);
- arglist[1] = new Integer(47);
- Object retobj= meth.invoke(methobj, arglist);
初始化对象:
java 代码
- // constructor
- public constructor2 ( ) {
- }
- public constructor2 (int a, int b) {
- System.out.println("a = " + a + " b = " + b);
- }
- // sample
- Class cls = Class.forName("constructor2");
- Class partypes[] = new Class[2];
- partypes[0] = Integer.TYPE;
- partypes[1] = Integer.TYPE;
- Constructor ct = cls.getConstructor(partypes);
- Object arglist[] = new Object[2];
- arglist[0] = new Integer(37);
- arglist[1] = new Integer(47);
- Object retobj = ct.newInstance(arglist);
改变字段(域)的值:
java 代码
- Class cls = Class.forName("field2");
- Field fld = cls.getField("d");
- field2 f2obj = new field2();
- System.out.println("d = " + f2obj.d);
- fld.setDouble(f2obj, 12.34);
使用数组:
java 代码
- Class cls = Class.forName("java.lang.String");
- Object arr = Array.newInstance(cls, 10);
- Array.set(arr, 5, "this is a test");
- String s = (String)Array.get(arr, 5);
- System.out.println(s);
参考:
Sun java reflection tutorial http://java.sun.com/docs/books/tutorial/reflect/index.html
Java Reflection-JAVA反射 http://www.mikecat.net/blogview.asp?logID=1421
使用 Java Reflection http://www.apusic.com/article/article5.htm
- 10:00
- 浏览 (429)
- 评论 (0)
- 分类: Java Foundation
- 相关推荐
发表评论
- 浏览: 54560 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
我的相册
动力
共 6 张
共 6 张
最新评论
-
一个数据库连接Java工具类 ...
不错,加油,能写成工具类就好了。
-- by dd2086 -
Hibernate和Access
我指的是方法一
-- by 黑暗浪子 -
Hibernate和Access
我测试一下,如果连接的是*.asa文件,好像就报"can't open conn ...
-- by 黑暗浪子 -
计算机/软件领域中的名人
Bruce Eckel和其他几位根本不是一个层次的人物。Marin Fowler ...
-- by turing -
《夜袭》和战争
电影拍的不好,有辱历史!
-- by ken1984






评论排行榜