publicint add(int x, int y) {
returnx + y;
}
publicvoid shout(String name) {
System.out.println('myname is' + name);
}
publicstatic void main(String[] args) throws Exception {
//创建该类的一个对象
Classclazz = InvokeMethod.class;
Objectobj = clazz.newInstance();
//调用该对象的add方法
Methodamethod = clazz.getMethod('add', new Class[]
{int.class,int.class });
Objectresult = amethod.invoke(obj, new Object[] { 5, 7 });
System.out.println(result);
//调用该对象的shout方法
Methodsmethod = clazz.getMethod('shout', new Class[] { String.class });
smethod.invoke(obj,new Object[] { 'lkl' });
//以上语句作用相当于直接执行如下语句
//InvokeMethod im=new InvokeMethod();
//int sum=im.add(5, 7);
//System.out.println(sum);
//im.shout('lkl');
}
}
4. 运行时动态创建数组并操作数组元素在java.lang.reflect包下还提供了一个Array类,该类包括一系列static方法,通过这些方法可以来动态的创建数组,给数组元素赋值,取出数组元素值等。
Array提供的主要方法如下:
Østatic ObjectnewInstance(Class componentType, int[] dimensions) :创建一个具有指定的组件类型和维度的新数组。
Østatic xxx getXxx(Objectarray, int index):以 xxx形式返回指定数组对象array中第index个元素的值。其中xxx代表八个基本数据类型。如果元素类型是引用类型,则直接使用static Object get(Object array, int index)方法。
Østatic void setXxx(Objectarray, int index ,xxx val):给数组对象array中第index个元素赋值val。其中xxx代表八个基本数据类型。如果元素类型是引用类型,则直接使用static void set(Objectarray, int index ,Object val)方法。
public class ArrayTest {
publicstatic void main(String[] args) throws Exception {
//创建一个含有10个元素的整型数组
Classclazz = Class.forName('java.lang.Integer');
Objectarr = Array.newInstance(clazz, 10);
//给第五个元素赋值
Array.set(arr,5, 20);
//取出第五个元素值并输出
Objectelem = Array.get(arr, 5);
System.out.println(elem);
//以上语句相当于执行如下语句
//int arr[]=new int[10];
//arr[5]=20;
//System.out.println(arr[5]);
}
}
四、反射的优点和缺点反射是提高Java程序的灵活性和可扩展性至关重要的技术,它使得Java软件系统具有自适应能力,实现程序的动态演进。它提供一种动态链接程序组件的多功能方法,允许程序创建和控制任何类的对象(根据安全性限制),无需提前硬编码目标类。这些特性使得反射特别适用于创建以非常普通方式与对象协作的库。例如,反射经常在持续存储对象为数据库、XML或其它外部格式的框架中使用。Java 反射非常有用, 如软件测试、JavaBean、EJB等, 它使类和数据结构能按名称动态检索相关信息, 并允许在运行着的程序中操作这些信息。Java这一特性非常强大, 并且是其它一些常用语言, 如C、C++、Fortran 等都不具备的。充分发掘Java 中的这一特性, 可以编写出灵活、低耦合、高重用的组件。目前许多流行的开源框架例如Struts、Hibernate、Spring在实现过程中都采用了Java反射技术。
但反射有两个缺点。第一个是性能问题。用于字段和方法接入时反射要远慢于直接代码。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于直接执行相同的操作。免费论文网。因此Java反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。
另外一个缺点是使用反射会模糊程序内部实际要发生的事情。程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术会带来维护问题。反射代码比相应的直接代码更复杂。解决这些问题的最佳方案是保守地使用反射——仅在它可以真正增加灵活性的地方——记录其在目标类中的使用。
五、总结反射是提高Java程序的灵活性和可扩展性至关重要的技术,它使得Java软件系统具有自适应能力,实现程序的动态演进,是JAVA 成为动态语言的一个重要特性。理解Java反射技术的内部机制,对于我们理解目前流行的开源框架Struts、Hibernate、Spring等的实现机制是很有帮助的,同时在开发中应用Java反射技术,可以提高软件的灵活性、重用性,降低耦合性。
参考文献
[1] 孙卫琴·《Java网络编程精解》·电子工业出版社,2007年3月
[2] 李刚·《疯狂Java讲义》·电子工业出版社,2008年10月
[3] 侯捷·Java反射机制·程序员,2004年10月
[4] 尹松强,傅鹂·Java反射机制探究·软件导刊,2008年11月
[5] 王开, 谭翼, 周兰江·JAVA中反射机制浅析及应用·计算机教育,2007年01月
3/3 首页 上一页 1 2 3 |