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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

静态代理可以在真实主体前后加上一些额外的信息,动态代理的用处求解释说明。
动态代理在使用时还是要在之前声明要使用的类,在传递给代理的方法,这样不是
没有什么意义吗,还不如直接使用静态代理呢?
好像用静态代理更好一些啊
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Collection;
public class ProxyTest {
public static void main(String[] args) {
  Student s = new Student();//这里先要声明一个要代理的对象。
  Person p = (Person) ProxyTest.getProxy(s, new MyAdvice());// 动态代理一个类:Student
  p.setName("shidayong");
  System.out.println(p.getName());
}
public static Object getProxy(final Object obj, final Advice adv) {//参数为动态代理的类对象及额外的内容。
  Object proxy = Proxy.newProxyInstance(obj.getClass().getClassLoader(),
    obj.getClass().getInterfaces(),
    new InvocationHandler() {
     @Override
     public Object invoke(Object proxy, Method method,
       Object[] args) throws Throwable {
      // System.out.println("+++++++++++++++++++++++++++++++++++");
      adv.before(method);
      Object ob = method.invoke(obj, args);
      // System.out.println("-----------------------------------");
      adv.after(method);
      return ob;
     }
    });
  return proxy;
}
}

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1

查看全部评分

5 个回复

倒序浏览
如果只有一个类需要写代理类,是看不出动态代理类的作用的,就像我们用集合类,如果只是简单的增删改查,用Vector和ArrayList没什么区别,但是数据一多,数据量一大,效果就出来了,动态类也是一样,如果你需要生成多个类的代理,比如说你需要生成ArrayList的代理,也需要生成TreeSet的代理,而且ArrayList的代理要有两个,第一个是在每个方法执行前要加入日志功能,执行后也要加入日志功能,ArrayList的第二个代理要在执行前开启事务管理,执行完毕关闭事务管理功能,这么一来就有四个代理类了,如果是静态代理类就需要写四个代理类,但是如果是动态代理类,我将你在调用每个方法前和调用后需要执行的代码抽象出来,封装成为一个接口,调用者只需要实现我的接口,告诉我你要用哪个类的代理,就可以实现四个代理类的灵活切换调用,相对于静态代理类岂不是方便很多了,说专业点就是解耦了,降低了代码的耦合性了,如果后期还需要用其他集合或者其他别的类的代理类我同样只需要给个代理类的名称给我,告诉我你要在调用目标类的方法前和方法后做什么事情就可以了

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1 很给力!

查看全部评分

回复 使用道具 举报
你们都是高人。。。
回复 使用道具 举报
第一印象 发表于 2013-9-13 17:05
如果只有一个类需要写代理类,是看不出动态代理类的作用的,就像我们用集合类,如果只是简单的增删改查,用 ...

我将你在调用每个方法前和调用后需要执行的代码抽象出来,封装成为一个接口,调用者只需要实现我的接口,告诉我你要用哪个类的代理,就可以实现四个代理类的灵活切换调用,相对于静态代理类岂不是方便很多了,说专业点就是解耦了,降低了代码的耦合性了
解释的很好,我看懂了,谢谢。
我在这里在说一下,大家有时候有没有这种感觉,想一个问题想了好久都没明白,但是在看了一些论坛上给的解释很快又明白了,回过头来再分析下当初自己的想法,感觉当时就像钻了牛角尖一样,看到了好的解释三言二语就搞定了,看来多在论坛上交流好处是多多的呦。
回复 使用道具 举报
亲,如问题已解决请将分类的“未解决”改为“已解决”。
以后的问题贴也要及时更改分类哦~
回复 使用道具 举报
施大勇 发表于 2013-9-14 15:19
我将你在调用每个方法前和调用后需要执行的代码抽象出来,封装成为一个接口,调用者只需要实现我的接口, ...

那是必须的呀,所以没事就多来论坛逛逛,交流下自己的理解和想法,进步才会更快
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马