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

这篇具有很好参考价值的文章主要介绍了Java的Proxy,一种思考和解决问题的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

静态代理

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

功能列表(接口)

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文章来源地址https://www.toymoban.com/news/detail-455645.html

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();
	}
}

到了这里,关于Java的Proxy,一种思考和解决问题的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Visual Studio 无法下载更新等问题的一种解决方法(aka.ms 无法连接访问/隐私错误、修改 DNS 及 hosts 文件也无效)

    ( 只是尝试一种方法的话,此部分的辛酸可以不看 ,具体见后面的 我的解决方法 ) 某天突然发现 Visual Studio 无法下载、更新,主要是 Visual Studio Installer 进度条加载一点后显示错误或者干脆进度为0再显示网络错误。 尝试了一大堆解决方法:修改 hosts 文件、修改 DNS、其它的

    2024年02月07日
    浏览(81)
  • 执行docker- compose命令遇到-bash: /usr/local/bin/docker-compose: 无法执行二进制文件 问题的一种解决方法

    一、问题描述 当安装好docker-compose并添加执行权限后,执行命令docker-compose 相关命令时出现 -bash: /usr/local/bin/docker-compose: 无法执行二进制文件 二、解决思路 应该是安装包有问题,网上找了几种重新安装方法途径,还是会出现这个问题,最终找到一种可靠重新安装的解决方法

    2024年02月08日
    浏览(40)
  • 考虑从IP、网关、DNS方面解决Linux不能上网问题,多种方法为Linux网卡配置静态IP

    本文基于Linux上CentOS 7和rocky 9版本进行演示 目录 IP地址 一.图形界面直接设置 二.nmtui命令工具 三.nm-connection-editor命令工具 四.终端nmcli命令 网关 确认虚拟机VMnet8网卡网关地址一致,一般为x.x.x.1  DNS 设置有效的DNS地址,114.114.114.114或8.8.8.8 无法上网考虑三个问题,IP地址是否有

    2024年02月16日
    浏览(37)
  • Proxy error: Could not proxy request 解决方法

    1.后端相应的被代理服务器没有开启 2.代理规则写错,前后端部署的域名应一致; 3.没有把 vue.config.js 中的 before: require(\\\'./mock/mock-server.js\\\'), 注释掉,导致走代理前走了mockjs 4.URL前面不完整,没有http:// 5.dns解析有问题,可以把target:\\\'http://xxx\\\' 里面的网址换成ip 6.npm install portf

    2024年01月21日
    浏览(47)
  • Nginx Proxy!一种在 Nginx 中实现反向代理的技术

    Nginx Proxy 代理是一种在 Nginx 中实现反向代理的技术 ,它可以将Nginx Proxy 代理是一种在 Nginx 中实现 反向代理 的技术,它可以将客户端的请求转发到后端服务器,并将后端服务器的响应返回给客户端。Nginx Proxy 代理在 Web 应用程序部署、负载均衡和安全等方面 具有广泛的应用

    2024年01月20日
    浏览(43)
  • 考虑从IP、网关、DNS方面解决Linux不能上网问题,nmtui和nmcli等多种方法为Linux网卡连接配置静态IP

    本文基于Linux上CentOS 7和rocky 9版本进行演示 目录 IP地址 一.图形界面直接设置 二.nmtui命令工具 三.nm-connection-editor命令工具 四.终端nmcli命令 网关 确认虚拟机VMnet8网卡网关地址一致,一般为x.x.x.1  DNS 设置有效的DNS地址,114.114.114.114或8.8.8.8 无法上网考虑三个问题,IP地址是否有

    2024年02月12日
    浏览(29)
  • umi 如何使用 proxy 代理解决 开发环境跨域 问题

    由于浏览器的同源策略限制,当一个请求 URL 的协议、域名、端口和当前页面 URL 任意一个不一致时都会出现跨域错误。 eg: 用 node run了一个 http://localhost:8080 的服务,在这个服务器下访问的网页也默认在 http://localhost:8080 这个域下面; 假设服务端所在的域是 http://example.com 这

    2024年02月09日
    浏览(32)
  • vsCode无法连接服务器问题解决及思考

    早上刚打开电脑,准备开始一天的工作。但是发现VSCode无法连接上我的虚拟机了,导致无法工作了,这让我十分头疼。最终花了将近一天的时间将问题解决,但是其中的过程走了不少弯路,浪费了不少时间,也进行了反思。我们作为开发人员,应该要用软件思维去理解这款产

    2024年03月14日
    浏览(46)
  • proxy代理不生效、vue config.js不生效解决方法

    axios默认请求接口就是localhost,所以这里需要更改 axios设置的默认请求设置 在 main.js 文件里,设置 vue.config.js文件夹要和src在同级别下 在这里面 /api 就相当于 \\\' http://localhost:8080/ \\\' 所以接下来接口需要添加的的url参数不需要再写接口的域名 要是在不行就把请求头加上 springboo

    2024年01月17日
    浏览(38)
  • Nginx Proxy Manager申请证书出现Internal Error的解决方法

    这是2.9.19的bug,退回到2.9.18就没问题了。 附上安装Nginx Proxy Manager中文版的docker-compose.yml文件

    2024年02月15日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包