今天在实现一个简单的动态代理的时候莫名其妙出现了这样一个报错
Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to org.cn.implment.LoginImplment
at org.cn.test.test.main(test.java:14)
源代码
package org.cn.test;
import java.lang.reflect.Proxy;
import org.cn.Proxy.MyInvocationHandler;
import org.cn.implment.LoginImplment;
import org.cn.implment.loginInterface;
public class test {
public static void main(String[] args) {
LoginImplment loginTemp=new LoginImplment();
MyInvocationHandler mInvocationHandler=new MyInvocationHandler(loginTemp);
LoginImplment login=(LoginImplment) Proxy.newProxyInstance(loginTemp.getClass().getClassLoader(),
loginTemp.getClass().getInterfaces(), mInvocationHandler);
login.Login();
}
}
这里面LoginImplment loginTemp
LoginImplment 是一个接口实现类,接口是loginInterface
还有MyInvocationHandler
是InvocationHandler
接口的实现类
MyInvocationHandler源码:
package org.cn.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler{
private Object obj;
public MyInvocationHandler() {
// TODO Auto-generated constructor stub
}
public MyInvocationHandler(Object obj) {
this.obj=obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("过滤");
Object reluset=method.invoke(this.obj, args);
System.out.println("登录结束");
return reluset;
}
}
代码大概看起来是没问题,但就是报错,最后查看文档发现
看完后才猛然惊觉
改后代码:
package org.cn.test;
import java.lang.reflect.Proxy;
import org.cn.Proxy.MyInvocationHandler;
import org.cn.implment.LoginImplment;
import org.cn.implment.loginInterface;
public class test {
public static void main(String[] args) {
LoginImplment loginTemp=new LoginImplment();
MyInvocationHandler mInvocationHandler=new MyInvocationHandler(loginTemp);
//注意这一块是关键,要用实现类所实现的那个接口,而不是直接用实现类
loginInterface login=(loginInterface) Proxy.newProxyInstance(loginTemp.getClass().getClassLoader(),
loginTemp.getClass().getInterfaces(), mInvocationHandler);
login.Login();
}
}
Proxy.newProxyInstance返回的是实现类所实现的那个接口,而不是这个实现类,所以改正过后就没有什么问题了