读书人

Java反照笔记(2)

发布时间: 2012-12-19 14:13:15 作者: rapoo

Java反射笔记(2)

java.lang.array提供了动态创建和当问数组元素的各种静态方法。


?
Java反照笔记(2)

如果要生成对象实体,在反射动态机制中有两种方法,一个针对”无自变量构造方法“,另外一个针对”带参数的构造方法“,如果调用的是”带参数构造方法“需要调用Constructor对象的newInstance(),并且需要首先准备一个Class[]作为Constructor的参数类型,然后以此为自变量调用getConstructor(),获得一个专属的Construtor,再调用该Construtor的newInstance()。如果调用无自变量的构造方法,直接调用Class的newInstance()就可以。


运行时调用Method:和动态调用带参数的构造方法类似,首先需要准备一个Class[]作为参数类型,接着以此为自变量调用getMethod(),获得特定的Metho0d Object。接下来准备一个Object[]放置自变量,调用上面得到Method对象的invoke方法。

那么为什么获得Method Object时不需要指定返回类型呢?

因为Method overloading机制要求signature必须唯一,而返回类型并非signature的一个成分。换句话说,只要制定了method名称和参数列,就一定指出了一个独一无二的method。

代码:
Java反照笔记(2)

?

和调用某个特定构造方法构造类的实例以及调用某个特定的方法不同,变更"field"内容不需要参数和自变量。首先调用Class的getField()并制定field名称。获得特定的Field Object之后便可以直接调用Field的get()和set()。


代码:
Java反照笔记(2)

?

可以在一个类中修改另一个类中的私有成员变量吗?
?呵呵,如果你是一位rookie,相信你一定会说不可以,其实通过反射机制是可以修改的,先看看下面两个方法:

<!-- Generated by javadoc (build 1.6.0) on Wed Nov 29 02:21:23 PST 2006 -->

public class PrivateTest {private String str;public PrivateTest(String str) {this.str = str;}public String getStr() {return str;}}public class ReflectionTest {public static void main(String[] args) throws Exception {PrivateTest pt = new PrivateTest("hello");//得到PrivateTest的Class对象,通过调用对象的getClass()或者直接从类得到//Class classType = pt.getClass();Class classType = PrivateTest.class;//得到相应class中指定名称字段的Field对象Field field = classType.getDeclaredField("str");//Field field = classType.getField("str"); 使用此方法不能得到private修饰符修饰的成员//设置该字段的setAccessible方法值为true,即压制访问检测field.setAccessible(true);//直接通过Field的get方法获得参数对应的对象的字段值String str = (String) field.get(pt);System.out.println(str);//压制访问检测后,通过Field的set方法为类的似有字段设置值field.set(pt, "world");System.out.println(pt.getStr());}}
?

?

?

读书人网 >编程

热点推荐