JDK动态代理过程中报错interface ** is not visible from class loader

本文分析了一段使用JDK动态代理实现的代码片段出现的问题,主要原因是错误地使用了类加载器,导致指定接口不可见。文章详细解释了类加载器的工作原理,并给出了正确的代码实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

出现这种情况提示也比较明确 就是传入参数中的ClassLoader并没有找到 传入参数的类 附上报错的代码

public class JdkProxyUtil {

    public static<T> T getProxy(Class<T> clazz, final ICacheAdapter adapter) {
        System.out.println(clazz.getClass().getClassLoader()); //输出为null 这是BootStrapClassLoader加载的
        System.out.println(clazz.getClass().getName()); //输出java.lang.Class
        return (T)Proxy.newProxyInstance(clazz.getClass().getClassLoader(), new Class[]{clazz.getInterfaces()[0]}, new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable,RuntimeException {
                String name = method.getName();
                Class<?>[] parameterTypes = method.getParameterTypes();
                Method declaredMethod = adapter.getClass().getDeclaredMethod(name, parameterTypes);
                if (declaredMethod == null) {
                    throw new RuntimeException("适配器中找不到适配的方法");
                }
                return declaredMethod.invoke(adapter, args);
            }
        });
    }
}

错误原因就是newProxyInstance方法中的第一个参数多了一个.getClass()  手快了 以为传进来的是一个相应的类的Object对象

这样获取的就是java.lang.Class的类加载器 也就是BootStrapClassLoader 而明显我们项目中的的class文件的加载器是AppClassLoader 所以BootStrapClassLoader不能获取到相应的接口的类 报错interface ** is not visible from class loader

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值