1

ここでプロキシに関するサンプルを読みました:http: //docs.oracle.com/javase/1.3/docs/guide/reflection/proxy.html

ご覧のとおり、「invoke」メソッドのパラメータ「proxy」は使用されていません。プロキシは何に使用されますか?ここで使用しないのはなぜですか:result = m.invoke(proxy、args); ?

public class DebugProxy implements java.lang.reflect.InvocationHandler {

private Object obj;

public static Object newInstance(Object obj) {
return java.lang.reflect.Proxy.newProxyInstance(
    obj.getClass().getClassLoader(),
    obj.getClass().getInterfaces(),
    new DebugProxy(obj));
}

private DebugProxy(Object obj) {
this.obj = obj;
}

public Object invoke(Object proxy, Method m, Object[] args)
throws Throwable
{
    Object result;
try {
    System.out.println("before method " + m.getName());
    result = m.invoke(obj, args);
    } catch (InvocationTargetException e) {
    throw e.getTargetException();
    } catch (Exception e) {
    throw new RuntimeException("unexpected invocation exception: " +
                   e.getMessage());
} finally {
    System.out.println("after method " + m.getName());
}
return result;
}

}

4

1 に答える 1

2

プロキシは、JVMの「動的プロキシ」クラスによって特別に構築されます。コードはそのメソッドを直接呼び出すことはできません。これについて別の考え方をすると、プロキシは「インターフェイス」であり、そのメソッドを呼び出すとメソッドを呼び出すことに対応するpublic Object invoke(Object proxy, Method m, Object[] args)ため、プロキシでのメソッドの呼び出しは無限ループで終了します。

于 2012-05-15T15:11:30.407 に答える