我们来做个最简单的代理工厂,用于把对象给代理了。代码很简洁,就是一个类,用于返回封装的对象。
使用起来尤其的简单。具体的说明我就不用写了,大家看下最下面的输出日志就会明白了。
代理工厂的代码如下。
package net.chinacsharp.jdf.proxy.proxyfactory; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * 传统的代理工厂 * @author keyboardsun * */ public class ProxyFactory implements InvocationHandler{ private static transient Log log = LogFactory.getLog( ProxyFactory.class ); private Object obj = null;// 这里封装的对象 public ProxyFactory( Object o ){ obj = o; log.debug( "代理了一个类噢:" + o.getClass().getName() ); } /** * 代理的方法都经过这里调用 * @param arg0 * @param m * @param parms * @return * @throws Throwable */ public Object invoke( Object arg0, Method m, Object[] parms ) throws Throwable{ log.debug("调用对象:"+obj.getClass().getName()) ; log.debug("调用方法:"+m.getName()) ; if(parms!=null){ for( int i = 0; i < parms.length; i++ ){ log.debug("调用参数:"+parms[i]==null?"":parms[i].toString()) ; } } Object returnResult = m.invoke( obj, parms ); return returnResult; } public static Object newInstance( Object o ){ InvocationHandler handler = new ProxyFactory( o ); ClassLoader cl = o.getClass().getClassLoader(); Class c = null; //因为这里代理只能用接口 if( o.getClass().isInterface() ){ c = o.getClass(); }else{ Class[] interfaces = o.getClass().getInterfaces(); if( interfaces != null && interfaces.length > 0 ){ c = interfaces[0]; } } return Proxy.newProxyInstance( cl, new Class[] {c}, handler ); } }
下面我们新建一个接口,然后实现这个接口。
接口类 ITest 接口,代码如下
import java.util.HashMap; public interface ITest{ public void test2(HashMap m,String s,long f); }
接口实现类的 Test.java 代码如下
import java.util.HashMap; public class Test implements ITest{ public void test2( HashMap m, String s, long f ){ System.out.println("成功调用到test2方法"); } }
下面我们运行main函数
public static void main(String args[]) Exception{ HashMap map = new HashMap(); map.put("Testkey","TestValue"); ITest test = (ITest) ProxyFactory.newInstance(Test.class.newInstance()); test.test2(map,"good luck",2009); }
下面是输出参数,明白了吧,呵呵。
[2009-07-27 12:44:52,765] [main] (ProxyFactory.java:22) DEBUG net.chinacsharp.jdf.proxy.proxyfactory.ProxyFactory - 代理了一个类噢:net.jkf.mysql.Test [2009-07-27 12:44:52,781] [main] (ProxyFactory.java:34) DEBUG net.chinacsharp.jdf.proxy.proxyfactory.ProxyFactory - 调用对象:net.jkf.mysql.Test [2009-07-27 12:44:52,781] [main] (ProxyFactory.java:35) DEBUG net.chinacsharp.jdf.proxy.proxyfactory.ProxyFactory - 调用方法:test2 [2009-07-27 12:44:52,781] [main] (ProxyFactory.java:38) DEBUG net.chinacsharp.jdf.proxy.proxyfactory.ProxyFactory - 调用参数:{Testkey=TestValue} [2009-07-27 12:44:52,781] [main] (ProxyFactory.java:38) DEBUG net.chinacsharp.jdf.proxy.proxyfactory.ProxyFactory - 调用参数:good luck [2009-07-27 12:44:52,781] [main] (ProxyFactory.java:38) DEBUG net.chinacsharp.jdf.proxy.proxyfactory.ProxyFactory - 调用参数:2009 成功调用到test2方法
这里的代理工厂可以直接拿过去就可以用,很简单吧。
这里在代理工厂的invoke方法里面加上invokeBefore 和 invokeAfter用于控制事务,统计方法调用时间等等信息。
作者:keyboardsun 转载请标明出处
您还没有登录,请您登录后再发表评论
spring之AOP(动态代理),包括jdk动态代理和CGLib动态代理
AOP 动态代理(Proxy invocationHandler),Spring的动态代理的介绍
SpringAOP动态代理 Spring AOP 使用的动态代理主要有两种方式:JDK 动态代理和 CGLIB 代理。 JDK 动态代理:用于代理实现了接口的类。Spring 会使用 java.lang.reflect.Proxy 类来创建代理对象。 CGLIB 代理:用于...
1. 首先完成一个接口的创建(里面有真正的想要实现的方法): public interface UserDAO{ public void add (); //想要实现的方法 } 2. 写一个真实的主题类实现...3. 写一个动态的代理类实现InvocationHandler接口:
package com.gc.dynproxy下为:aop方式动态代理 package com.gc.javaproxy下为:java代理机制实现 package com.gc.proxy下为:自定义代理模式(面向接口编程) package com.gc.normal下为:通用日志处理方式
有一天在用回调模版的时候,忽然间又想到jdk自带的Proxy类似乎不是怎么好用,为何不把其做成回调模版呢,可以将其改造称类似spring Aop 代码如下: package com.fjx.proxy.up.test; import ...
Spring源代码解析(五):Spring_AOP获取Proxy.doc
代理模式java代码 Proxy(4) 开发宝典......
httpProxy,http/https代理服务器的源码,VC编译测试通过
JavaEE proxy简单代理示例
此文比较详细讲述了Nginx与proxy共同搭建反向代理服务的配置方法
此资源为文章中《代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)》与《 AOP动态代理声明式的3种配置方式过程与区别》的案例代码,可下载参考学习。
简易高效的代理池,提供如下功能: 1. 定时抓取免费代理网站,简易可扩展 2. 使用 Redis 对代理进行存储并对代理可用性进行排序 3. 定时测试和筛选,剔除不可用代理,留下可用代理 4. 提供代理 API,随机取用测试...
代理模式java代码 Proxy(5) 2个代理类 开发宝典
使用jdk proxy实现aop机制的一个小例子,写着给新手看看而已,老手们莫见笑
动态代理类例子proxy动态代理类例子proxy动态代理类例子proxy
为了说明Spring的AOP原理,本人使用代理模式中的动态代理完成演示AOP编程的原理的演示。相信,如果你耐心看完整个程序(几乎一行注释一行代码),那么你对Spring这个东西就不是觉得有什么神秘了! 阅读对象:凡是喜爱...
详细介绍ArcGIS JS API跨域配置 介绍Proxy 代理不同web服务器环境部署和调用
JAVA AOP例子, 包括cglib, jsvassist, dynamicProxy
相关推荐
spring之AOP(动态代理),包括jdk动态代理和CGLib动态代理
AOP 动态代理(Proxy invocationHandler),Spring的动态代理的介绍
SpringAOP动态代理 Spring AOP 使用的动态代理主要有两种方式:JDK 动态代理和 CGLIB 代理。 JDK 动态代理:用于代理实现了接口的类。Spring 会使用 java.lang.reflect.Proxy 类来创建代理对象。 CGLIB 代理:用于...
1. 首先完成一个接口的创建(里面有真正的想要实现的方法): public interface UserDAO{ public void add (); //想要实现的方法 } 2. 写一个真实的主题类实现...3. 写一个动态的代理类实现InvocationHandler接口:
package com.gc.dynproxy下为:aop方式动态代理 package com.gc.javaproxy下为:java代理机制实现 package com.gc.proxy下为:自定义代理模式(面向接口编程) package com.gc.normal下为:通用日志处理方式
有一天在用回调模版的时候,忽然间又想到jdk自带的Proxy类似乎不是怎么好用,为何不把其做成回调模版呢,可以将其改造称类似spring Aop 代码如下: package com.fjx.proxy.up.test; import ...
Spring源代码解析(五):Spring_AOP获取Proxy.doc
代理模式java代码 Proxy(4) 开发宝典......
httpProxy,http/https代理服务器的源码,VC编译测试通过
JavaEE proxy简单代理示例
此文比较详细讲述了Nginx与proxy共同搭建反向代理服务的配置方法
此资源为文章中《代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)》与《 AOP动态代理声明式的3种配置方式过程与区别》的案例代码,可下载参考学习。
简易高效的代理池,提供如下功能: 1. 定时抓取免费代理网站,简易可扩展 2. 使用 Redis 对代理进行存储并对代理可用性进行排序 3. 定时测试和筛选,剔除不可用代理,留下可用代理 4. 提供代理 API,随机取用测试...
代理模式java代码 Proxy(5) 2个代理类 开发宝典
使用jdk proxy实现aop机制的一个小例子,写着给新手看看而已,老手们莫见笑
动态代理类例子proxy动态代理类例子proxy动态代理类例子proxy
为了说明Spring的AOP原理,本人使用代理模式中的动态代理完成演示AOP编程的原理的演示。相信,如果你耐心看完整个程序(几乎一行注释一行代码),那么你对Spring这个东西就不是觉得有什么神秘了! 阅读对象:凡是喜爱...
详细介绍ArcGIS JS API跨域配置 介绍Proxy 代理不同web服务器环境部署和调用
JAVA AOP例子, 包括cglib, jsvassist, dynamicProxy