Почему ClassCastException? - PullRequest
       0

Почему ClassCastException?

0 голосов
/ 09 сентября 2018
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.HelloWorld в com.lean.ssm.chapter2.proxy1.ProxyTest.testJdkProxy (ProxyTest.java:8) at com.lean.ssm.chapter2.proxy1.ProxyTest.main (ProxyTest.java:5)

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

ClassCastException исчезает, когда вы делаете HelloWorldImp орудие HelloWorld:

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

Проблема в методе bind(Object).

Согласно Proxy.newProxyInstance (ClassLoader, Class [], InocationHandler) документы . Второй параметр -

список интерфейсов для реализации прокси-класса

Поскольку HelloWorldImp не реализовывал ничего, вызов target.getClass().getInterfaces() возвратил пустой массив, а сгенерированный прокси не реализовал интерфейс HelloWorld. Итак, актерский состав

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

1024 * не удалось *

0 голосов
/ 09 сентября 2018

если вы типизируете объект класса A в объект класса B, а они не являются совместимым типом, тогда вы получаете исключение в случае приведения. например.

Object obj = Integer.valueOf(100);
String value = (String)obj;  // ClassCastException occurs.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...