动态代理实现方法耗时统计:
网上查了些资料和看别人的例子, 自己写了个demo跑了下.
1.传统方法:
假设有1个类A, 有一个方法play(); 如果用传统的方法统计play()耗时, 一般会这样做:
public static void main(String[] args) {
A a = new A();
long start = System.currentTimeMillis();
a.play();
long end = System.currentTimeMillis();
System.out.println("A.play()耗时"+(end-start) + "ms.");
}
如果有很多类的很多方法都需要统计耗时, 每个方法调用前后都要加上相同的代码, 会死人的!!!!!!!!
2.使用动态代理:
需要4个对象.
Play (接口):
public interface Play {
public void play();
}
A(目标类, 必须实现Play接口):
public class A implements Play{
@Override
public void play(){
System.out.println("This is A.play()!!!");
}
}
TimeHandler: 代理类, 必须实现InvocationHandler接口
public class TimeHandler implements InvocationHandler {
private Object target;
public TimeHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object obj = null;
try {
long start = System.currentTimeMillis();
// 这步很关键, 如果必须用target, 不能使用proxy,使用proxy会抛很多异常,而且会有很多输出, 不知道为什么
obj = method.invoke(target, args);
long end = System.currentTimeMillis();
System.out.println(method.getName() + "耗时"+(end-start) + "ms.");
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}
}
测试类Main:
public static void main(String[] args) {
Play p = new A();
InvocationHandler handler = new TimeHandler(p);
Play proxy = (Play)Proxy.newProxyInstance(
p.getClass().getClassLoader(),
p.getClass().getInterfaces(),
handler);
proxy.play();
}
搞定, 收工!!!
分享到:
相关推荐
JavaEE JDK动态代理是Java平台中实现面向切面编程(AOP)的一种方式,它允许我们在不修改原有代码的情况下,为已有对象添加额外的功能。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect...
在Spring Boot中,我们可以通过实现`HandlerInterceptor`接口并重写其三个方法——`preHandle()`, `postHandle()`, 和 `afterCompletion()` 来创建自定义的拦截器。 `preHandle()` 方法在目标处理方法调用之前执行...
这里我们主要探讨如何使用Java,Spring框架以及MySQL数据库来实现对网站的PV(页面浏览量)和UV(独立访客数)的统计。首先,我们需要了解这两个概念: 1. PV(页面浏览量):每次页面加载或刷新都会被计算为一次PV...
拦截器基于Java的动态代理实现,可以拦截Mapper接口方法的调用。 接下来,我们创建一个自定义的拦截器类,用于检测慢SQL。这个类需要实现`org.apache.ibatis.plugin.Interceptor`接口,并重写`intercept`方法。在`...
通过在方法的入口和出口处插入特定的字节码,我们可以实现对方法执行过程的干预,比如添加日志、性能统计、事务处理等。ASM库使得这个过程变得相对简单,因为开发者可以直接操纵字节码,而无需理解底层的二进制格式...
标题 "dace_代理模型优化_dace_krigingmatlab_" 暗示了这是一个关于使用DACE(Design and Analysis of Computer Experiments)工具箱在MATLAB环境中进行代理模型优化的资源,特别是利用克里金(Kriging)方法。...
实验报告3-Spring AOP是关于使用Spring框架的面向切面编程(AOP)功能来实现数据访问对象(DAO)层方法的执行时间统计。在Java开发中,Spring AOP是一种强大的工具,它允许程序员在不修改源代码的情况下,通过添加...
// 记录方法结束时间,计算耗时,更新统计信息等 } } ``` 在`DataCollectionTransformer`中,我们将`MonitoringAdvice`的`beforeMethod`和`afterMethod`插入到目标方法的开始和结束处。 除了基本的字节码操作,...
同时,通过对每个口岸通关时间的统计,进行排名,对通关时间长的口岸重点监控,找出存在的问题,着重解决口岸通关耗时统计分析。 广州国际贸易单一窗口2.0系统是一个功能强大、技术先进的系统,为广州国际贸易的...
Spring的AspectJ库就提供了动态代理功能,可以在不修改源码的情况下,实现对目标方法的拦截和增强。 3. **前置通知(Before,spring_AOP_3_before)**:在目标方法执行前,前置通知会被调用,常用于日志记录、权限...
- JDK动态代理只能代理实现了接口的类,如果目标对象没有实现接口,就无法使用JDK动态代理。而CGLIB代理则可以在没有接口的情况下创建代理对象,它是通过继承目标类来实现的。 - CGLIB代理在性能上可能优于JDK动态...
在大规模机构中,如果采用手工方式为每台计算机逐一进行核心配置,不仅工作量巨大、耗时,而且容易出错,因此必须采用自动化方法进行配置。 目前核心配置自动化的方法主要有三种: 第一种方法是预装带安全配置的...
缓存代理模式的核心思想是:当一个计算过程比较耗时或者资源消耗较大时,我们可以在第一次计算完成后,将结果存储起来。当下一次遇到相同的输入参数时,代理函数可以直接从缓存中取出结果,而不需要再次执行实际的...
避免在关键的生命周期方法中执行耗时操作,确保拦截代码的高效和稳定。 七、应用场景 - 权限验证:在Activity启动时进行权限检查,确保用户在使用特定功能前已授权。 - 日志追踪:记录Activity的启动和关闭,帮助...
2. **交换方法实现**:调用`method_exchangeImplementations`交换原始方法和代理方法的IMP(方法实现)。 3. **确保调用原始方法**:在代理方法的实现中调用原始方法。 **应用场景** - **性能监控**:监控特定方法...
- 服务代理层:实现服务接口的透明代理。 - 服务注册层:封装服务注册和发现。 - 路由层:处理服务路由和负载均衡。 - 监控层:监控服务调用次数和时间。 - 远程调用层:封装RPC调用过程。 - 信息交换层:实现...
5. **统计与监控**:内置了全面的统计和监控机制,包括调用次数、耗时、错误率等关键指标,便于进行问题定位和性能优化。 6. **线程安全**:设计上充分考虑了多线程环境下的安全性,确保了在并发场景下的正确性和...
在`main.js`文件中,可能会实现一个代理类,它持有目标对象的引用,并提供与目标对象相同的方法接口。代理类在调用这些方法之前或之后,可以添加自己的逻辑。例如: ```javascript // 目标对象 class RealObject { ...