gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:25:49 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com