4

我正在尝试在 Java 程序中挂钩其他类的方法,我知道这可以在加载时使用 Java 代理来完成。但是,一旦将 .class 文件加载到 JVM 中,是否有办法做到这一点,类似于在 c++ 中使用 Read/Writeprocessmemory() 挂钩的 dll?谢谢你。

4

1 回答 1

2

如果你的意思是方法拦截,有两种选择

1) java.lang.reflect.Proxy。下面的测试为列表创建代理并拦截其方法调用。请注意,它仅适用于接口。

class Handler implements java.lang.reflect.InvocationHandler {
    Object target;

    Handler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before " + method.getName());
        Object res = method.invoke(target, args);
        System.out.println("After " + method.getName());
        return res;
    }
}
List list = new ArrayList();
List proxy = (List) Proxy.newProxyInstance(Test.class.getClassLoader(),
        new Class[] { List.class }, new Handler(list));
proxy.add(1);

印刷

Before add
After add

2)面向方面的编程。在我看来,开始使用它的最简单方法是 Spring http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/aop.html

于 2012-12-26T05:45:40.990 回答