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)
当你使ClassCastException
实施HelloWorldImp
时HelloWorld
消失:
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());
失败
如果您将类A的对象类型转换为类B的对象并且它们不是兼容类型,那么您将获得强制转换异常情况。例如。
Object obj = Integer.valueOf(100);
String value = (String)obj; // ClassCastException occurs.