`
lxr215
  • 浏览: 60074 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

动态代理实现方法耗时统计

    博客分类:
  • Java
 
阅读更多

动态代理实现方法耗时统计:

 

网上查了些资料和看别人的例子, 自己写了个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();
}
 

搞定, 收工!!!

1
5
分享到:
评论
1 楼 zcsuntt 2011-03-15  
在Eclipse中实现这个功能很方便,只需要添加一个template就可以了。
选中要测试的代码,然后按Alt+Shift+Z,然后自定义性能测试模板,以后测试任何代码的执行速度,都只需要点一下Alt+SHift+Z就可以了。

相关推荐

    JavaEE JDK动态代理实现AOP切面功能

    JavaEE JDK动态代理是Java平台中实现面向切面编程(AOP)的一种方式,它允许我们在不修改原有代码的情况下,为已有对象添加额外的功能。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect...

    Spring Boot Aspect 切面 AOP 拦截器 Interceptor 监控control请求耗时

    在Spring Boot中,我们可以通过实现`HandlerInterceptor`接口并重写其三个方法——`preHandle()`, `postHandle()`, 和 `afterCompletion()` 来创建自定义的拦截器。 `preHandle()` 方法在目标处理方法调用之前执行...

    JAVA 统计网站的访问量PV,UV

    这里我们主要探讨如何使用Java,Spring框架以及MySQL数据库来实现对网站的PV(页面浏览量)和UV(独立访客数)的统计。首先,我们需要了解这两个概念: 1. PV(页面浏览量):每次页面加载或刷新都会被计算为一次PV...

    通过Mybatis拦截器自动定位慢SQL并记录日志

    拦截器基于Java的动态代理实现,可以拦截Mapper接口方法的调用。 接下来,我们创建一个自定义的拦截器类,用于检测慢SQL。这个类需要实现`org.apache.ibatis.plugin.Interceptor`接口,并重写`intercept`方法。在`...

    Android字节码插桩

    通过在方法的入口和出口处插入特定的字节码,我们可以实现对方法执行过程的干预,比如添加日志、性能统计、事务处理等。ASM库使得这个过程变得相对简单,因为开发者可以直接操纵字节码,而无需理解底层的二进制格式...

    dace_代理模型优化_dace_krigingmatlab_

    标题 "dace_代理模型优化_dace_krigingmatlab_" 暗示了这是一个关于使用DACE(Design and Analysis of Computer Experiments)工具箱在MATLAB环境中进行代理模型优化的资源,特别是利用克里金(Kriging)方法。...

    实验报告3-资料.rar

    实验报告3-Spring AOP是关于使用Spring框架的面向切面编程(AOP)功能来实现数据访问对象(DAO)层方法的执行时间统计。在Java开发中,Spring AOP是一种强大的工具,它允许程序员在不修改源代码的情况下,通过添加...

    Java Agent实现系统数据采集

    // 记录方法结束时间,计算耗时,更新统计信息等 } } ``` 在`DataCollectionTransformer`中,我们将`MonitoringAdvice`的`beforeMethod`和`afterMethod`插入到目标方法的开始和结束处。 除了基本的字节码操作,...

    广州国际贸易单一窗口介绍0907.pptx

    同时,通过对每个口岸通关时间的统计,进行排名,对通关时间长的口岸重点监控,找出存在的问题,着重解决口岸通关耗时统计分析。 广州国际贸易单一窗口2.0系统是一个功能强大、技术先进的系统,为广州国际贸易的...

    spring小练习

    Spring的AspectJ库就提供了动态代理功能,可以在不修改源码的情况下,实现对目标方法的拦截和增强。 3. **前置通知(Before,spring_AOP_3_before)**:在目标方法执行前,前置通知会被调用,常用于日志记录、权限...

    spring-aop-practice

    - JDK动态代理只能代理实现了接口的类,如果目标对象没有实现接口,就无法使用JDK动态代理。而CGLIB代理则可以在没有接口的情况下创建代理对象,它是通过继承目标类来实现的。 - CGLIB代理在性能上可能优于JDK动态...

    计算机核心配置自动化系统设计与实现.pdf

    在大规模机构中,如果采用手工方式为每台计算机逐一进行核心配置,不仅工作量巨大、耗时,而且容易出错,因此必须采用自动化方法进行配置。 目前核心配置自动化的方法主要有三种: 第一种方法是预装带安全配置的...

    JavaScript设计模式之缓存代理模式原理与简单用法示例

    缓存代理模式的核心思想是:当一个计算过程比较耗时或者资源消耗较大时,我们可以在第一次计算完成后,将结果存储起来。当下一次遇到相同的输入参数时,代理函数可以直接从缓存中取出结果,而不需要再次执行实际的...

    拦截Activity的项目

    避免在关键的生命周期方法中执行耗时操作,确保拦截代码的高效和稳定。 七、应用场景 - 权限验证:在Activity启动时进行权限检查,确保用户在使用特定功能前已授权。 - 日志追踪:记录Activity的启动和关闭,帮助...

    移动 App 性能监测实践.pdf

    2. **交换方法实现**:调用`method_exchangeImplementations`交换原始方法和代理方法的IMP(方法实现)。 3. **确保调用原始方法**:在代理方法的实现中调用原始方法。 **应用场景** - **性能监控**:监控特定方法...

    46道Dubbo面试题含详细的答案说明(很全)

    - 服务代理层:实现服务接口的透明代理。 - 服务注册层:封装服务注册和发现。 - 路由层:处理服务路由和负载均衡。 - 监控层:监控服务调用次数和时间。 - 远程调用层:封装RPC调用过程。 - 信息交换层:实现...

    brpc-java是baidurpc的java版本实现

    5. **统计与监控**:内置了全面的统计和监控机制,包括调用次数、耗时、错误率等关键指标,便于进行问题定位和性能优化。 6. **线程安全**:设计上充分考虑了多线程环境下的安全性,确保了在并发场景下的正确性和...

    js代码-js设计模式 代理模式

    在`main.js`文件中,可能会实现一个代理类,它持有目标对象的引用,并提供与目标对象相同的方法接口。代理类在调用这些方法之前或之后,可以添加自己的逻辑。例如: ```javascript // 目标对象 class RealObject { ...

Global site tag (gtag.js) - Google Analytics