From 1faf2371314446cdcad21127aa608d140c90c08f Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Fri, 14 Sep 2018 15:16:23 +0800 Subject: [PATCH] remove reflect call to VirtualMachine. #23 --- core/pom.xml | 14 ++++---- .../java/com/taobao/arthas/core/Arthas.java | 32 ++++++++----------- .../taobao/arthas/core/util/ArthasBanner.java | 1 - pom.xml | 6 ++++ 4 files changed, 28 insertions(+), 25 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index edb7821ed..43795132c 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -71,12 +71,6 @@ org.ow2.asm asm-commons - - - - - - com.alibaba.middleware @@ -125,12 +119,20 @@ junit junit + test org.benf cfr 0.132 + + + org.powermock + powermock-module-javaagent + provided + true + diff --git a/core/src/main/java/com/taobao/arthas/core/Arthas.java b/core/src/main/java/com/taobao/arthas/core/Arthas.java index bcd8cae04..ea6adbd6e 100644 --- a/core/src/main/java/com/taobao/arthas/core/Arthas.java +++ b/core/src/main/java/com/taobao/arthas/core/Arthas.java @@ -1,5 +1,7 @@ package com.taobao.arthas.core; +import com.sun.tools.attach.VirtualMachine; +import com.sun.tools.attach.VirtualMachineDescriptor; import com.taobao.arthas.core.config.Configure; import com.taobao.middleware.cli.CLI; import com.taobao.middleware.cli.CLIs; @@ -7,9 +9,7 @@ import com.taobao.middleware.cli.CommandLine; import com.taobao.middleware.cli.Option; import com.taobao.middleware.cli.TypedOption; -import java.lang.reflect.Method; import java.util.Arrays; -import java.util.List; /** * Arthas启动器 @@ -52,30 +52,26 @@ public class Arthas { } private void attachAgent(Configure configure) throws Exception { - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - Class vmdClass = loader.loadClass("com.sun.tools.attach.VirtualMachineDescriptor"); - Class vmClass = loader.loadClass("com.sun.tools.attach.VirtualMachine"); - - Object attachVmdObj = null; - for (Object obj : (List) vmClass.getMethod("list", (Class[]) null).invoke(null, (Object[]) null)) { - Object pid = vmdClass.getMethod("id", (Class[]) null).invoke(obj, (Object[]) null); + VirtualMachineDescriptor virtualMachineDescriptor = null; + for (VirtualMachineDescriptor descriptor : VirtualMachine.list()) { + String pid = descriptor.id(); if (pid.equals(Integer.toString(configure.getJavaPid()))) { - attachVmdObj = obj; + virtualMachineDescriptor = descriptor; } } - Object vmObj = null; + VirtualMachine virtualMachine = null; try { - if (null == attachVmdObj) { // 使用 attach(String pid) 这种方式 - vmObj = vmClass.getMethod("attach", String.class).invoke(null, "" + configure.getJavaPid()); + if (null == virtualMachineDescriptor) { // 使用 attach(String pid) 这种方式 + virtualMachine = VirtualMachine.attach("" + configure.getJavaPid()); } else { - vmObj = vmClass.getMethod("attach", vmdClass).invoke(null, attachVmdObj); + virtualMachine = VirtualMachine.attach(virtualMachineDescriptor); } - Method loadAgent = vmClass.getMethod("loadAgent", String.class, String.class); - loadAgent.invoke(vmObj, configure.getArthasAgent(), configure.getArthasCore() + ";" + configure.toString()); + virtualMachine.loadAgent(configure.getArthasAgent(), + configure.getArthasCore() + ";" + configure.toString()); } finally { - if (null != vmObj) { - vmClass.getMethod("detach", (Class[]) null).invoke(vmObj, (Object[]) null); + if (null != virtualMachine) { + virtualMachine.detach(); } } } diff --git a/core/src/main/java/com/taobao/arthas/core/util/ArthasBanner.java b/core/src/main/java/com/taobao/arthas/core/util/ArthasBanner.java index 39c8835ee..76419c701 100644 --- a/core/src/main/java/com/taobao/arthas/core/util/ArthasBanner.java +++ b/core/src/main/java/com/taobao/arthas/core/util/ArthasBanner.java @@ -7,7 +7,6 @@ import com.taobao.text.Decoration; import com.taobao.text.ui.TableElement; import com.taobao.text.util.RenderUtil; -import java.io.IOException; import java.io.InputStream; import static com.taobao.text.ui.Element.label; diff --git a/pom.xml b/pom.xml index e37e8eace..ed8f8da50 100644 --- a/pom.xml +++ b/pom.xml @@ -138,6 +138,12 @@ 4.11 test + + org.powermock + powermock-module-javaagent + 1.7.4 + provided +