《深入理解Java虚拟机 4》类加载与执行子系统的案例与实战

本文介绍了如何使用Retrotranslator工具跨越JDK版本,以及通过Java虚拟机实现远程执行功能的实战案例。文章详细展示了如何编译和执行服务器上的临时代码,以及如何处理类加载和执行子系统,确保在不同JDK版本下运行。同时,讨论了在不改变原程序的情况下,实现自由度高的临时代码执行,并提供了相关的类加载器和字节码修改的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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代码的执行结果?

3、实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值