java - 无法通过代理对象调用接口(interface)方法

标签 java

import java.lang.reflect.*;
import java.util.*;
public class proxy {
    public static void main(String[] args) {
        String s ="Happy";
        InvocationHandler handler = new Handler(s);
        Class[] interfaces = s.getClass().getInterfaces();
        Object myproxy = Proxy.newProxyInstance(null,interfaces,handler);
        System.out.println(myproxy.compareTo("hoppu"));
    }
}

class Handler implements InvocationHandler {
    public Handler(Object t) {
        target = t;
    }
    public Object invoke(Object proxy,Method m,Object[] args) throws Throwable {
        System.out.println(m.getName());
        return m.invoke(target,args);
    }
    private Object target;
}

代理对象可以在实现接口(interface)时调用接口(interface)。当我编译此代码时,我收到此错误。

proxy.java:19: cannot find symbol
symbol  : method compareTo(java.lang.String)
location: class java.lang.Object
    System.out.println(proxy.compareTo("hoppu"));
                            ^
1 error

我也尝试过使用 Integer ...同样的错误。

最佳答案

您创建了代理对象,但在调用 compareTo 之前没有将其转换为 Comparable。作为一个 Object,Java 编译器不知道 proxy 不是 Object

根据javadocs for Proxy,返回的代理必须转换为对象支持的接口(interface),而不是原始对象的实际类。 .

Comparable c = (Comparable) Proxy.newProxyInstance(null,interfaces,handler);
System.out.println(c.compareTo("hoppu"));

此外,正如其他人指出的那样,调用类 proxy 和变量 proxy 可能会造成混淆。按照惯例,类名都是大写的,例如“Proxy”,或者更好的是“MyProxy”,以避免与内置 Java Proxy 类发生名称冲突。

关于java - 无法通过代理对象调用接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15031868/

相关文章:

java - 如果目标相同则跳过文件复制

java - 插入排序

java - 将 Java 方法调用传递给 Scala 类/方法

java - 外部实体更改后索引不更新

java - 在java中将一个pojo的所有属性复制到另一个?

java - HandlerInterceptor 不适用于匿名

Java多态问题

java - Lucene 3 迭代所有命中

java - 在转换为 JSON 时忽略 java bean 字段,仅当它的值尚未设置时

java - 在Java中,main方法之后的那些语句的初始化顺序是什么