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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 兜兜转转 于 2013-9-16 07:22 编辑

  1. <P>import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Proxy;

  4. public class MyHandler implements InvocationHandler
  5. {
  6. Object target ;
  7. Advice advice ;
  8. public MyHandler(Object target , Advice advice )
  9. {
  10. this.target = target;
  11. this.advice = advice;
  12. }

  13. @Override
  14. public Object invoke(Object proxy, Method method, Object[] args)
  15. throws Throwable
  16. {
  17. advice.beforDo(method);
  18. //这里执行方法不是要在Object proxy对象上执行吗?为什么往往都是在目标对象上执行呢?
  19. Object retval = method.invoke(target , args);
  20. advice.afterDo(method);
  21. return retval;
  22. }

  23. public Object getDynamicProxy()
  24. {
  25. return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this );
  26. }
  27. }</P>
复制代码
  1. import java.lang.reflect.InvocationHandler;
  2. import java.util.ArrayList;
  3. import java.util.List;

  4. public class MyDynamicTest
  5. {
  6. public static void main(String[] args)
  7. {
  8. List<String> list = new ArrayList<String>();
  9. Advice advice = new MyAdvice();
  10. MyHandler handler = new MyHandler(list, advice);
  11. List<String> listProxy = ( List)handler.getDynamicProxy();
  12. listProxy.add("Ansen");
  13. listProxy.add("Kaka1 SB");
  14. listProxy.add("Rudy SB");
  15. System.out.println( listProxy.size());

  16. }

  17. }
复制代码
  1. import java.lang.reflect.Method;

  2. public interface Advice
  3. {
  4. public abstract void beforDo(Method m);
  5. public abstract void afterDo(Method m);
  6. }
复制代码
  1. import java.lang.reflect.Method;

  2. public class MyAdvice implements Advice
  3. {
  4. long startTime = 0;
  5. @Override
  6. public void beforDo(Method m)
  7. {
  8. System.out.println(m.getName()+"方法开始执行!");
  9. startTime = System.currentTimeMillis();
  10. }
  11. @Override
  12. public void afterDo(Method m)
  13. {
  14. long endTime =System.currentTimeMillis();
  15. System.out.println();
  16. System.out.println(m.getName()+"方法执行结束! 执行用时为:"+(endTime-startTime));

  17. }
  18. }
复制代码
问题一:   
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
advice.beforDo(method);
//这里执行方法正常不是要在Object proxy对象上执行吗?为什么往往都是在目标对象上执行呢?
Object retval = method.invoke(target , args);
advice.afterDo(method);
return retval;
}
为什么不写成这种格式:
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
advice.beforDo(method);
Object retval = method.invoke(proxy , args);----->会导致死循环?为什么?
advice.afterDo(method);
return retval;
}

问题二:
protected
Proxy(InvocationHandler h)
使用其调用处理程序的指定值从子类(通常为动态代理类)构建新的 Proxy 实例。
Proxy这个类不不抽象类,构造方法也不是私有,是不是代表它可以创建对象?protected修饰的成员是可以被子类访问的,不是吗?





1 个回复

倒序浏览
http://bbs.itheima.com/forum.php ... mp;page=1#pid478397
这是我前几天发的一个关于动态代理的帖子。
问题1:
invoke可以理解为一个代理方法,通过Proxy.newProxyInstance生成一个代理类的实例,然后流程就会转到实现了InvocationHandler的类的invoke方法里边。而这Proxy.newProxyInstance只是为了得到一个实例而已,在哪里用都没区别。

问题2:
Proxy可不可以创造对象你自己大可以实验一下,如果能,用这个对象调用newProxyInstance()我想效果也一样,不过这么做很明显是画蛇添足,静态方法推荐用类名来调用!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马