黑马程序员技术交流社区

标题: 如何生成动态代理举例说明? [打印本页]

作者: simonqian    时间: 2013-6-3 15:16
标题: 如何生成动态代理举例说明?
本帖最后由 simonqian 于 2013-6-4 21:43 编辑

是不是用反射才能生成动态代理呀?
作者: tshch1989    时间: 2013-6-3 16:22
不需要你写出类,只需要你提供类加载器和实现的接口和要代理目标程序执行的代码即可,详细请参照java.lang.reflect包下的Proxy类
作者: 贺靖轩    时间: 2013-6-3 22:40
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即为创建的代理类,本质一样,只是表现方式有所不同

作者: 曹睿翔    时间: 2013-6-4 08:48
友情提醒:问题解决的话,就再次编辑,及时改为已解决,方便大家查阅





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2