From 398e6a4e00d46cb189847ad2cf04fa86d75d8b3e Mon Sep 17 00:00:00 2001 From: Woonduk Kang Date: Wed, 16 Oct 2013 05:25:17 +0000 Subject: [PATCH] =?UTF-8?q?[=EA=B0=95=EC=9A=B4=EB=8D=95]=20[LUCYSUS-1744]?= =?UTF-8?q?=20interceptor=20=EA=B0=95=EC=A0=9C=20classLoader=20define?= =?UTF-8?q?=EC=8B=9C=20superClass=EA=B0=80=20=EC=B6=94=EC=83=81=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=9D=BC=20=EA=B2=BD=EC=9A=B0,?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=ED=95=98=EB=8F=84=EB=A1=9D=20=ED=95=A8.=20=20-=20?= =?UTF-8?q?=EC=99=84=EC=A0=84=ED=95=9C=20=EA=B3=84=EC=B8=B5=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=EB=A5=BC=20=EB=8B=A4=20=ED=8F=AC=ED=95=A8=ED=95=98?= =?UTF-8?q?=EB=A0=A4=EB=A9=B4,=20=EC=BD=94=EB=93=9C=EA=B0=80=20=EB=B3=B5?= =?UTF-8?q?=EC=9E=A1=ED=95=B4=EC=84=9C=20=EC=A0=9C=ED=95=9C=EC=A0=81?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20class=EB=A5=BC=20=EB=A1=9C=EB=93=9C?= =?UTF-8?q?=EC=8B=9C=ED=82=A4=EB=8F=84=EB=A1=9D=20=EB=90=98=EC=96=B4=20?= =?UTF-8?q?=EC=9E=88=EC=9D=8C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://svn.bds.nhncorp.com/pe/hippo-tomcat-profiler/trunk@2530 84d0f5b1-2673-498c-a247-62c4ff18d310 --- .../bci/JavaAssistByteCodeInstrumentor.java | 36 ++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/nhn/pinpoint/profiler/interceptor/bci/JavaAssistByteCodeInstrumentor.java b/src/main/java/com/nhn/pinpoint/profiler/interceptor/bci/JavaAssistByteCodeInstrumentor.java index 6c13cc316..a4f0e8aab 100644 --- a/src/main/java/com/nhn/pinpoint/profiler/interceptor/bci/JavaAssistByteCodeInstrumentor.java +++ b/src/main/java/com/nhn/pinpoint/profiler/interceptor/bci/JavaAssistByteCodeInstrumentor.java @@ -2,6 +2,7 @@ package com.nhn.pinpoint.profiler.interceptor.bci; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Modifier; import java.net.URL; import java.net.URLClassLoader; import java.security.ProtectionDomain; @@ -112,14 +113,18 @@ public class JavaAssistByteCodeInstrumentor implements ByteCodeInstrumentor { logger.info("defineClass class:{}, cl:{}", defineClass, classLoader); } try { -// 아래 classLoaderChecker가 생겼으니 classLoader 를 같이 락으로 잡아야 되지 않는가? -// synchronized (classLoader) - if (this.classLoadChecker.exist(classLoader, defineClass)) { - return classLoader.loadClass(defineClass); - } else { - CtClass clazz = childClassPool.get(defineClass); - defineNestedClass(clazz, classLoader, protectedDomain); - return clazz.toClass(classLoader, protectedDomain); + // classLoader로 락을 잡는게 안전함. + // 어차피 classLoader에서 락을 잡고 들어오는점도 있고. 예외 사항이 발생할수 있기 때문에. + // classLoader의 재진입 락을 잡고 들어오는게 무난함. + synchronized (classLoader) { + if (this.classLoadChecker.exist(classLoader, defineClass)) { + return classLoader.loadClass(defineClass); + } else { + final CtClass clazz = childClassPool.get(defineClass); + defineAbstractSuperClass(clazz, classLoader, protectedDomain); + defineNestedClass(clazz, classLoader, protectedDomain); + return clazz.toClass(classLoader, protectedDomain); + } } } catch (NotFoundException e) { throw new InstrumentException(defineClass + " class not fund. Cause:" + e.getMessage(), e); @@ -130,6 +135,21 @@ public class JavaAssistByteCodeInstrumentor implements ByteCodeInstrumentor { } } + private void defineAbstractSuperClass(CtClass clazz, ClassLoader classLoader, ProtectionDomain protectedDomain) throws NotFoundException, CannotCompileException { + final CtClass superClass = clazz.getSuperclass(); + if (superClass == null) { + // java.lang.Object가 아닌 경우 null은 안나올듯. + return; + } + final int modifiers = superClass.getModifiers(); + if (Modifier.isAbstract(modifiers)) { + if (isInfo) { + logger.info("defineAbstractSuperClass class:{} cl:{}", superClass.getName(), classLoader); + } + superClass.toClass(classLoader, protectedDomain); + } + } + private void defineNestedClass(CtClass clazz, ClassLoader classLoader, ProtectionDomain protectedDomain) throws NotFoundException, CannotCompileException { CtClass[] nestedClasses = clazz.getNestedClasses(); if (nestedClasses.length == 0) {