A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kevinmesss.tz 中级黑马   /  2014-4-18 07:08  /  1135 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.javase.proxy;

  2. import java.lang.reflect.*;
  3. import java.util.*;

  4. public class ProxyDemo {

  5.         public static void main(String[] args) {
  6.                 final ArrayList<String> alist = new ArrayList<>();
  7.                
  8.                 ArrayList<String> proxy = (ArrayList<String>) Proxy.newProxyInstance(alist.getClass().getClassLoader(), alist.getClass().getInterfaces(), new InvocationHandler() {
  9.                         public Object invoke(Object proxy, Method method, Object[] args)
  10.                                         throws Throwable {
  11.                                 System.out.println("invokee............");
  12.                                 method.invoke(alist, args);
  13.                                 System.out.println("huhuhu");
  14.                                 return true;
  15.                                
  16.                         }
  17.                 });
  18.                
  19.                 proxy.add("test");
  20.         }
  21. }
复制代码
为什么会有com.sun.proxy.$Proxy0 cannot be cast to java.util.ArrayList异常
换成Collection<String>就可以?(后面还是new ArrayList())
Object不能强转成ArrayList吗?

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

3 个回复

倒序浏览
楼主这边要清楚的是,代理对象不是原来的对象了。
你用Collection可行,是因为Collection是一个接口。
并且:List接口继承于Collection。
代理的运行并不关心你原来的方法是怎么实现的,这里只关心有哪些方法,方法前、方法后需要通过代理增加哪些操作。
回复 使用道具 举报
你只是实现了ArrayList类的所有接口的方法,但是ArrayList类还有它自己的方法,是接口中没有的,这样你生成的代理类并不是ArrayList的子类,所以不能转换成ArrayList.
如果想要生成一类的子类当代理,可以使用第三方的Cglib来实现
需要了解其中的一个类和一个接口就可最做了
MethodInterceptor 方法回调接口
Enhancer 生成代理对象的类
用法和proxy类似
Enhancer enhancer = new Enhancer(); // 实例化类
                enhancer.setSuperclass(clazz);将要代理的类的字节码传入,就是父类
enhancer.setCallback(new MethodInterceptor(){} );//传入一个回调器实例,类似于InvocationHandler
enhancer.create();创建实例用Object接收,可以强转为父类型

回复 使用道具 举报
菜鸟 路过瞅瞅~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马