关于JAVA动态代理出现ClassCastException异常的问题

今天在实现一个简单的动态代理的时候莫名其妙出现了这样一个报错

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 loginTempLoginImplment 是一个接口实现类,接口是loginInterface还有MyInvocationHandlerInvocationHandler接口的实现类

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返回的是实现类所实现的那个接口,而不是这个实现类,所以改正过后就没有什么问题了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章