为什么ClassCastException?

问题描述 投票:0回答:2
package com.lean.ssm.chapter2.proxy1;

public interface HelloWorld {

    void sayHelloWorld();

}
package com.lean.ssm.chapter2.proxy1;

public class HelloWorldImp {
    public void sayHelloWorld() {
        System.out.println("hello");
    }

}
package com.lean.ssm.chapter2.proxy1;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkProxyExample implements InvocationHandler {

    private Object target = null; 

    public Object bind(Object target) {  
        this.target = target;
        return
                Proxy.newProxyInstance(target.getClass().getClassLoader(),
                        target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("进入代理逻辑方法");
        System.out.println("调度真实对象之前的服务");
        Object obj = method.invoke(target, args);
        System.out.println("调度真实对象之后的服务");
        return obj;
    }
}
package com.lean.ssm.chapter2.proxy1;

public class ProxyTest {
     public static void main(String[] args) {
            testJdkProxy();}
        private static void testJdkProxy() {
            JdkProxyExample jdk = new JdkProxyExample();
            HelloWorld proxy = (HelloWorld) jdk.bind(new HelloWorldImp());
            proxy.sayHelloWorld();}

}

控制台:线程“main”中的异常java.lang.ClassCastException:com.sun.proxy。$ Proxy0不能在com.lean.ssm.chapter2.proxy1.ProxyTest中强制转换为com.lean.ssm.chapter2.proxy1.HelloWorld。 com.lean.ssm.chapter2.proxy1.ProxyTest.main上的testJdkProxy(ProxyTest.java:8)(ProxyTest.java:5)

java exception
2个回答
0
投票

当你使ClassCastException实施HelloWorldImpHelloWorld消失:

class HelloWorldImp implements HelloWorld {
    @Override
    public void sayHelloWorld() {
        System.out.println("hello");
    }
}

问题出在bind(Object)方法中。

根据Proxy.newProxyInstance(ClassLoader, Class[], InocationHandler) docs。第二个参数是

要实现的代理类的接口列表

由于HelloWorldImp没有实现任何,target.getClass().getInterfaces()调用返回空数组,生成的代理没有实现HelloWorld接口。所以投了

HelloWorld proxy = (HelloWorld) jdk.bind(new HelloWorldImp()); 

失败


-1
投票

如果您将类A的对象类型转换为类B的对象并且它们不是兼容类型,那么您将获得强制转换异常情况。例如。

Object obj = Integer.valueOf(100);
String value = (String)obj;  // ClassCastException occurs.
© www.soinside.com 2019 - 2024. All rights reserved.