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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lwy0319 高级黑马   /  2014-4-11 08:00  /  1433 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看了动态代理,不太清楚怎么将代理需求方法插入到真实方法的前后去:
  1. import java.lang.reflect.*;
  2. interface Person{//建立目标接口
  3.         public String say(String name,int age);
  4. }
  5. class Worker implements Person{//建立接口真实实现类
  6.         public String say(String name,int age){
  7.                 return "我叫"+name+","+"我今年"+age+"岁了。";
  8.         }
  9.         //建立获取其代理类的方法
  10.         public static Object getProxy(final Object obj,final Advice advice){
  11.                 Object proxy=Proxy.newProxyInstance(obj.getClass().getClassLoader(),
  12.                                 obj.getClass().getInterfaces(),
  13.                                 new InvocationHandler(){
  14.                         public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
  15.                         advice.beforMethod();
  16.                         Object temp=method.invoke(obj, args);//传入真实实例对象+参数实例变量组
  17.                         advice.afterMethod();
  18.                         //只要让代理类的实例对象调用真实对象的方法就通过此方法
  19.                         return temp;//返回此方法执行后返回的信息
  20.                 }
  21.                 });
  22.                 return proxy;
  23.         }
  24. }
  25. interface Advice{
  26.         public void beforMethod();
  27.         public void afterMethod();
  28. }
  29. class AdviceInstance implements Advice{
  30.         public void beforMethod() {
  31.                 System.out.println("代理开始");
  32.         }
  33.         public void afterMethod() {
  34.                 System.out.println("代理结束");
  35.         }
  36. }
  37. public class ProxyTest1 {
  38.         public static void main(String[] args) {
  39.                 Person pr=(Person)Worker.getProxy(new Worker(), new AdviceInstance());
  40.                 //将目标接口的真实实现类的实例对象传入其中返回一个
  41.                 System.out.println(pr.say("李文宇",28));
  42.                 System.out.println(pr.getClass());
  43.         }               
  44. }
复制代码

        我看视频中讲的也是大概这个样子,我想实现的是执行一行我加的命令,再执行一行真实对象方法,再执行一行我的命令。但是由于 InvocationHandler接口中invoke局部最后一行代码是执行返回真实类方法的返回信息。所以无论我之前添加了哪些,它都是最后才执行真实对象的方法,怎么能在后面插入我的命令呢?

评分

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

查看全部评分

2 个回复

倒序浏览
//这是你的原方法
                public static Object getProxy(final Object obj,final Advice advice){

                        Object proxy=Proxy.newProxyInstance(obj.getClass().getClassLoader(),

                                        obj.getClass().getInterfaces(),

                                        new InvocationHandler(){

                                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{

                                advice.beforMethod();

                                Object temp=method.invoke(obj, args);//传入真实实例对象+参数实例变量组

                                advice.afterMethod();

                                //只要让代理类的实例对象调用真实对象的方法就通过此方法

                                return temp;//返回此方法执行后返回的信息

                        }

                        });

                        return proxy;

                }
//按你要求,修改的代码

public static Object getProxy(final Object obj){

        Object proxy=Proxy.newProxyInstance(obj.getClass().getClassLoader(),

                        obj.getClass().getInterfaces(),

                        new InvocationHandler(){

                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{

                Object temp=method.invoke(obj, args);//传入真实实例对象+参数实例变量组

                //只要让代理类的实例对象调用真实对象的方法就通过此方法

                return temp;//返回此方法执行后返回的信息

        }

        });

        return proxy;

}
    public static void getResult(final Object obj,final Advice advice){
            //代理开始
            advice.beforMethod();
           
           
                getProxy(obj);
            //代理结束
            advice.afterMethod();
    }
                

评分

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

查看全部评分

回复 使用道具 举报
请问getResult在哪里执行呢?而且加在中间的是获取代理类的方法,而不是真实对象执行原方法的语句
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马