java动态代理,为什么代理的方法总是会抛异常?

想问一下各位大神,java动态代理时,如果被代理的方法有返回值,程序就会抛出一个类型不匹配异常,该如何处理?

所做题目如下:

写一个ArrayList类的代理,实现和ArrayList类中完全相同的功能,并可以计算每个方法运行的时间。

但是一直抛ClassCastException异常,自己研究一段时间发现是ArrayList 的.add(E e)方法传回了一个boolean

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

public class Demo {
	public static void main(String[] args) {
		ArrayList<String> al = new ArrayList<>();
		MyInvocationHandler m = new MyInvocationHandler(al);
		List<String> l = (List)Proxy.newProxyInstance(al.getClass().getClassLoader(), al.getClass().getInterfaces(), m);
		l.add("a");
	}
}

class MyInvocationHandler implements InvocationHandler {
	private Object obj;
	//构造方法接收一个对象类
	public MyInvocationHandler(Object obj) {
		this.obj = obj;
	}
	//重写 invoke方法
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		long start = System.currentTimeMillis();
		method.invoke(obj, args);
		//System.out.println("代理执行了");
		long end = System.currentTimeMillis();
		System.out.println("添加完成");
		System.out.println("共耗时:"+(end-start)+"毫秒");
		//默认return null 会造成空指针异常
		return obj;
	}
	
}

自己试着自定义一个类进行代理,无返回值的方法可以正常代理,后来在add(String str)方法里增加了返回值,同样抛出异常

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

public class Demo {
	public static void main(String[] args) {
		//下面这个抛出ClassCastException,确认是被代理方法有返回值造成的
		UserImp ui = new UserImp();
		MyInvocationHandler m = new MyInvocationHandler(ui);
		User u = (User)Proxy.newProxyInstance(ui.getClass().getClassLoader(), ui.getClass().getInterfaces(), m);
		u.add("aaa");
	}
}

class MyInvocationHandler implements InvocationHandler {
	private Object obj;
	//构造方法接收一个对象类
	public MyInvocationHandler(Object obj) {
		this.obj = obj;
	}
	//重写 invoke方法
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		long start = System.currentTimeMillis();
		method.invoke(obj, args);
		//System.out.println("代理执行了");
		long end = System.currentTimeMillis();
		System.out.println("添加完成");
		System.out.println("共耗时:"+(end-start)+"毫秒");
		return obj;
	}
	
}

//User接口//TODO
interface User {
	String[] arr = new String[10];
	public String add(String str);
	public void del();
}
//User的实现类
class UserImp implements User {
	public String add(String str) {
		System.out.println(str);
		arr[0] = str;
		return "aa";
	}
	public void del() {
		System.out.println("删除");

	}
}


kaguya
浏览 2952回答 2
2回答

阿旭_

善用instanceofif (args instanceof type) { type new_name = (type) args; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java