静态代理

第一种实现(基于接口):
1》接口
public interface Hello {
void say(String msg);
}
2》目标类,至少实现一个接口
public class HelloImpl implements Hello {
public void say(String msg) {
System.out.println("Hi,"+msg);
}
}
3》代理类(与目标类实现相同接口,从而保证功能一致)
public class HelloProxy implements Hello{
private Hello hello;
public HelloProxy(Hello hello){
this.hello = hello;
}
public void say(String msg){
before();
hello.say(msg);
after();
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
3》测试
/**
* @Author LZHL
* @Create 2017-02-19 10:26
* @Description
*/
public class Main {
public static void main(String[] args) throws Exception {
HelloImpl target = new HelloImpl();
HelloProxy proxy = new HelloProxy(target);
proxy.say("LZHL");
}
}
第二种实现(基于目标类):
1>目标类
public class HelloTarget {
public void sayHello(String name){
System.out.println("Hi,"+name);
}
}
2>代理类(通过继承目标类,保证功能一致)
public class HelloProxy extends HelloTarget{
private HelloTarget target;
public HelloProxy(HelloTarget target){
this.target = target;
}
@Override
public void sayHello(String name) {
this.before();
target.sayHello(name);
this.after();
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
3>测试
public class Main {
public static void main(String[] args) throws Exception {
HelloTarget target = new HelloTarget();
HelloProxy proxy= new HelloProxy(target);
proxy.sayHello("LZHL");
}
}
动态代理
动态代理的代理类是在程序运行期间动态生成的,也有两种实现,一种是JDK动态代理,一种是CGLib动态代理
1》JDK动态代理(基于接口实现,与目标类实现相同接口,从而保证功能一致)
/**
* @Author LZHL
* @Create 2017-02-19 12:46
* @Description
*/
public class Main {
public static void main(String[] args){
final HelloImpl target = new HelloImpl();
Object proxyInstance = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
/*
* proxy: 代理对象
* method: 目标对象的方法对象
* args: 目标对象方法的参数
* return: 目标对象方法的返回值
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before");
Object retValue = method.invoke(target, args);
System.out.println("after");
return retValue;
}
});
Hello proxy = (Hello) proxyInstance;
proxy.say("LYX");
//可以把InvocationHandler提取出来,单独写一个类,为了方便大家看,这里我用内部类的形式
class JDKProxy implements InvocationHandler {
private Object target;
public JDKProxy(Object target){
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(target, args);
after();
return result;
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
InvocationHandler ih = new JDKProxy(target);
Object proxyInstance2 = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), ih);
Hello proxy2 = (Hello) proxyInstance2;
proxy2.say("LZHL");
}
}
2》CGLib动态代理(基于目标类,通过继承目标类,从而保证功能一致),需要导入cglib-3.2.4.jar包
pom.xml
<dependencies> <!-- https://mvnrepository.com/artifact/cglib/cglib --> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.4</version> </dependency> </dependencies>
1)目标类
public class Hi {
public void sayHi(String msg){
System.out.println("Hi,"+msg);
}
}
2)测试
/**
* @Author LZHL
* @Create 2017-02-19 13:19
* @Description
*/
public class Main {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
//设置父类
enhancer.setSuperclass(Hi.class);
//设置回调函数
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object target, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("before");
Object retValue = methodProxy.invokeSuper(target, args);
System.out.println("after");
return retValue;
}
});
Object proxy = enhancer.create();
Hi hi = (Hi) proxy;
hi.sayHi("LXY");
//可以把MethodInterceptor提取出来,单独写一个类,为了方便大家看,这里我用内部类的形式
class CGLibProxy implements MethodInterceptor {
public <T> T getProxy(Class<T> clazz){
return (T) Enhancer.create(clazz, this);
}
public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable {
before();
Object result = proxy.invokeSuper(target, args);
after();
return result;
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
CGLibProxy cgLibProxy = new CGLibProxy();
Hi hi2 = cgLibProxy.getProxy(Hi.class);
hi2.sayHi("LZHL");
}
}
以上所述是小编给大家介绍的Java静态代理和动态代理总结,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
# java
# 静态代理
# java动态代理
# Java静态代理和动态代理的深入讲解
# Java动态代理静态代理实例分析
# Java代理模式实例详解【静态代理与动态代理】
# JAVA中的静态代理、动态代理以及CGLIB动态代理总结
# 浅谈Java代理(jdk静态代理、动态代理和cglib动态代理)
# 深入解析java中的静态代理与动态代理
# java 静态代理 动态代理深入学习
# 浅谈Java 代理机制
# 我用
# 小编
# 是在
# 也有
# 两种
# 给大家
# 所述
# 回调
# 第二种
# 第一种
# 给我留言
# 返回值
# 有任何
# proxy
# target
# args
# Exception
# static
# main
相关文章:
广平建站公司哪家专业可靠?如何选择?
建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析
如何在万网ECS上快速搭建专属网站?
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
建站之星安装提示数据库无法连接如何解决?
如何通过多用户协作模板快速搭建高效企业网站?
如何通过虚拟主机快速完成网站搭建?
建站主机如何安装配置?新手必看操作指南
如何快速建站并高效导出源代码?
网站制作价目表怎么做,珍爱网婚介费用多少?
如何快速辨别茅台真假?关键步骤解析
实惠建站价格推荐:2025年高性价比自助建站套餐解析
建站之星后台管理如何实现高效配置?
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
制作网站的基本流程,设计网站的软件是什么?
TestNG的testng.xml配置文件怎么写
如何用花生壳三步快速搭建专属网站?
济南企业网站制作公司,济南社保单位网上缴费步骤?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
如何通过.red域名打造高辨识度品牌网站?
制作旅游网站html,怎样注册旅游网站?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
建站上市公司网站建设方案与SEO优化服务定制指南
如何在Golang中引入测试模块_Golang测试包导入与使用实践
如何获取开源自助建站系统免费下载链接?
南宁网站建设制作定制,南宁网站建设可以定制吗?
如何设计高效校园网站?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
网站app免费制作软件,能免费看各大网站视频的手机app?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
英语简历制作免费网站推荐,如何将简历翻译成英文?
网站制作话术技巧,网站推广做的好怎么话术?
官网网站制作腾讯审核要多久,联想路由器newifi官网
高防服务器:AI智能防御DDoS攻击与数据安全保障
怎么将XML数据可视化 D3.js加载XML
定制建站流程步骤详解:一站式方案设计与开发指南
建设网站制作价格,怎样建立自己的公司网站?
如何快速使用云服务器搭建个人网站?
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
如何选择最佳自助建站系统?快速指南解析优劣
如何配置FTP站点权限与安全设置?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
建站之星×万网:智能建站系统+自助建站平台一键生成
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
中山网站推广排名,中山信息港登录入口?
C++时间戳转换成日期时间的步骤和示例代码
*请认真填写需求信息,我们会在24小时内与您取得联系。