support classes load by bootstrap classloader

pull/1182/head
hengyunabc 5 years ago
parent cead701c71
commit 2f5bc476eb

@ -14,30 +14,35 @@ import com.taobao.arthas.core.shell.system.ProcessAware;
/** /**
* *
* TODO line listener stringkey classname|method|desc|num SpyAPI invoke? * TODO line listener stringkey classname|method|desc|num
* SpyAPI invoke?
* *
* TODO trace trace classname|method|desc|trace ? trace SPYinvoke * TODO trace trace classname|method|desc|trace ? trace
* SPYinvoke
* *
* TODO trace Listener * TODO trace Listener
* *
* TODO SPY Object Listener Listener * TODO SPY Object Listener
* Binding ClassLoader ClassLoader * Listener Binding
* ClassLoader ClassLoader
* *
* ID trace * ID trace
* *
* watch watch TransForm watch * watch watch TransForm
* reset * watch reset
* *
* watchinmethod * watchinmethod
* *
* *
* TODO trace linenumber binding mehtodNode * TODO trace linenumber binding
* mehtodNode
* *
* TODO annotation invoke transform * TODO annotation invoke
* annotation annotation url ?key/value * transform annotation annotation url ?key/value
*
* *
* TODO trace /watch Listener ID trace/watchID * TODO trace /watch Listener ID
* trace * trace/watchID trace
* *
* *
* @author hengyunabc 2020-04-24 * @author hengyunabc 2020-04-24
@ -46,6 +51,7 @@ import com.taobao.arthas.core.shell.system.ProcessAware;
public class AdviceListenerManager { public class AdviceListenerManager {
private static Timer timer = ArthasBootstrap.getInstance().getTimer(); private static Timer timer = ArthasBootstrap.getInstance().getTimer();
private static final FakeBootstrapClassLoader FAKEBOOTSTRAPCLASSLOADER = new FakeBootstrapClassLoader();
static { static {
timer.scheduleAtFixedRate(new TimerTask() { timer.scheduleAtFixedRate(new TimerTask() {
@ -106,7 +112,7 @@ public class AdviceListenerManager {
listeners = new ArrayList<AdviceListener>(); listeners = new ArrayList<AdviceListener>();
map.put(key, listeners); map.put(key, listeners);
} }
if(!listeners.contains(listener)) { if (!listeners.contains(listener)) {
listeners.add(listener); listeners.add(listener);
} }
} }
@ -121,7 +127,6 @@ public class AdviceListenerManager {
return listeners; return listeners;
} }
public void registerTraceAdviceListener(String className, String owner, String methodName, String methodDesc, public void registerTraceAdviceListener(String className, String owner, String methodName, String methodDesc,
AdviceListener listener) { AdviceListener listener) {
@ -133,12 +138,13 @@ public class AdviceListenerManager {
listeners = new ArrayList<AdviceListener>(); listeners = new ArrayList<AdviceListener>();
map.put(key, listeners); map.put(key, listeners);
} }
if(!listeners.contains(listener)) { if (!listeners.contains(listener)) {
listeners.add(listener); listeners.add(listener);
} }
} }
public List<AdviceListener> queryTraceAdviceListeners(String className, String owner, String methodName, String methodDesc) { public List<AdviceListener> queryTraceAdviceListeners(String className, String owner, String methodName,
String methodDesc) {
className = className.replace('/', '.'); className = className.replace('/', '.');
String key = keyForTrace(className, owner, methodName, methodDesc); String key = keyForTrace(className, owner, methodName, methodDesc);
@ -150,6 +156,7 @@ public class AdviceListenerManager {
public static void registerAdviceListener(ClassLoader classLoader, String className, String methodName, public static void registerAdviceListener(ClassLoader classLoader, String className, String methodName,
String methodDesc, AdviceListener listener) { String methodDesc, AdviceListener listener) {
classLoader = wrap(classLoader);
className = className.replace('/', '.'); className = className.replace('/', '.');
ClassLoaderAdviceListenerManager manager = adviceListenerMap.get(classLoader); ClassLoaderAdviceListenerManager manager = adviceListenerMap.get(classLoader);
@ -167,6 +174,7 @@ public class AdviceListenerManager {
public static List<AdviceListener> queryAdviceListeners(ClassLoader classLoader, String className, public static List<AdviceListener> queryAdviceListeners(ClassLoader classLoader, String className,
String methodName, String methodDesc) { String methodName, String methodDesc) {
classLoader = wrap(classLoader);
className = className.replace('/', '.'); className = className.replace('/', '.');
ClassLoaderAdviceListenerManager manager = adviceListenerMap.get(classLoader); ClassLoaderAdviceListenerManager manager = adviceListenerMap.get(classLoader);
@ -177,8 +185,9 @@ public class AdviceListenerManager {
return null; return null;
} }
public static void registerTraceAdviceListener(ClassLoader classLoader, String className, String owner, String methodName, public static void registerTraceAdviceListener(ClassLoader classLoader, String className, String owner,
String methodDesc, AdviceListener listener) { String methodName, String methodDesc, AdviceListener listener) {
classLoader = wrap(classLoader);
className = className.replace('/', '.'); className = className.replace('/', '.');
ClassLoaderAdviceListenerManager manager = adviceListenerMap.get(classLoader); ClassLoaderAdviceListenerManager manager = adviceListenerMap.get(classLoader);
@ -189,8 +198,10 @@ public class AdviceListenerManager {
} }
manager.registerTraceAdviceListener(className, owner, methodName, methodDesc, listener); manager.registerTraceAdviceListener(className, owner, methodName, methodDesc, listener);
} }
public static List<AdviceListener> queryTraceAdviceListeners(ClassLoader classLoader, String className, String owner,
String methodName, String methodDesc) { public static List<AdviceListener> queryTraceAdviceListeners(ClassLoader classLoader, String className,
String owner, String methodName, String methodDesc) {
classLoader = wrap(classLoader);
className = className.replace('/', '.'); className = className.replace('/', '.');
ClassLoaderAdviceListenerManager manager = adviceListenerMap.get(classLoader); ClassLoaderAdviceListenerManager manager = adviceListenerMap.get(classLoader);
@ -200,4 +211,15 @@ public class AdviceListenerManager {
return null; return null;
} }
private static ClassLoader wrap(ClassLoader classLoader) {
if (classLoader != null) {
return classLoader;
}
return FAKEBOOTSTRAPCLASSLOADER;
}
private static class FakeBootstrapClassLoader extends ClassLoader {
}
} }

Loading…
Cancel
Save