Java 编程的动态性,第 8 部分: 用代码生成取代反射
从本系列前面的文章中,您了解到反射的性能比直接访问要慢许多倍,并了解了用 Javassist 和 Apache
Byte Code Engineering Library (BCEL)进行classworking。Java 顾问 Dennis
Sosnoski 通过演示如何使用运行时 classworking,来用全速前进的生成代码取代反射代码,从而结束他的 Java 编程的动态性
系列。
既然您已经看到了如何使用 Javassist 和 BCEL 框架来进行 classworking (请参阅
本系列以前的一组文章
),
我将展示一个实际的 classworking 应用程序。这个应用程序用运行时生成的、并立即装载到 JVM 的类来取代反射。在综合讨论的过程中,我将引用本系列的前两篇文章,以及对
Javassist 和 BCEL 的讨论,这样本文就成为了对这个很长的系列文章的一个很好的总结。
反射的性能
在
第
2 部分
,
我展示了无论是对于字段访问还是方法调用,反射都比直接代码慢很多倍。这种延缓对于许多应用程序来说不算是问题,但是总是会遇到性能非常关键的情况。在这
种情况下,反射可能成为真正的瓶颈。但是,用静态编译的代码取代反射可能会非常混乱,并且在有些情况下(如在这种框架中:反射访问的类或者项目是在运行时
提供的,而不是作为这一编译过程的一部分提供的),如果不重新构建整个应用程序就根本不可能取代。
Classworking 使我们有机会将静态编译的代码的性能与反射的灵活性结合起来。这里的基本方法是,在运行时,以一种可以被一般性代码使用的方式,构建一个自定义的类,其中将包装对目标类的访问(以前是通过反射达到的)。将这个自定义类装载到
JVM 中后,就可以全速运行了。
设置阶段
清单 1 给出了应用程序的起点。这里定义了一个简单的 bean 类
HolderBean
和一个访问类
ReflectAccess
。访问类有一个命令行参数,该参数必须是一个值为
int
的 bean 类属性的名字(
value1
或者
value2
)。它增加指定属性的值,然后在退出前打印出这两个属性值。
清单 1. 反射一个 bean
public class HolderBean
{
private int m_value1;
private int m_value2;
public int getValue1() {
return m_value1;
}
public void setValue1(int value) {
m_value1 = value;
}
public int getValue2() {
return m_value2;
}
public void
相关文档:
1.面向对象编程的英文缩写是OOP,全称为:Object Oriented Programming,在进行面向对象编程时,方法和变量都写在具体的对象里,并对其成员变量和方法有很好的隐蔽性,对象之间的访问都是通过其接口进行的。
2.继承是发生在类与类之间的,是子类共享父类成员变量和方法的一种模式。
3.面向过程是指在遇到问题的时候,怎.么 ......
本文主要是为开源项目simplejee
写的,但基本还是通用的。
开发java程序最低的要求是有jdk和文本编辑器。不过多数来说我们都会使用一些辅助的文本编辑器(editplus,UltraEdit)甚至
集成开发环境(IDE),如eclipse,IntelliJ
IDEA等,我们放在代码库里的代码并没有限定开发工具,也没有将和开发工具相关的配置文件提交到 ......
java.applet 提供创建Applet的类以及用于Applet和Applet上下文(Applet Context)通信的类。
java.awt 包含所有创建用户接口(界面)、绘制图像的类。
java.awt.color 提供颜色空间的类
java.awt.datatransfer 提供应用内和应用间传输数据的接口和类。
java.awt.dnd 拖拽功能支持类库(拖拽是在许多GUI提供的一种在两个 ......
/**
* 堆排序
*
* */
public void heapSort(double[] a){
double temp;
initCreateHeap(a);
for(int i = a.length - 1; i > 0; i --){
temp = a[0];
a[0] = a[i];
a[i] = temp;
createHeap(a, i, 0);
}
}
/**
* 将数组看成完全二叉树,建立最大堆
* */
private ......