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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 雷楚光 中级黑马   /  2012-2-27 16:41  /  1647 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么我Class proxycClass=Proxy.getProxyClass(ArrayList.class.getClassLoader(), ArrayList.class);
                System.out.println(proxycClass);
不能对它进行直接代理 ,提示说不是一个接口。
只有接口才能实现代理吗?

3 个回复

倒序浏览
你的代码不完整,无法知道具体什么错误,参考下面代码:

package hh;

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

class Hello {

        @SuppressWarnings("unchecked")
        public static void main(String[] args) {
                List<Object> proxy1 = new ArrayList<Object>();
                List<Object> proxy = (List<Object>) Hello.getProxy(proxy1);
                proxy.add("helen");
                proxy.add("never");
                 proxy.add("for");
                 proxy.remove(1);
                System.out.println(proxy);
        }

        private static Object getProxy(final Object target) {

                class myInvocationHandler implements InvocationHandler {
                        private Object obj;

                        myInvocationHandler(Object obj) {
                                this.obj = obj;
                        }

                        public Object invoke(Object proxy, Method method, Object[] args)
                                        throws Throwable {
                                long beginTime = System.currentTimeMillis();
                                Object ret = method.invoke(obj, args);
                                long endTime = System.currentTimeMillis();
                                System.out.println(method.getName() + "运行时间"
                                                + (endTime - beginTime));

                                return ret;
                        }

                }

                Object proxy = Proxy.newProxyInstance(target.getClass()
                                .getClassLoader(), new Class[] { List.class },
                                new myInvocationHandler(target));

                return proxy;

        }

}

       
回复 使用道具 举报
list 还是接口  要是你用 ArrayList他就不行了  代理为什么必须用接口类
回复 使用道具 举报
补充一点,java的Proxy只能对接口进行动态代理,但是 可以使用CGLIB包 来实现对类的动态代理。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马