黑马程序员技术交流社区

标题: 反射,动态代理,类加载器 [打印本页]

作者: 朱明仁    时间: 2015-3-12 00:20
标题: 反射,动态代理,类加载器
本帖最后由 朱明仁 于 2015-3-12 00:45 编辑

通过动态代理,当然还有反射和类加载,实现在ArrayList的每个方法前面加上输出一句话
代理类实例该怎么用?程序猿们借点智慧

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.*;
class DynamicSubject implements InvocationHandler {
        private Object sub;

        public DynamicSubject(Object obj) {
                this.sub = obj;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                        throws Throwable {
                // TODO Auto-generated method stub
                System.out.println("Method:" + method + ",Args:" + args);//本题的目的:在每一个函数输出前面加上这句话
                method.invoke(sub, args);// 调用的是sub.Request(args)输出
                return null;
        }
}

// 通过Proxy.newProxyInstance构建代理对象
public class Prox {

        public static void main(String[] args)throws Exception {
                // TODO Auto-generated method stub
                // RealSubject realSub = new RealSubject();
                ArrayList<Integer> realSub = new ArrayList<Integer>();
                InvocationHandler handler = new DynamicSubject(realSub);// 实现的realSub
                @SuppressWarnings("unchecked")
                List<Integer> sub = (List<Integer>) Proxy.newProxyInstance(handler.getClass()
                                .getClassLoader(), realSub.getClass().getInterfaces(),// 传入realSub的字节码
                                handler);
                System.out.println(sub.getClass());// 输出class $Proxy0
                Integer t=new Integer(2);
                sub.add(t);    // 这个地方出现问题,add(Unknown Source)
                //实在不知道怎么办了,如果是自己写的接口和实现就没有问题,这里用的接口是List,实现是ArrayList
               
                Integer a=sub.get(0);
                System.out.println(a);
        }

        

}


作者: fanshuai    时间: 2015-3-12 10:24
package cn.heima.test2;

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


public class Demo {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                ArrayList target=new ArrayList();
                Advice_1 advice=new MyAdvice_1();
                List proxy=(List)getProxy(target,advice);
                proxy.add(232);
        }
        public static Object getProxy(final ArrayList target,final Advice_1 advice){
                Object proxy=Proxy.newProxyInstance(target.getClass().getClassLoader(),
                                target.getClass().getInterfaces(),
                                new InvocationHandler(){

                                        @Override
                                        public Object invoke(Object proxy, Method method,
                                                        Object[] args) throws Throwable {
                                                // TODO Auto-generated method stub
                                                advice.beforeMethod();
                                                Object retVal=method.invoke(target, args);
                                                return retVal;
                                        }
                       
                });
                return proxy;
        }

}
class MyAdvice_1 implements Advice_1{
       
        public void beforeMethod(){
                System.out.println("方法前输出。。。。。");
        }
       
}
interface Advice_1{
        public abstract void beforeMethod();
}
作者: 朱明仁    时间: 2015-3-12 11:11
fanshuai 发表于 2015-3-12 10:24
package cn.heima.test2;

import java.lang.reflect.InvocationHandler;

谢谢大神,看懂了,虽然还不是彻底明白动态代理,但问题解决了,




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