栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

覆盖Thread.sleep()

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

覆盖Thread.sleep()

您不能重写

Thread.sleep
方法,因为它是本机方法,所以无法对其进行分析或转换。一种方法是使用Java代理自动将日志记录添加到所有调用Thread.sleep的位置。

尽管下面的方法有效并且很有趣,但对于您而言,将所有对in的调用重构

Thread.sleep
为一个单独的方法并在其中添加日志记录可能会更好。

您可以在此处找到Java代理的简介。简而言之,它是一种特殊的机制,允许(以及其他)转换已加载的Java字节码。以下Java
Agent类示例通过System.out日志记录自动增强了对Thread.sleep的所有调用,并测量了在该方法中花费的时间:

package fi.schafer.agent;import javassist.CannotCompileException;import javassist.ClassPool;import javassist.CtClass;import javassist.CtMethod;import javassist.expr.ExprEditor;import javassist.expr.MethodCall;import java.lang.instrument.ClassFileTransformer;import java.lang.instrument.IllegalClassFormatException;import java.lang.instrument.Instrumentation;import java.security.ProtectionDomain;public class LoggingAgent {    public static void premain(String agentArgument, Instrumentation instrumentation) throws Exception {        instrumentation.addTransformer(new ClassFileTransformer() { @Override public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {     return doClass(className, classBeingRedefined, classfileBuffer); }        });    }        private static byte[] doClass(String name, Class clazz, byte[] b) {        ClassPool pool = ClassPool.getDefault();        CtClass cl = null;        try { cl = pool.makeClass(new java.io.ByteArrayInputStream(b)); final CtMethod[] targetMethods = cl.getDeclaredMethods(); for (CtMethod targetMethod : targetMethods) {     targetMethod.instrument(new ExprEditor() {         public void edit(final MethodCall m) throws CannotCompileException {  if ("java.lang.Thread".equals(m.getClassName()) && "sleep".equals(m.getMethodName())) {      m.replace("{long startMs = System.currentTimeMillis(); " +   "$_ = $proceed($$); " +   "long endMs = System.currentTimeMillis();" +   "System.out.println("Logging Thread.sleep call execution, ms: " + (endMs-startMs));}");  }         }     });     return cl.toBytepre(); }        } catch (Exception e) { System.err.println("Could not instrument  " + name         + ",  exception : " + e.getMessage());        } finally { if (cl != null) {     cl.detach(); }        }        return b;    }}

您将需要将其编译为loggerAgent.jar文件,并在其中包含以下meta-INF / MANIFEST.MF:

Manifest-Version: 1.0Premain-Class: fi.schafer.agent.LoggingAgentBoot-Class-Path: javassist.jar

下载JavaAssist并将其放入带有已编译Agent的jar所在的文件夹中。使用parameter运行您的应用程序

-javaagent:loggerAgent.jar

您可以下载完整的示例。只需解压缩它,打开文件夹版本,然后使用

java-cp loggerAgent.jar -javaagent:loggerAgent.jar Test

更多信息和更多示例可以在这篇出色的文章中找到。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/509732.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号