4

私はJavaプログラムで他のクラスのメソッドをフックしようとしていますが、これはロード時にJavaエージェントで実行できることを知っています。しかし、Read / Writeprocessmemory()を使用してC ++でdllをフックするのと同様に、.classファイルがJVMにロードされたらそれを行う方法はありますか?ありがとうございました。

4

1 に答える 1

2

メソッドインターセプトを意味する場合、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)アスペクト指向プログラミング。私の見解では、それを使い始める最も簡単な方法は、Springhttp://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/aop.htmlです。

于 2012-12-26T05:45:40.990 に答える