java动态代理问题

标签 java proxy

我正在学习java动态代理,这是我的代码:

//interface  Move.java
 public interface Move {
    public void testMove();
}

然后是实现类

public class Tank implements Move{
    public void testMove() {
        System.out.println("test in Tank");
    }
}

后跟

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;


public class MoveHandler implements InvocationHandler{
    private Object target;

    public MoveHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
        System.out.println("in MoveHandler");
        Object ret;
        try {
            ret = method.invoke(target, args);
        }catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
        System.out.println("after MoveHandler");
        return ret;
    }
}

测试类

public class Main {
    public static void main(String[] args) {
        Move test = new Tank();
        MoveHandler proxy = new MoveHandler(test);
        Move real = (Move) Proxy.newProxyInstance(test.getClass().getClassLoader(), test.getClass().getInterfaces(), proxy);
        real.testMove();
    }
}

当我运行主类时,我可以获得正确的结果。如果我将 method.invoke(target, args) 更改为 method.invoke(proxy, args),将会出现数千行异常和错误。 invoke(Object proxy, Method method, Object[] args) 中参数 proxy 的用法是什么?如何正确使用它?

最佳答案

代理参数是由 Proxy.newProxyInstance() 返回的对象,在该对象上调用实际方法 (testMove())。您通常不需要它,但例如,可能有必要知道代理实现了哪些接口(interface)。

在此参数上调用方法是一个非常糟糕的主意,因为它基本上执行递归方法调用:您调用代理上的方法,该方法调用调用处理程序,该方法调用代理上的方法,后者调用处理程序,等等

关于java动态代理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26571227/

相关文章:

c++ - 通过防火墙代理将 Arduino 连接到 Internet

java - Maven:在 pom.xml 中编译外部依赖项

java - 连接未返回 tomcat 池

java - 日志管理器和垃圾收集器

linux - 限制对所有域的访问,但一个在系统/代理级别

python - 更改 IP 地址 Python Selenium

python-2.7 - 如何在 Ubuntu 上安装 Graphlab Create?

java - 如何在 Java Swing 中对齐组件?

java - 如何使用 JaXB 获取验证事件?

ruby-on-rails - Mechanize::响应代码错误:501