System.out.println(“hello world”);
}
@Override
public void sayHi() {
System.out.println(“hi world”);
}
}
package jvm;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxy implements InvocationHandler {
Object originalObj;
Object bind(Object originalObj) {
this.originalObj = originalObj;
return Proxy.newProxyInstance(originalObj.getClass().getClassLoader(), originalObj.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(“welcome”);
return method.invoke(originalObj,args);
}
}
package jvm;
public class test {
public static void main(String[] args) {
IHello hel = (IHello) new DynamicProxy().bind(new Hello());
hel.sayHello();
hel.sayHi();
}
}
运行结果
4、Retrotranslator:跨越JDK版本
把JDK1.5 中编写的代码放到 JDK1.4 或 1.3 的环境去部署使用。为了解决这个问题,一种名为“Java逆转移植”的工具(Java Backporting Tools)应运而生,Retrotranslator 是这类工具中较为出色的一个。
二、实战:自己动手实现远程执行功能
我们将使用前面学到的类加载及虚拟机执行子系统的知识去实现在服务端执行临时代码的能力。
1、目标
首先,在实现“在服务端执行临时代码”这个需求之前,先明确一下本次实战的具体目标,我们希望最终的产品是这样的:
(1)不依赖JDK版本,能在目前普通使用的JDK中部署。
(2)不改变原有服务端程序的部署,不依赖任何第三方类库。
(3)不侵入原有程序,即无需改变原程序的任何代码,也不会对原程序运行带来任何影响。
(4)“临时代码”应当具备足够的自由度,不需要依赖特定的类或特定的接口。
(5)“临时代码”的执行结果能返回客户端,执行结果可以包括程序中输出的信息及抛出的异常等。
2、思路
在程序实现的过程中,我们需要解决以下3个问题:
(1) 如何编译提交到服务器的Java代码?
(2) 如何执行编译后的Java代码?
(3) 如何收集Java代码的执行结果?