使用动态代理和 java17 进行奇怪的类转换 - java 模块异常

问题描述 投票:0回答:1

我试图使一个简单的动态代理示例工作但没有成功。我认为我做错了什么,但是阅读一些 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,尝试一些打开等,但没有任何帮助,所以我认为我没有得到任何东西。 谁能帮我指出正确的方向 谢谢!

java reflection java-17 java-module dynamic-proxy
1个回答
0
投票

根据Sweeper的建议,我们应该使用

new Class<?>[] { Foo.class }
代替
Foo.class.getInterfaces()

来自Class#getInterfaces

如果此 Class 对象表示未实现任何接口的类或接口,则该方法返回长度为 0 的数组。

因此

Foo.class.getInterfaces()
实际上返回一个空数组。

© www.soinside.com 2019 - 2024. All rights reserved.