动态代理示例

本文涉及的产品
云数据库 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);
	}
}


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
存储 Java API
动态代理实现的两种方式
【10月更文挑战第10天】
38 2
|
5月前
|
Java
Java aop 如何获取方法的参数体
【8月更文挑战第12天】Java aop 如何获取方法的参数体
165 2
|
7月前
|
监控 Java Spring
Java 动态代理详解与实战示例
Java 动态代理详解与实战示例
86 1
|
7月前
|
存储 设计模式 Java
Java语言中反射动态代理接口的解释与演示
Java语言中反射动态代理接口的解释与演示
36 1
|
8月前
调用反射类的方法
调用反射类的方法
|
8月前
调用反射类的指定方法
调用反射类的指定方法
|
Java
动态代理有哪些实现方式?
动态代理是一种在运行时创建代理对象的技术,它可以在不修改目标对象的情况下,通过代理对象来增强目标对象的功能。在Java中,有两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。
160 0
|
Java 程序员 编译器
23-java基础加强(反射、泛型、注解、动态代理)
一、反射 1. 一段java代码在程序运行期间会经历三个阶段: source-->class-->runtime     Person.java—Person.class  à  类加载到内存 Person.class –> 创建对象 程序运行   2. Class 对象     在java中用一个Class对象来表示一个java类的class阶段     Class对象封装
1540 0
Java:CGLib动态代理实现原始类的扩展
Java:CGLib动态代理实现原始类的扩展
123 0