cglib代理与jdk动态代理示例
先看基于jdk实现的动态代理实现例子
1、先声明一个接口类
public interface UserService{ public String getName(String msg);
}
2、实现上面定义的接口类
public class UserServiceImpl implements UserService { @Override
public String getName(String msg) {
System.out.println("###enter getName method###");
return msg;
}
}
3、实现InvocationHandler接口类
import java.lang.reflect.Method;
import java.lang.reflect.InvocationHandler; public class MyInvocationHandler implements InvocationHandler { private Object targetObj; public MyInvocationHandler(){} public MyInvocationHandler(Object obj) { this.targetObj = obj;
} @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable { System.out.println("###enter invoke method pre###");
Object result = method.invoke(targetObj, args);
System.out.println("###enter invoke method after###");
return result;
}
}
4、测试类
public class JdkProxyMain{ public static void main(String[] args) { UserService service = new UserServiceImpl();
InvocationHandler invoke = new MyInvocationHandler(); UserService proxy = (UserService)Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), invoke);
proxy.getName();
}
}
Cglib动态代理示例(还是基于上面的接口类及实现接口类,cglib也支持类的实现方式来支持动态代理,需引入cglib jar包)
public class CglibProxy implements MethodInterceptor { @Override
public Object intercept(Object target, Method method, Object[] params, MethodProxy methodProxy) throws Throwable {
System.out.println("....enter invoke pre...");
methodProxy.invokeSuper(target, params);
System.out.println("...enter invoke end...");
return null;
}
}
public class CglibMain{ public static void main(String[] args) {
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "F:\\code");//设置生成代理类的路径
CglibProxy cglib = new CglibProxy();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserServiceImpl.class);
enhancer.setCallback(cglib); UserService service = (UserService)enhancer.create();
String result service.getName("cglib");
} }
cglib代理与jdk动态代理示例的更多相关文章
- Java代理(静态代理、JDK动态代理、CGLIB动态代理)
Java中代理有静态代理和动态代理.静态代理的代理关系在编译时就确定了,而动态代理的代理关系是在运行期确定的.静态代理实现简单,适合于代理类较少且确定的情况,而动态代理则给我们提供了更大的灵活性. J ...
- Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
一.概念 代理是什么呢?举个例子,一个公司是卖摄像头的,但公司不直接跟用户打交道,而是通过代理商跟用户打交道.如果:公司接口中有一个卖产品的方法,那么公司需要实现这个方法,而代理商也必须实现这个方法. ...
- 从静态代理,jdk动态代理到cglib动态代理-一文搞懂代理模式
从代理模式到动态代理 代理模式是一种理论上非常简单,但是各种地方的实现往往却非常复杂.本文将从代理模式的基本概念出发,探讨代理模式在java领域的应用与实现.读完本文你将get到以下几点: 为什么需要 ...
- 代理模式详解:静态代理、JDK动态代理与Cglib动态代理
代理模式简介分类 概念 代理,是为了在不修改目标对象的基础上,增强目标方法的业务逻辑. 客户类需要执行的是目标对象的目标方法,但是真正执行的是代理对象的代理方法,客户类对目标对象的访问是通过代 ...
- 静态代理与JDK动态代理
demo地址: https://github.com/ZbLeaning/leaning 代理: 为其他对象提供一种代理以控制对这个对象的访问.分为静态代理和动态代理.代理模式的目的就是为真实业务对象 ...
- 何为代理?jdk动态代理与cglib代理、spring Aop代理原理浅析
原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...
- 017 Java中的静态代理、JDK动态代理、cglib动态代理
一.静态代理 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由业务实现类.业务代理类两部分组成.业务实现类负责实现主要的业务方法,业 ...
- 代理模式(静态代理、JDK动态代理原理分析、CGLIB动态代理)
代理模式 代理模式是设计模式之一,为一个对象提供一个替身或者占位符以控制对这个对象的访问,它给目标对象提供一个代理对象,由代理对象控制对目标对象的访问. 那么为什么要使用代理模式呢? 1.隔离,客户端 ...
- 代理模式 静态代理、JDK动态代理、Cglib动态代理
1 代理模式 使用代理模式时必须让代理类和被代理类实现相同的接口: 客户端通过代理类对象来调用被代理对象方法时,代理类对象会将所有方法的调用分派到被代理对象上进行反射执行: 在分派的过程中还可以添加前 ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(3):常用动态代理之JDK动态代理、CGLIB动态代理
一.动态代理的理解 动态代理的意义在于生成一个占位(又称代理对象),来代理真实对象,从而控制真实对象的访问. 先来谈谈什么是代理模式. 假设这样一个场景:你的公司是一家软件 ...
随机推荐
- C++ KMP文本匹配
代码如下: 环境为VC #include <iostream> #include <algorithm> #include <string> #include &l ...
- RESTful (俗称:api接口文档)
整体规范建议采用RESTful 方式来实施. 协议 API与用户的通信协议,总是使用HTTPs协议,确保交互数据的传输安全. 域名 应该尽量将API部署在专用域名之下.https://api.exam ...
- MySQL-其它整理
来自:http://www.w3school.com.cn/sql/sql_server.asp 一:基本操作 1)插入 INSERT INTO 表名称 VALUES (值1, 值2,....): I ...
- Mac OS 10.15系统入门教程 系统语言输入法详解
对于一些Mac新手来说呢还不知道偏好设置到底是什么?有什么用处?其实Mac系统内的几乎所有的系统相关的设置都会在系统偏好设置内出现. 切换系统语⾔在语言与地区设置中拖拽左侧的语言条目就可以切换系统的语 ...
- gensim Load embeddings
gensim package from gensim.models.keyedvectors import KeyedVectors twitter_embedding_path = 'twitter ...
- PHP array_change_key_case() 函数
实例 将数组的所有的键转换为大写字母: <?php $age=array("Peter"=>"35","Ben"=>&qu ...
- 早日选择一门自己喜欢的,然后瞄准目标,不达目的誓不罢休。像文章的作者一样成为一名成功的IT人士。
hawk的奋斗历程. 来自:LinuxForum :http://www3.linuxforum.net/ 原址:http://www.linuxforum.net/forum/gshowflat. ...
- 【Flutter学习】之button按钮
一,概述 由于Flutter是跨平台的,所以有适用于Android和iOS的两种风格的组件.一套是Google极力推崇的Material,一套是iOS的Cupertino风格的组件.无论哪种风格,都是 ...
- 【HDU5306】【DTOJ2481】Gorgeous Sequence【线段树】
题目大意:给你一个序列a,你有三个操作,0: x y t将a[x,y]和t取min:1:x y求a[x,y]的最大值:2:x y求a[x,y]的sum 题解:首先很明显就是线段树裸题,那么考虑如何维护 ...
- Instagram几个queryhash
page_query_hash 42323d64886122307be10013ad2dcc44comment_query_hash 33ba35852cb50da46f5b5e889df7d159f ...