Java实现代理模式(CGLIB)
2016-04-26 15:01
507 查看
先用你喜欢的方式加上依赖,我以maven为例:
真实角色:
代理角色:
测试:
对于final方法无法代理。
CGLIB还提供了一个过滤器的工具,可以用来选择,哪一个方法用哪一个代理类来代理。
再来一个代理类:
加上一个过滤器
为什么是int呢?因为你可以有很多歌代理类选择,看下面吧:
试试吧。
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency>
真实角色:
public class Hello { public void hello() { System.out.println("My Hello."); } }
代理角色:
import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * Created by dubby on 16/4/26. */ public class HelloProxy implements MethodInterceptor { Hello hello = null; public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("proxy"); return methodProxy.invokeSuper(o, objects); } }
测试:
import net.sf.cglib.proxy.Enhancer; /** * Created by dubby on 16/4/26. */ public class Test { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setCallback(new HelloProxy()); enhancer.setSuperclass(Hello.class); Hello hello = (Hello) enhancer.create(); hello.hello(); } }
对于final方法无法代理。
CGLIB还提供了一个过滤器的工具,可以用来选择,哪一个方法用哪一个代理类来代理。
再来一个代理类:
import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * Created by dubby on 16/4/26. */ public class HiProxy implements MethodInterceptor { public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("hi"); return methodProxy.invokeSuper(o,objects); } }
加上一个过滤器
import net.sf.cglib.proxy.CallbackFilter; import java.lang.reflect.Method; /** * Created by dubby on 16/4/26. */ public class HelloFilter implements CallbackFilter { public int accept(Method method) { if("hello".equals(method.getName())) return 0; return 1; } }
为什么是int呢?因为你可以有很多歌代理类选择,看下面吧:
import net.sf.cglib.proxy.Callback; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.NoOp; /** * Created by dubby on 16/4/26. */ public class Test { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setCallbacks(new Callback[]{new HelloProxy(), new HiProxy()});//上面的过滤器里的返回值代表这里的回调代理类的位置 enhancer.setSuperclass(Hello.class); enhancer.setCallbackFilter(new HelloFilter()); Hello hello = (Hello) enhancer.create(); hello.hello(); hello.hi(); } }
试试吧。
相关文章推荐
- LeetCode之数组处理题java
- 第83讲:Scala和Java二种方式实战Spark Streaming开发
- Jsoup简介——使用Java抓取网页数据
- Java
- 设计模式之六大原则——迪米特法则(LoD,LKP)
- 笔记(Spring管理Hibernate)
- Eclipse,新建web项目后 出现jax-ws webservice
- JAVA中的NIO(二)
- java插入mysql乱码(变成问号)
- 反转二叉树----java实现
- springmvc(二) 控制器Controller及乱码问题和日期问题的解决
- java越来越重要
- Java调用ant脚本并将日志信息通过对话框输出
- Myeclipse 安装SVN步骤
- Java超神之路
- myeclipse复制项目
- java爬虫学习日记2-宽度优先爬虫代码实现
- Spring配置文件详解
- 修理桌子-Java
- JAVA编程讲座-吴老