Java的Proxy,一种思考和解决问题的方法

news/2024/7/6 6:33:06 标签: java, 开发语言, 代理模式

代理模式

    • 静态代理
      • 功能列表(接口)
      • 原有功能,功能的实现
      • 在不破坏原功能的情况下Enhance
      • Test
    • JDK 动态代理
    • Cglib 代理模式
      • Callback的MethodInterceptor
      • test

静态代理

在不破坏原有功能的情况下,进行升级改造。
使用场景,通常在旧项目改造和升级中,不能或者没有条件在源码的基础上升级和改造
所以用代理模式是一个不错的选择。

功能列表(接口)

public interface IDoing {
	public String doFirst();
	public void doSecond();
}

原有功能,功能的实现

@Slf4j
public class DoingImpl implements IDoing {
	@Override
	public String doFirst() {
		String me = "Hi there,this is Michael";
		return me;
	}
	
	@Override
	public void doSecond() {
		log.info("let's started now");
	}
}

在不破坏原功能的情况下Enhance

public class DoingProxy implements IDoing {

	private IDoing idoing;
	
	DoingProxy(){
		this.idoing = new DoingImpl();
	}
	@Override
	public String doFirst() {
		return idoing.doFirst().toUpperCase();
	}
	@Override
	public void doSecond() {
		idoing.doSecond();
	}
}

Test

@Slf4j
public class TestProxy {
	public static void main(String[] args) {
		IDoing idoing = new DoingImpl();
		IDoing idoing = new DoingProxy();
		log.info(idoing.doFirst());
		idoing.doSecond();
	}
}

Hi there,this is Michael
HI THERE,THIS IS MICHAEL
let’s started now

JDK 动态代理

在静态代理的基础上改造

@Slf4j
public class TestProxy {
	public static void main(String[] args) {
		IDoing target = new DoingImpl();
		IDoing proxyIdoing = (IDoing) Proxy.newProxyInstance(
				target.getClass().getClassLoader(), 
				target.getClass().getInterfaces(),
				new InvocationHandler() {
					@Override
					public Object invoke(
						Object proxy, 
						Method method, 
						Object[] args) throws Throwable {
						Object result = method.invoke(target, args);
						if (result!=null) {
							result = result.toString().toUpperCase();
						}
						return result;
					}
					
				} );
		
		String doFirst = proxyIdoing.doFirst();
		log.info(doFirst);
		proxyIdoing.doSecond();
	}
}

Cglib 代理模式

Callback的MethodInterceptor

public interface MethodInterceptor extends Callback

public class CglibProxyEnhancer implements MethodInterceptor {
	public DoingImpl getCglibCreator() {
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(DoingImpl.class);
		enhancer.setCallback(this);
		return (DoingImpl) enhancer.create();
	}
	
	@Override
	public Object intercept(
		Object obj, 
		Method method, 
		Object[] args,
		MethodProxy proxy) throws Throwable {
		Object result = method.invoke(new DoingImpl(), args);
		if (result!=null) {
			result = result.toString().toUpperCase();
		}
		return result;
	}
}

test

@Slf4j
public class TestProxy {

	public static void main(String[] args) {
		 
		CglibProxyEnhancer cglibProxyEnhancer = new CglibProxyEnhancer();
		DoingImpl proxyIdoing = cglibProxyEnhancer.getCglibCreator();
		
		String doFirst = proxyIdoing.doFirst();
		
		log.info(doFirst);
		proxyIdoing.doSecond();
	}
}

http://www.niftyadmin.cn/n/347573.html

相关文章

Qt复制文件到C盘目录超级管理员权限和避免VirtualStore功能

本以为复制文件是个很简单的事情,没想到居然需要超级管理员权限。 网上一搜有好多教程,例如这个: 给Qt程序添加管理员权限总结(一定有你没见过的方式)_qt管理员权限_百里杨的博客-CSDN博客当我们写了一个Qt程序&…

面试:说下进程、线程和协程

进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。 线程是程序执行中一个单一的顺序控制流程&#…

Java基础--->并发部分(4)【对象引用、线程池、ThreadLocal】

文章目录 对象引用线程池ThreadLocalThreadLocal 有什么用 对象引用 Java中的对象引用指的是一个变量或常量,它指向一个在堆内存中具体位置的对象。通过对象引用,我们可以访问对象的属性和方法。Java采用的是系统管理堆内存和栈内存的方式,对…

2023互联网Java面试真题1000道(附答案)

前言 2023 跳槽不迷茫,大家可以先收藏再看,后续跳槽都能用上的! Java程序员绝大部分工作的时间都是增删改查,很多人觉得这项工作没什么技术含量,任何一件事情都要站在不同的角度去考虑,对于大部分的java程序…

消息中间件——RocketMQ(与Kafka、RabbitMQ的对比)

RocketMQ、Kafka、RabbitMQ的对比 1.ActiveMQ:Apache出品的比较老的消息中间件 2.Kafka:支持日志消息,监控数据,是一种高吞吐量的分布式发布订阅消息系统,支持百万级别的单机吞吐量,但是可能会造成数据丢失 3.RocketMQ:阿里在使用Kafka之后发现了它的消息系统主要定位于日志传…

2023年认证杯SPSSPRO杯数学建模D题(第一阶段)立体车库的自动调度问题全过程文档及程序

2023年认证杯SPSSPRO杯数学建模 D题 立体车库的自动调度问题 原题再现: 随着人们生活水平的提高,汽车保有量日益增加,而城市土地资源有限,传统平面停车场土地面积利用率低, 这样便形成了交通拥挤、停车困难的现象。为解决该问题…

【libcurl 】win32 构建 Release版本 修改cmakelist 链接openssl1.1.*

以下库均已MD的构建以vs2019 V142构建MD构建 直接换用了一个openssl库,libcurl连接报错 $(ProjectDir)..\..\..\3rdparty\openssl\xdw_openssl1_1_1\lib\win32\libcrypto.lib

13岁青少年DAO创始人:Web3治好了我的“丧”

“我看大家都死气沉沉的,大家都站起来活动活动。” 4月,香港Web3嘉年华的一场沙龙,橙色针织帽给黑压压的现场带来一抹亮色,13岁的Carry Zheng戴着它登台,没有“大家好”的寒暄,直接向台下的成年人发出指令&…