我试图使一个简单的动态代理示例工作但没有成功。我认为我做错了什么,但是阅读一些 java 模块图和代理图并没有帮助我理解...... 该代码非常基本,包含接口、其实现、调用处理程序以及具有运行示例的 main 方法的类:
package com.example.proxy;
public interface Foo {
public String foo(String s);
}
package com.example.proxy;
public class FooImpl implements Foo{
@Override
public String foo(String str) {
return str;
}
}
package com.example.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class FooProxy implements InvocationHandler{
Foo foo;
public FooProxy(Foo s){
this.foo = s;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("%#$%#5^$@5^$@5^ PROXY");
return ("[proxied] "+method.invoke(this.foo, args));
}
}
package com.example.proxy;
import java.lang.reflect.Proxy;
public class MainTest {
public static void main(String [] args){
Foo o = (Foo)Proxy.newProxyInstance(Foo.class.getClassLoader(), Foo.class.getInterfaces(), new FooProxy(new FooImpl() ));
}
}
运行主测试产量:
Exception in thread "main" java.lang.ClassCastException: class jdk.proxy1.$Proxy0 cannot be cast to class com.example.proxy.Foo (jdk.proxy1.$Proxy0 is in module jdk.proxy1 of loader 'app'; com.example.proxy.Foo is in unnamed module of loader 'app')
at com.example.proxy.MainTest.main(MainTest.java:10)
我尝试在 module-info.java 中显式公开 com.example.proxy,尝试一些打开等,但没有任何帮助,所以我认为我没有得到任何东西。 谁能帮我指出正确的方向 谢谢!
根据Sweeper的建议,我们应该使用
new Class<?>[] { Foo.class }
代替Foo.class.getInterfaces()
如果此 Class 对象表示未实现任何接口的类或接口,则该方法返回长度为 0 的数组。
因此
Foo.class.getInterfaces()
实际上返回一个空数组。