package cn.itcast.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 ProxyTest {

/**
  * @param args
  */
 public static void main(String[] args) throws Exception {
  // TODO Auto-generated method stub
  Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
  System.out.println(clazzProxy1.getName());

System.out.println("----------begin constructors list----------");
  /*
   * $Proxy0() $Proxy0(InvocationHandler,int)
   */
  Constructor[] constructors = clazzProxy1.getConstructors();
  for (Constructor constructor : constructors) {
   String name = constructor.getName();
   StringBuilder sBuilder = new StringBuilder(name);
   sBuilder.append('(');
   Class[] clazzParams = constructor.getParameterTypes();
   for (Class clazzParam : clazzParams) {
    sBuilder.append(clazzParam.getName()).append(',');
   }
   if (clazzParams != null && clazzParams.length != 0)
    sBuilder.deleteCharAt(sBuilder.length() - 1);
   sBuilder.append(')');
   System.out.println(sBuilder.toString());
  }

System.out.println("----------begin methods list----------");
  /*
   * $Proxy0() $Proxy0(InvocationHandler,int)
   */
  Method[] methods = clazzProxy1.getMethods();
  for (Method method : methods) {
   String name = method.getName();
   StringBuilder sBuilder = new StringBuilder(name);
   sBuilder.append('(');
   Class[] clazzParams = method.getParameterTypes();
   for (Class clazzParam : clazzParams) {
    sBuilder.append(clazzParam.getName()).append(',');
   }
   if (clazzParams != null && clazzParams.length != 0)
    sBuilder.deleteCharAt(sBuilder.length() - 1);
   sBuilder.append(')');
   System.out.println(sBuilder.toString());
  }

System.out.println("----------begin create instance object----------");
  // Object obj = clazzProxy1.newInstance();
  Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class);
  class MyInvocationHander1 implements InvocationHandler {

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    // TODO Auto-generated method stub
    return null;
   }

}
  Collection proxy1 = (Collection) constructor.newInstance(new MyInvocationHander1());

System.out.println(proxy1);
  proxy1.clear();
  // proxy1.size();
  // System.out.println("111111111111111");

Collection proxy2 = (Collection) constructor.newInstance(new InvocationHandler() {

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    return null;
   }

});

final ArrayList target = new ArrayList();
  Collection proxy3 = (Collection) getProxy(target, new MyAdvice());
  proxy3.add("zxx");
  proxy3.add("lhm");
  proxy3.add("bxd");
  System.out.println(proxy3.size());
  System.out.println(proxy3.getClass().getName());
 }

private static Object getProxy(final Object target, final Advice advice) {
  Object proxy3 = Proxy.newProxyInstance(target.getClass().getClassLoader(),
  /* new Class[]{Collection.class}, */
  target.getClass().getInterfaces(), new InvocationHandler() {

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

/*
     * long beginTime = System.currentTimeMillis(); Object retVal =
     * method.invoke(target, args); long endTime =
     * System.currentTimeMillis();
     * System.out.println(method.getName() + " running time of " +
     * (endTime - beginTime)); return retVal;
     */

advice.beforeMethod(method);
    Object retVal = method.invoke(target, args);
    advice.afterMethod(method);
    return retVal;

}
  });
  return proxy3;
 }

}

----------------------------------------------------------------------------

package cn.itcast.day3;

import java.lang.reflect.Method;

public interface Advice {
 void beforeMethod(Method method);
 void afterMethod(Method method);
}
----------------------------------------------------------

package cn.itcast.day3;

import java.lang.reflect.Method;

public class MyAdvice implements Advice {
 long beginTime = 0;

public void afterMethod(Method method) {
  // TODO Auto-generated method stub
  System.out.println("调用方法后做的事!");  
  long endTime = System.currentTimeMillis();
  System.out.println(method.getName() + " running time of " + (endTime - beginTime));

}

public void beforeMethod(Method method) {
  // TODO Auto-generated method stub
  System.out.println("调用方法前做的事!");
  beginTime = System.currentTimeMillis();
 }

}

java中的代理的更多相关文章

  1. (转)轻松学,Java 中的代理模式及动态代理

    背景:讲到反射机制,肯定会想到动态代理. 轻松学,Java 中的代理模式及动态代理 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.值得注意的是,代理类和被代理类应该 ...

  2. java中Proxy(代理与动态代理)

    转自: https://blog.csdn.net/pangqiandou/article/details/52964066 一.代理的概念 动态代理技术是整个java技术中最重要的一个技术,它是学习 ...

  3. java中动态代理实现机制

    前言: 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系 ...

  4. java中设置代理的两种方式

    1 前言 有时候我们的程序中要提供可以使用代理访问网络,代理的方式包括http.https.ftp.socks代理.比如在IE浏览器设置代理. 那我们在我们的java程序中使用代理呢,有如下两种方式. ...

  5. Java中的代理模式

    代理模式在Java Web的框架中经常使用到.比如说在对数据库的访问中,核心功能是对数据库的增删改查,而连接数据库.处理事务等功能我们在开发中也要考虑到.所以我们将数据库的CRUD抽象到接口中,然后实 ...

  6. 说说Java中的代理模式

    今天看到传智播客李勇老师的JDBC系列的第36节——通过代理模式来保持用户关闭连接的习惯.讲的我彻底蒙蔽了,由于第一次接触代理模式,感到理解很难,在博客园找到一篇文章,先记录如下: 引用自java设计 ...

  7. java中静态代理跟动态代理之间的区别

    文章转载于:http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另 ...

  8. java中动态代理

    一.在java中怎样实现动态代理 1.我们要有一个接口,还要有一个接口的实现类,而这个实现类呢就是我们要代理的对象 接口: package org.dynamicproxy.test; public ...

  9. JAVA中的代理技术(静态代理和动态代理)

    最近看书,有两个地方提到了动态代理,一是在Head First中的代理模式,二是Spring AOP中的AOP.所以有必要补充一下动态代理的相关知识. Spring采用JDK动态代理和CGLib动态代 ...

  10. 深入理解JAVA中的代理模式

    前言 代理是什么 事故现场:我家的宠物今天生病了,而我又没有相关的医学知识,所以我只让我的宠物多喝热水吗? 结果显然是不行的,所以我需要去找宠物医生这些更专业的人来帮我的宠物治病. 这个时候,代理就出 ...

随机推荐

  1. Eclipse中点击小猫提示Tomcat settings should be set in Tomcat Preference Page

    1.window->preference->tomcat->tomcat-version选择自己tomcat版本 tomcat home 选择tomcat安装目录,即bin的上一层 ...

  2. OSG 安装配置

    对于普通用户推荐直接下载安装包配置.如有特殊需求或想了解编译过程可参考网上文章自己编译后配置.(通常建议使用第一种方法即可) 本人安装经验: 失败:自己系统64位,VS2010 32位,开始自己动手编 ...

  3. SGU 114.Telecasting station

    题意: 百慕大的每一座城市都坐落在一维直线上.这个国家的政府决定建造一个新的广播电视台.经过了许多次试验后,百慕大的科学家们提出了一个结论,在每座城市的不满意度等于这座城市的市民数与这座城市与广播电视 ...

  4. PHPCMS V9 学习总结(转)

    转自:http://www.cnblogs.com/Braveliu/p/5074930.html 在实现PHPCMS网站过程中,根据业务需求,我们遇到很多问题,特此总结如下,以便大家参考学习. [1 ...

  5. 判断JS类型

    (function (root, factory) { if (typeof define === 'function' && define.amd) { define([], fac ...

  6. mysql数据类型——枚举enum(‘F’,'M')

    ENUM(“value1”,“value2”,...) 说明:枚举,列值可赋予值列表中的某个成员 允许的属性:除通用属性外无其他属性 缺省值:如果列可为NULL,则为NULL:如果列为NOTNULL, ...

  7. Day10 网络编程(续)

    作用域 Python的作用域是函数,没有块级作用域 if 1 == 1: name = 'wang' print(name) #wang   for i in range(10): name = i ...

  8. 原 IOS之NSValue整理

    原 IOS之NSValue整理 发表于2年前(2013-02-28 23:02)   阅读(1974) | 评论(0) 5人收藏此文章, 我要收藏 赞3 IOS NSValue 值对象(value o ...

  9. iOS9 未受信任的企业级开发者

    升级iOS9,app打不开怎么办?6个步骤让你应对“未受信任的企业及开发者账号” 点开App,弹出未受信任的开发者,记住弹框中冒号后面的大写字母.关闭,进入设置. 进入通用 进入描述文件 找到所对应的 ...

  10. 如何在js文件中实现获取request.getCotextPath();

    我们在jsp中可以方便的使用“request.getCotext()”来获取工程的根目录. 但是如果我们的js代码存在一个单独的js文件中,这时候再想获取根目录,我们就要自己截取了.可以采用下面的方式 ...