`
primer_2004
  • 浏览: 124219 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

候捷谈Java反射机制(5)

    博客分类:
  • Java
阅读更多

运行时生成instances<o:p></o:p>

欲生成对象实体,在Reflection 动态机制中有两种作法,一个针对“无自变量ctor”,<o:p></o:p>

一个针对“带参数ctor6是面对“无自变量ctor”的例子。如果欲调用的是“带参数ctor“就比较麻烦些,7是个例子,其中不再调用ClassnewInstance(),而是调用Constructor newInstance()7首先准备一个Class[]做为ctor的参数类型(本例指定为一个double和一个int),然后以此为自变量调用getConstructor(),获得一个专属ctor。接下来再准备一个Object[] 做为ctor实参值(本例指定3.14159125),调用上述专属ctornewInstance()<o:p></o:p>

<o:p> </o:p>

#001 Class c = Class.forName("DynTest");<o:p></o:p>

#002 Object obj = null;<o:p></o:p>

#003 obj = c.newInstance(); //不带自变量<o:p></o:p>

#004 System.out.println(obj);<o:p></o:p>

6:动态生成“Class object 所对应之class”的对象实体;无自变量。<o:p></o:p>

<o:p> </o:p>

#001 Class c = Class.forName("DynTest");<o:p></o:p>

#002 Class[] pTypes = new Class[] { double.class, int.class };<o:p></o:p>

#003 Constructor ctor = c.getConstructor(pTypes);<o:p></o:p>

#004 //指定parameter list,便可获得特定之ctor<o:p></o:p>

#005<o:p></o:p>

#006 Object obj = null;<o:p></o:p>

#007 Object[] arg = new Object[] {3.14159, 125}; //自变量<o:p></o:p>

#008 obj = ctor.newInstance(arg);<o:p></o:p>

#009 System.out.println(obj);<o:p></o:p>

7:动态生成“Class object 对应之class”的对象实体;自变量以Object[]表示。<o:p></o:p>

<o:p> </o:p>

运行时调用methods<o:p></o:p>

这个动作和上述调用“带参数之ctor”相当类似。首先准备一个Class[]做为ctor的参数类型(本例指定其中一个是String,另一个是Hashtable),然后以此为自变量调用getMethod(),获得特定的Method object。接下来准备一个Object[]放置自变量,然后调用上述所得之特定Method objectinvoke(),如8。知道为什么索取Method object时不需指定回返类型吗?因为method overloading机制要求signature(署名式)必须唯一,而回返类型并非signature的一个成份。换句话说,只要指定了method名称和参数列,就一定指出了一个独一无二的method<o:p></o:p>

<o:p> </o:p>

#001 public String func(String s, Hashtable ht)<o:p></o:p>

#002 {<o:p></o:p>

#003 System.out.println("func invoked"); return s;<o:p></o:p>

#004 }<o:p></o:p>

#005 public static void main(String args[])<o:p></o:p>

#006 {<o:p></o:p>

#007 Class c = Class.forName("Test");<o:p></o:p>

#008 Class ptypes[] = new Class[2];<o:p></o:p>

#009 ptypes[0] = Class.forName("java.lang.String");<o:p></o:p>

#010 ptypes[1] = Class.forName("java.util.Hashtable");<o:p></o:p>

#011 Method m = c.getMethod("func",ptypes);<o:p></o:p>

#012 Test obj = new Test();<o:p></o:p>

#013 Object args[] = new Object[2];<o:p></o:p>

#014 arg[0] = new String("Hello,world");<o:p></o:p>

#015 arg[1] = null;<o:p></o:p>

#016 Object r = m.invoke(obj, arg);<o:p></o:p>

#017 Integer rval = (String)r;<o:p></o:p>

#018 System.out.println(rval);<o:p></o:p>

#019 }<o:p></o:p>

8:动态唤起method<o:p></o:p>

<o:p> </o:p>

运行时变更fields<o:p></o:p>

与先前两个动作相比,“变更field内容”轻松多了,因为它不需要参数和自变量。首先调用ClassgetField()并指定field名称。获得特定的Field object之后便可直接调用Fieldget()set(),如9<o:p></o:p>

<o:p> </o:p>

#001 public class Test {<o:p></o:p>

#002 public double d;<o:p></o:p>

#003<o:p></o:p>

#004 public static void main(String args[])<o:p></o:p>

#005 {<o:p></o:p>

#006 Class c = Class.forName("Test");<o:p></o:p>

#007 Field f = c.getField("d"); //指定field 名称<o:p></o:p>

#008 Test obj = new Test();<o:p></o:p>

#009 System.out.println("d= " + (Double)f.get(obj));<o:p></o:p>

#<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="True" sourcevalue="10" unitname="F">010 f</st1:chmetcnv>.set(obj, 12.34);<o:p></o:p>

#011 System.out.println("d= " + obj.d);<o:p></o:p>

#012 }<o:p></o:p>

#013 }<o:p></o:p>

9:动态变更field 内容<o:p></o:p>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics