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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© simonqian 中级黑马   /  2013-6-3 15:16  /  1135 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 simonqian 于 2013-6-4 21:43 编辑

是不是用反射才能生成动态代理呀?

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

3 个回复

倒序浏览
不需要你写出类,只需要你提供类加载器和实现的接口和要代理目标程序执行的代码即可,详细请参照java.lang.reflect包下的Proxy类

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
package com.itheima.day3;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;

public class PorxyTest {
    public static void main(String[] args) throws Exception
    {
        Class clazzProxy = Proxy.getProxyClass(Collection.class
                .getClassLoader(), Collection.class);
        System.out.println(clazzProxy.getName());


        Constructor con=clazzProxy.getConstructor(InvocationHandler.class);
        
        class MyInvocationHandler1 implements InvocationHandler
        {

            @Override
            public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
                // TODO Auto-generated method stub
                return null;
            }
            
        }
        
        Collection proxy1=(Collection)con.newInstance(new MyInvocationHandler1());
        
        System.out.println(proxy1);
        
        proxy1.clear();

            
        Collection proxy2=(Collection)con.newInstance(new InvocationHandler(){
            @Override
            public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
                // TODO Auto-generated method stub
                return null;
            }
        });
        
       Collection proxy3=(Collection)Proxy.newProxyInstance(        
                Collection.class.getClassLoader(),
                new Class[]{Collection.class},
               new InvocationHandler(){
                    ArrayList target=new ArrayList();
                    @Override
                    public Object invoke(Object proxy, Method method,
                            Object[] args) throws Throwable {
                        long startTime=System.currentTimeMillis();
                        Object returnVal=method.invoke(target, args);
                        long endTime=System.currentTimeMillis();
                        System.out.println(startTime+"-->"+endTime);
                        System.out.println(method.getName()+"..."+(endTime-startTime));
                        return returnVal;
                    }
                }
           );
proxy1,proxy2,proxy3即为创建的代理类,本质一样,只是表现方式有所不同

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 赞一个!

查看全部评分

回复 使用道具 举报
友情提醒:问题解决的话,就再次编辑,及时改为已解决,方便大家查阅
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马