动态代理示例

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:
package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyDemo {
	public static void main(String[] args) {
		ILoadData mysqlHandler = new LoadDataToMysql();
		ILoadData handler = LoadDataHandler.newInstance(mysqlHandler, new DataMetrics());
		handler.loadData("load data");
	}	
}

class LoadDataHandler  {
	public static ILoadData newInstance(ILoadData handler, DataMetrics metrics) {
		return (ILoadData) Proxy.newProxyInstance(handler.getClass()
				.getClassLoader(), new Class[] { ILoadData.class },
				new DataMetricsProxy(handler, metrics));
	}

	private static class DataMetricsProxy implements InvocationHandler {
		private final ILoadData handler;
		private final DataMetrics metrics;

		private DataMetricsProxy(ILoadData handler, DataMetrics metrics) {
			this.handler = handler;
			this.metrics = metrics;
		}

		@Override
		public Object invoke(Object proxy, Method m, Object[] args)
				throws Throwable {
			Object result;
			try {
				long start = now();
				result = m.invoke(handler, args);
				int processTime = (int) (now() - start);
				metrics.incMethodTime(m.getName(), processTime);
			} catch (InvocationTargetException e) {
				throw e.getTargetException();
			} catch (Exception e) {
				throw new RuntimeException("unexpected invocation exception: "
						+ e.getMessage());
			}
			return result;
		}
	}

	private static long now() {
		return System.nanoTime();
	}
}

interface ILoadData {
	public void loadData(String data);
}

class LoadDataToMysql implements ILoadData {
	@Override
	public void loadData(String data) {
		System.out.println("load data to mysql");
	}
}

class DataMetrics {
	public void incMethodTime(String name, long time) {
		System.out.println(name + "," + time);
	}
}


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
Java
Java aop 如何获取方法的参数体
【8月更文挑战第12天】Java aop 如何获取方法的参数体
73 2
|
3月前
|
Java 数据库 Spring
Java编程问题之在测试中使用CGLIB创建代理类如何解决
Java编程问题之在测试中使用CGLIB创建代理类如何解决
|
3月前
|
设计模式 Java 程序员
解析Java中的动态代理与静态代理的区别
解析Java中的动态代理与静态代理的区别
|
4月前
|
存储 设计模式 Java
Java语言中反射动态代理接口的解释与演示
Java语言中反射动态代理接口的解释与演示
25 1
|
Java Maven
JDK动态代理和CGLIB动态代理的区别及实例
JDK动态代理和CGLIB动态代理的区别及实例
184 0
|
Java 编译器 数据库连接
cglib动态代理 | 如何生成代理类、代理类内容解析
cglib动态代理 | 如何生成代理类、代理类内容解析
|
Java
动态代理有哪些实现方式?
动态代理是一种在运行时创建代理对象的技术,它可以在不修改目标对象的情况下,通过代理对象来增强目标对象的功能。在Java中,有两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。
141 0
|
Java
查看JDK动态代理生成的类的内容
首先我们先定义一个接口: public interface PersonInter { String test(String str); }接着就是我们想的要生成的JDK代理类源码的代码: public class JdkProxy...
1508 0
Java:CGLib动态代理实现原始类的扩展
Java:CGLib动态代理实现原始类的扩展
109 0
|
SQL Java 程序员
JDK动态代理示例(一个注解就能帮你完成查询)
熟练使用动态代理是程序员高阶技能之一,是框架和骚操作的必备技巧。
195 0
JDK动态代理示例(一个注解就能帮你完成查询)