写一个 ArrayList 的动态代理类(变量修饰问题),arraylist变量
分享于 点击 29137 次 点评:145
写一个 ArrayList 的动态代理类(变量修饰问题),arraylist变量
1. final List<String> list = new ArrayList<String>();
2.
3. List<String> proxyInstance =
4. (List<String>)Proxy.newProxyInstance(list.getClass().getClassLoader(),
5. list.getClass().getInterfaces(),
6. new InvocationHandler() {
7.
8. @Override
9. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
10. return method.invoke(list, args);
11. }
12. });
13. proxyInstance.add("你好");
14. System.out.println(list);
因为改动态代理方法使用的是匿名内部类实现的,所以上面的list对象使用final修饰(被final修饰其地址值不变,才可以在匿名内部类中被使用)
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKProxy implements InvocationHandler {
private Object target;
public JDKProxy (Object target){
this.target=target;
}
public Object createProxy(){
//得到目标的classload
ClassLoader classLoader = target.getClass().getClassLoader();
//得到目标对象实现的接口数组
Class[] interfaces = target.getClass().getInterfaces();
return Proxy.newProxyInstance(classLoader, interfaces, this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("瞎搞");
return method.invoke(target, args);
}
在spring框架中使用JDK动态代理实现,可以使用实现接口的方式,没有使用匿名内部类,则变量可以不使用final修饰,改例子中使用的是private
}
相关文章
- 暂无相关文章
用户点评