运行时生成instances<o:p></o:p>
欲生成对象实体,在Reflection 动态机制中有两种作法,一个针对“无自变量ctor”,<o:p></o:p>
一个针对“带参数ctor”。图6是面对“无自变量ctor”的例子。如果欲调用的是“带参数ctor“就比较麻烦些,图7是个例子,其中不再调用Class的newInstance(),而是调用Constructor 的newInstance()。图7首先准备一个Class[]做为ctor的参数类型(本例指定为一个double和一个int),然后以此为自变量调用getConstructor(),获得一个专属ctor。接下来再准备一个Object[] 做为ctor实参值(本例指定3.14159和125),调用上述专属ctor的newInstance()。<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 object的invoke(),如图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内容”轻松多了,因为它不需要参数和自变量。首先调用Class的getField()并指定field名称。获得特定的Field object之后便可直接调用Field的get()和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>
分享到:
相关推荐
### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射机制相关的题目。这是因为Java反射机制不仅是Java语言的一项重要特性,也是理解Java动态特性的关键所在。通过本文,我们将深入探讨Java反射...
JAVA反射机制应用 JAVA反射机制是JAVA语言中的一种动态机制,它能够在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。这种动态获取的信息以及动态...
java反射机制源码java反射机制源码java反射机制源码
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...
Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...
### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的...
Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。这种机制使得Java具有高度的灵活性和动态性,可以在编译时未知类的情况下进行类的加载、实例化、方法调用等操作...
Java反射机制笔记 Java反射机制是Java语言中一个强大的功能,它允许程序在运行时检查和修改其自身的结构和行为。通过Java反射机制,我们可以在运行时获取类的信息,包括类的成员变量、方法、构造方法等,并可以动态...
java反射机制核心代码,小弟一直弄不明白,怎么通过反射来调用私有成员方法,看了这个后,你可以随心调用private方法,和属性,记得添加setAccessable(true),哦,要不还是不行,如:method.setAccessable(true);
Java反射机制是Java语言提供的一种强大的能力,它允许我们在运行时检查类的信息并动态地创建和操作对象。这种机制使得程序具有更高的灵活性和扩展性,尤其是在框架开发中有着广泛的应用。 首先,我们要理解反射的...
### Java反射机制详解 #### 一、反射机制是什么 反射机制是Java编程语言的一个核心特性,它允许程序在运行时动态地获取类的信息,并且能够动态地创建对象和调用对象的方法。简单来说,反射机制使得Java程序可以...
### Java反射机制详解 #### 一、什么是Java的反射机制 Java反射机制是Java语言的一种重要特性,使得Java成为了一种动态性很强的语言。通过反射,可以在程序运行时获取类的信息,包括类名、父类、接口、字段、方法...
通过阅读《候捷的Java精髓》,Java开发者可以深入理解语言的内在机制,提高代码质量,同时也能学习到如何解决实际开发中遇到的问题。书中的例子丰富、实用,便于读者理解和掌握。文件"art-java-b5-20050422-2ch.pdf...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、字段和方法的信息,打破了通常编译时静态绑定的限制。通过反射,我们可以动态地创建对象,调用方法,访问和修改字段值,甚至...
Java反射机制是Java编程语言中的一项核心特性,它允许程序在运行时动态地获取类的信息并进行操作。这使得Java能够在编译后仍然能够灵活地处理类和对象,增强了代码的动态性。在Android应用开发中,反射机制尤其重要...
Java反射机制是Java编程语言中一个强大的特性,它允许运行时的程序动态地获取类的信息并操作类的对象。在Java中,反射主要涉及到`java.lang.Class`类、`java.lang.reflect`包下的类如`Constructor`、`Method`和`...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息,甚至动态地创建对象并调用其方法。通过反射,开发者可以实现高度灵活和动态的代码,这对于框架开发、元编程...