Dynamic proxy
- ProxyDemo class:
package bull10.Proxy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.junit.Test;
public class ProxyDemo {
@Test
public void method() {
List<String> list1 = new ArrayList<String>();
list1.add("abc");
String s1 = list1.get(0);
System.out.println(s1);
/*
* java.lang.UnsupportedOperationException
* 不支持操作异常,当前list2不支持修改,所以不能add.
*/
List<String> list2 = MyCollections.unmodifiableList(list1);
String s2 = list2.get(0);
System.out.println(s2);
list2.add("def");
System.out.println(list2.size());
}
}
结果:
abc
abc
(Junit异常:java.lang.UnsupportedOperationException: 不允许进行添加操作!)
- MyCollections class:
package bull10.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.List;
public class MyCollections {
@SuppressWarnings({"unchecked","rawtypes"})
public static List<String> unmodifiableList(final List<String> list) {
//(目标类)list 所有功能都有
//(代理类)proxyList 希望不能进行增删改,只能查询,这里实现proxyList比List少了add功能。
//参数一:ClassLoader,动态代理需要一个类加载器
ClassLoader loader = MyCollections.class.getClassLoader();
//参数二:Class[] interfaces,需要与目标类接口保持一致
Class[] interfaces = list.getClass().getInterfaces();
List<String> proxyList = (List<String>) Proxy.newProxyInstance(loader, interfaces, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//代理类的方法每被调用一次,处理类invoke方法都执行一次。
//处理(增强)--不允许添加
//1.获得方法名
String methodName = method.getName();
//2.方法是add时抛异常
if(methodName.equals("add")) {
throw new UnsupportedOperationException("不允许进行添加操作!");
}
//处理类中直接执行目标类中对应的方法
return method.invoke(list, args);
}
});
//返回代理类
return proxyList;
}
}