`

原生动态代理

 
阅读更多

来张图开开胃


 

package com.hous.math;

public interface ArithmeticCalculator {
	public int add(int i, int j);

	public int sub(int i, int j);

	public int mul(int i, int j);

	public int div(int i, int j);
}

 

package com.hous.math;

public class ArithmeticCalculatorImpl implements ArithmeticCalculator{

	@Override
	public int add(int i, int j) {
		int result = i + j;
		return result;
	}

	@Override
	public int sub(int i, int j) {
		int result = i - j;
		return result;
	}

	@Override
	public int mul(int i, int j) {
		int result = i * j;
		return result;
	}

	@Override
	public int div(int i, int j) {
		int result = i / j;
		return result;
	}

}

 
 

package com.hous.test;

import com.hous.math.ArithmeticCalculator;
import com.hous.math.ArithmeticCalculatorImpl;
import com.hous.math.ArithmeticCalculatorLoggingProxy;

public class Math {
	public static void main(String[] args) {
		ArithmeticCalculator arithmeticCalculator = new ArithmeticCalculatorImpl();
		
		ArithmeticCalculator proxy = new ArithmeticCalculatorLoggingProxy(arithmeticCalculator).getLoggingProxy();
		
		System.out.println(proxy.add(12, 23));
		
	}
}

 

package com.hous.math;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class ArithmeticCalculatorLoggingProxy {
private ArithmeticCalculator target;

public ArithmeticCalculatorLoggingProxy(ArithmeticCalculator target) {
	this.target = target;
}

public ArithmeticCalculator getLoggingProxy(){
	ArithmeticCalculator proxy = null;
//	代理对象由哪个类加载器负责加载
	ClassLoader loader = target.getClass().getClassLoader();
//	代理对象的类型,即其中有哪些方法
	Class[] interfaces = new Class[]{ArithmeticCalculator.class};
//	当调用代理对象方法是,执行该代码
	InvocationHandler handler = new InvocationHandler() {
		
		/* *
		 * proxy:返回哪个代理对象,在invoke方法内不适用
		 * method:被调用的方法
		 * args:调用方法时的传入参数
		 */
		@Override
		public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
			
			String methodName = method.getName();
			//日志
			System.out.println("The method " + methodName + " begins with " + Arrays.asList(args));
			//执行方法
			Object result = method.invoke(target, args);
			//日志
			System.out.println("The method " + methodName + " end with " + result);
			
			return result;
		}
	};
	proxy = (ArithmeticCalculator) Proxy.newProxyInstance(loader, interfaces, handler);
	
	return proxy;
}

}

 

  • 大小: 130.5 KB
分享到:
评论

相关推荐

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)

    本文主要介绍 Java 中两种常见的动态代理方式:JDK 原生动态代理和 CGLIB 动态代理。 一、 代理模式 代理模式是指程序通过代理类来访问目标对象,以达到对目标对象的控制和增强。代理模式的优点是可以在不改变目标...

    java 动态代理实现注解日志拦截

    Java动态代理是Java提供的一种强大的功能,它允许我们在运行时创建代理对象,这些代理对象可以扩展或修改目标对象的行为。在本场景中,我们将探讨如何使用Java动态代理结合注解来实现日志拦截,以便在调用方法时记录...

    原生浏览器socket本地代理

    标题中的“原生浏览器socket本地代理”指的是在浏览器中使用原生的Socket接口来实现一个本地代理服务。这种代理服务通常用于绕过某些网络限制,或者进行数据抓取和分析。本地代理允许浏览器通过Socket连接到指定的...

    详解使用Java原生代理实现AOP实例共4页.pdf.zi

    Java原生代理(Java Native Interface, JNI)与AOP(面向切面编程,Aspect-Oriented Programming)是两种不同的编程概念。在这个实例中,我们主要关注的是如何使用Java的动态代理来实现AOP,而非JNI。Java的动态代理...

    Js原生ajax与跨域(代理)上传文件

    在JavaScript的世界里,AJAX(Asynchronous JavaScript and XML)是一种创建动态网页的技术,它允许我们在不刷新整个页面的情况下,从服务器获取数据并更新部分网页内容。随着XML的应用逐渐减少,现在AJAX更多地是...

    最新淘宝客APP源码 原生双端源码+代理系统/带完整开发文档教程

    总的来说,"最新淘宝客APP源码 原生双端源码+代理系统/带完整开发文档教程"是一个涵盖了移动应用开发、电商运营、多级分销等多种技术与业务知识的项目,对于想要深入学习移动开发和电商平台运营的开发者来说,这是一...

    一个微信小程序替代原生Component的数据层代理构造器wx-proxy-component-master.zip

    这个名为“wx-proxy-component”的项目,意图提供一个数据层代理构造器,以替代原生的微信小程序Component,旨在优化数据处理和组件通信流程。 在微信小程序的原生开发环境中,Component是构建用户界面的基本单元,...

    比较原始的方案实现RPC框架,采用Socket通信、动态代理与反射与Java原生的序列化

    比较原始的方案实现RPC框架,采用Socket通信、动态代理与反射与Java原生的序列化 1)服务提供者,运行在服务器端,提供服务接口定义与服务实现类。 2)服务中心,运行在服务器端,负责将本地服务发布成远程服务,...

    12月原生APP的淘宝客+代理系统完整前后端带完整安装教程.zip

    源码是原生APP的淘宝客,UI很漂亮,内含安卓和苹果IOS前端。详细的安装教程见压缩包内。12月原生APP的淘宝客+代理系统完整前后端带完整安装教程.zip

    动态代理

    动态代理在Java编程中是一种非常重要的技术,它允许我们在运行时创建对象的代理,从而可以在调用实际目标方法之前或之后插入自定义的行为。这种技术广泛应用于AOP(面向切面编程)、事件监听、日志记录、性能测试等...

    云原生技术学习路线图_pro

    * Kubelet:Kubernetes 的 Node 代理 服务网格 * Istio:服务网格的代表 * Linkerd:服务网格的另一个选择 * Conduit:服务网格的轻量级选择 服务发现 * etcd:分布式键值存储 * Nacos:服务发现和配置中心 * ...

    原生APP多端原生商业版源码 安卓+IOS+超级后台+独立代理

    标题中的“原生APP多端原生商业版源码 安卓+IOS+超级后台+独立代理”指的是一款适用于Android和iOS双平台的原生应用程序的商业源代码,其中包括了超级后台管理系统以及独立代理功能。这样的系统通常用于构建一个完整...

    winform上的mvvm框架--升级版(动态代理)

    在本文中,我们将深入探讨如何在WinForm应用中利用MVVM框架,并且通过引入Castle动态代理来提升效率和代码复用性。标题“winform上的mvvm框架--升级版(动态代理)”揭示了我们将在WinForm环境中实现一个基于MVVM...

    迁移到云原生应用架构.pdf

    Service Mesh技术是指使用代理服务来管理应用程序之间的交互。 迁移到云原生应用架构需要企业进行文化变革、组织变革和技术变革。文化变革是指改变企业的文化和价值观念,使其更加开放、灵活和创新。组织变革是指...

    云原生服务网格Istio:原理、实践、架构与源码解析.zip

    云原生服务网格Istio是一种先进的开源平台,旨在为微服务架构提供强大的服务治理能力。它通过在服务间通信层插入一个透明的代理(Envoy sidecar)来实现这一目标,为服务间的交互提供了安全、可观察性、流量管理和...

    使用AWEL(代理工作流表达语言)和代理的AI原生数据应用程序开发框架.zip

    在AI原生数据应用程序开发中,代理(Agents)起到了关键作用。这些代理可以是独立运行的程序,负责特定的子任务,如数据采集、预处理、模型训练或者结果验证。通过这种方式,开发框架能够模块化,使得维护和扩展变得...

    maven原生zip包

    6. **设置文件**:除了pom.xml外,Maven还允许用户通过settings.xml文件进行全局配置,如定义默认的本地和远程仓库路径,设置代理服务器等。 ** 总结 ** "Maven原生zip包"是开发人员获取未经过任何修改的官方Maven...

    一个微信小程序替代原生Component的数据层代理构造器

    为了解决这一问题,"一个微信小程序替代原生Component的数据层代理构造器"应运而生。这个构造器基于JavaScript的Proxy对象,它旨在简化组件数据的管理,提供更加直观和高效的编程体验。 Proxy是ES6引入的一个强大...

    iOS原生定位(封装)

    在iOS开发中,原生定位服务是实现应用中获取用户地理位置功能的重要技术。"iOS原生定位(封装)"指的是开发者使用苹果提供的Core Location框架,对其进行封装,以便更方便、高效地集成到自己的应用程序中。相比依赖...

Global site tag (gtag.js) - Google Analytics