Java动态修改静态方法

Java动态修改静态方法

Javassist是一个开源的分析、编辑和创建Java字节码的类库。

环境与配置

  • 添加 jdk/lib/tools.jar 到 classpath
  • 在启动TestMain时添启动参数:
    -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

依赖

<dependency>
    <groupId>javassistgroupId>
    <artifactId>javassistartifactId>
    <version>3.12.1.GAversion>
dependency>

代码实现

package kin.test;

public class Hello {
    public static void say() {
        System.err.println("hello");
    }
}
package kin.test;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.util.HotSwapper;

public class HelloModify {

    public static void run() {
        try {
            String clsName = "kin.test.Hello";

            ClassPool cp = ClassPool.getDefault();
            CtClass cc = cp.get(clsName);
            CtMethod m = cc.getDeclaredMethod("say");

            m.setBody("{ System.out.println(\"Hello World\"); }");

            HotSwapper swap = new HotSwapper(8000);
            swap.reload(clsName, cc.toBytecode());
        } catch (Throwable e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }
}
package kin.test;

public class TestMain {

    public static void main(String[] args)  {
        Hello.say();

        HelloModify.run();

        Hello.say();
    }
}

输出结果

hello
Hello World

你可能感兴趣的:(java)