diff --git a/src/main/java/com/profiler/interceptor/LoggingInterceptor.java b/src/main/java/com/profiler/interceptor/LoggingInterceptor.java index ec63d37cd..85fc1b846 100644 --- a/src/main/java/com/profiler/interceptor/LoggingInterceptor.java +++ b/src/main/java/com/profiler/interceptor/LoggingInterceptor.java @@ -13,16 +13,16 @@ public class LoggingInterceptor implements StaticAroundInterceptor { } @Override - public void before(Object target, String className, String methodName, Object[] args) { + public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { if (logger.isLoggable(Level.INFO)) { - logger.info("before target:" + target.toString() + " " + className + "." + methodName + " args:" + Arrays.toString(args)); + logger.info("before " + target.toString() + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args)); } } @Override - public void after(Object target, String className, String methodName, Object[] args, Object result) { + public void after(Object target, String className, String methodName, String parameterDescription, Object[] args, Object result) { if (logger.isLoggable(Level.INFO)) { - logger.info("after target:" + target.toString() + " " + className + "." + methodName + " args:" + Arrays.toString(args) + " result:" + result); + logger.info("after " + target.toString() + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args) + " result:" + result); } } } diff --git a/src/main/java/com/profiler/interceptor/StaticAfterInterceptor.java b/src/main/java/com/profiler/interceptor/StaticAfterInterceptor.java index f358d73f5..a225d12b6 100644 --- a/src/main/java/com/profiler/interceptor/StaticAfterInterceptor.java +++ b/src/main/java/com/profiler/interceptor/StaticAfterInterceptor.java @@ -1,5 +1,5 @@ package com.profiler.interceptor; public interface StaticAfterInterceptor extends Interceptor { - void after(Object target, String className, String methodName, Object[] args, Object result); + void after(Object target, String className, String methodName, String parameterDescription, Object[] args, Object result); } diff --git a/src/main/java/com/profiler/interceptor/StaticBeforeInterceptor.java b/src/main/java/com/profiler/interceptor/StaticBeforeInterceptor.java index 95379cb91..df006b3dd 100644 --- a/src/main/java/com/profiler/interceptor/StaticBeforeInterceptor.java +++ b/src/main/java/com/profiler/interceptor/StaticBeforeInterceptor.java @@ -1,5 +1,5 @@ package com.profiler.interceptor; public interface StaticBeforeInterceptor extends Interceptor { - void before(Object target, String className, String methodName, Object[] args); + void before(Object target, String className, String methodName, String parameterDescription, Object[] args); } diff --git a/src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java b/src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java index 7ed354b55..e7eff643e 100644 --- a/src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java +++ b/src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java @@ -5,6 +5,7 @@ import java.util.Formatter; import java.util.logging.Level; import java.util.logging.Logger; +import com.profiler.util.JavaAssistUtils; import javassist.*; import com.profiler.interceptor.Interceptor; @@ -196,12 +197,15 @@ public class JavaAssistClass implements InstrumentClass { } private void addStaticAfterInterceptor(String methodName, int id, CtBehavior behavior) throws NotFoundException, CannotCompileException { - StringBuilder after = new StringBuilder(1024); + + String target = getTarget(behavior); + String returnType = getReturnType(behavior); + String parameterTypeString = JavaAssistUtils.getParameterDescription(behavior.getParameterTypes()); + + StringBuilder after = new StringBuilder(1024); after.append("{"); format(after, " %1$s interceptor = (%1$s) com.profiler.interceptor.InterceptorRegistry.getInterceptor(%2$d);", StaticAfterInterceptor.class.getName(), id); - String target = getTarget(behavior); - String returnType = getReturnType(behavior); - format(after, " interceptor.after(%1$s, \"%2$s\", \"%3$s\", $args, %4$s);", target, ctClass.getName(), methodName, returnType); + format(after, " interceptor.after(%1$s, \"%2$s\", \"%3$s\", \"%4$s\", $args, %5$s);", target, ctClass.getName(), methodName, parameterTypeString, returnType); after.append("}"); String buildAfter = after.toString(); if (logger.isLoggable(Level.INFO)) { @@ -213,7 +217,7 @@ public class JavaAssistClass implements InstrumentClass { StringBuilder catchCode = new StringBuilder(1024); catchCode.append("{"); format(catchCode, " %1$s interceptor = (%1$s) com.profiler.interceptor.InterceptorRegistry.getInterceptor(%2$d);", StaticAfterInterceptor.class.getName(), id); - format(catchCode, " interceptor.after(%1$s, \"%2$s\", \"%3$s\", $args, $e);", target, ctClass.getName(), methodName); + format(catchCode, " interceptor.after(%1$s, \"%2$s\", \"%3$s\", \"%4$s\", $args, $e);", target, ctClass.getName(), methodName, parameterTypeString); catchCode.append(" throw $e;"); catchCode.append("}"); String buildCatch = catchCode.toString(); @@ -249,12 +253,14 @@ public class JavaAssistClass implements InstrumentClass { return java.lang.reflect.Modifier.isStatic(modifiers); } - private void addStaticBeforeInterceptor(String methodName, int id, CtBehavior behavior) throws CannotCompileException { + private void addStaticBeforeInterceptor(String methodName, int id, CtBehavior behavior) throws CannotCompileException, NotFoundException { StringBuilder code = new StringBuilder(1024); code.append("{"); format(code, " %1$s interceptor = (%1$s) com.profiler.interceptor.InterceptorRegistry.getInterceptor(%2$d);", StaticBeforeInterceptor.class.getName(), id); String target = getTarget(behavior); - format(code, " interceptor.before(%1$s, \"%2$s\", \"%3$s\", $args);", target, ctClass.getName(), methodName); + // 인터셉터 호출시 최대한 연산량을 줄이기 위해서 정보는 가능한 정적 데이터로 생성한다. + String parameterDescription = JavaAssistUtils.getParameterDescription(behavior.getParameterTypes()); + format(code, " interceptor.before(%1$s, \"%2$s\", \"%3$s\", \"%4$s\", $args);", target, ctClass.getName(), methodName, parameterDescription ); code.append("}"); String buildBefore = code.toString(); if (logger.isLoggable(Level.INFO)) { diff --git a/src/main/java/com/profiler/modifier/connector/interceptors/ExecuteMethodInterceptor.java b/src/main/java/com/profiler/modifier/connector/interceptors/ExecuteMethodInterceptor.java index c7174e46e..0e9d1f067 100644 --- a/src/main/java/com/profiler/modifier/connector/interceptors/ExecuteMethodInterceptor.java +++ b/src/main/java/com/profiler/modifier/connector/interceptors/ExecuteMethodInterceptor.java @@ -26,7 +26,7 @@ import com.profiler.interceptor.StaticAroundInterceptor; public class ExecuteMethodInterceptor implements StaticAroundInterceptor { @Override - public void before(Object target, String className, String methodName, Object[] args) { + public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { System.out.println("\n\n\n\nINVOKE HTTP START ----------------------------------------------------------------------------------------------------------------------------------------------------"); HttpHost host = (HttpHost) args[0]; @@ -50,7 +50,7 @@ public class ExecuteMethodInterceptor implements StaticAroundInterceptor { } @Override - public void after(Object target, String className, String methodName, Object[] args, Object result) { + public void after(Object target, String className, String methodName, String parameterDescription, Object[] args, Object result) { Trace.record(Annotation.ClientRecv, StopWatch.stopAndGetElapsed("ExecuteMethodInterceptor")); System.out.println("\n\n\n\nINVOKE HTTP END ----------------------------------------------------------------------------------------------------------------------------------------------------"); } diff --git a/src/main/java/com/profiler/modifier/db/cubrid/CubridStatementModifier.java b/src/main/java/com/profiler/modifier/db/cubrid/CubridStatementModifier.java index c4dac1be3..37287c898 100644 --- a/src/main/java/com/profiler/modifier/db/cubrid/CubridStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/cubrid/CubridStatementModifier.java @@ -38,12 +38,12 @@ public class CubridStatementModifier extends AbstractModifier { StaticAroundInterceptor interceptor = new StaticAroundInterceptor() { @Override - public void after(Object target, String className, String methodName, Object[] args, Object result) { + public void after(Object target, String className, String methodName, String parameterDescription, Object[] args, Object result) { DatabaseRequestTracer.putSqlQuery(TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY, (String) args[0]); } @Override - public void before(Object target, String className, String methodName, Object[] args) { + public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { DatabaseRequestTracer.put(TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY);; } }; diff --git a/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java b/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java index d0490cee0..f82b1beb0 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java @@ -53,7 +53,7 @@ public class MySQLPreparedStatementModifier extends AbstractModifier { CtClass cc = classPool.get(javassistClassName); updateSetInternalMethod(cc); - updateExecuteQueryMethod(cc); + updateExecuteQueryMethod(cc); updateConstructor(cc); printClassConvertComplete(javassistClassName); diff --git a/src/main/java/com/profiler/modifier/db/mysql/interceptors/CloseConnectionInterceptor.java b/src/main/java/com/profiler/modifier/db/mysql/interceptors/CloseConnectionInterceptor.java index a053ec2db..f45a381c4 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/interceptors/CloseConnectionInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/mysql/interceptors/CloseConnectionInterceptor.java @@ -13,9 +13,9 @@ public class CloseConnectionInterceptor implements StaticBeforeInterceptor { private final Logger logger = Logger.getLogger(CloseConnectionInterceptor.class.getName()); - public void before(Object target, String className, String methodName, Object[] args) { + public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { if (logger.isLoggable(Level.INFO)) { - logger.info("before className:" + className + " methodName:" + methodName + " args:" + Arrays.toString(args)); + logger.info("before " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args)); } if (target instanceof Connection) { diff --git a/src/main/java/com/profiler/modifier/db/mysql/interceptors/CreateConnectionInterceptor.java b/src/main/java/com/profiler/modifier/db/mysql/interceptors/CreateConnectionInterceptor.java index 1961a8fef..6d65fae8e 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/interceptors/CreateConnectionInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/mysql/interceptors/CreateConnectionInterceptor.java @@ -14,9 +14,9 @@ public class CreateConnectionInterceptor implements StaticAfterInterceptor { private final Logger logger = Logger.getLogger(CreateConnectionInterceptor.class.getName()); @Override - public void after(Object target, String className, String methodName, Object[] args, Object result) { + public void after(Object target, String className, String methodName, String parameterDescription, Object[] args, Object result) { if (logger.isLoggable(Level.INFO)) { - logger.info("after className:" + className + " methodName:" + methodName + " args:" + Arrays.toString(args) + " result:" + result); + logger.info("after " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args) + " result:" + result); } if (InterceptorUtils.isThrowable(result)) { diff --git a/src/main/java/com/profiler/modifier/db/mysql/interceptors/CreateStatementInterceptor.java b/src/main/java/com/profiler/modifier/db/mysql/interceptors/CreateStatementInterceptor.java index 706ff1a31..9d32b2fad 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/interceptors/CreateStatementInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/mysql/interceptors/CreateStatementInterceptor.java @@ -18,9 +18,9 @@ public class CreateStatementInterceptor implements StaticAfterInterceptor { private Method setUrl = null; @Override - public void after(Object target, String className, String methodName, Object[] args, Object result) { + public void after(Object target, String className, String methodName, String parameterDescription, Object[] args, Object result) { if (logger.isLoggable(Level.INFO)) { - logger.info("after className:" + className + " methodName:" + methodName + " args:" + Arrays.toString(args) + " result:" + result); + logger.info("after " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args) + " result:" + result); } if (Trace.getCurrentTraceId() == null) { return; diff --git a/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteQueryMethodInterceptor.java b/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteQueryMethodInterceptor.java index b94d3065f..2ebf77485 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteQueryMethodInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteQueryMethodInterceptor.java @@ -4,12 +4,9 @@ import com.profiler.StopWatch; import com.profiler.context.Annotation; import com.profiler.context.Trace; import com.profiler.interceptor.StaticAroundInterceptor; -import com.profiler.util.ReflectionUtils; -import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.net.URL; import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; @@ -26,9 +23,9 @@ public class ExecuteQueryMethodInterceptor implements StaticAroundInterceptor { private Method getUrl = null; @Override - public void before(Object target, String className, String methodName, Object[] args) { + public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { if (logger.isLoggable(Level.INFO)) { - logger.info("before className:" + className + " methodName:" + methodName + " args:" + Arrays.toString(args)); + logger.info("before " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args)); } if (Trace.getCurrentTraceId() == null) { return; @@ -41,10 +38,6 @@ public class ExecuteQueryMethodInterceptor implements StaticAroundInterceptor { String url = getUrl(target); Trace.recordRpcName("mysql", url); - // - // TODO: add destination address - // - if (args.length > 0) { Trace.recordAttibute("Query", args[0]); } @@ -59,6 +52,7 @@ public class ExecuteQueryMethodInterceptor implements StaticAroundInterceptor { private String getUrl(Object target) { try { + // TODO classloading 시 해당 mehtod를 한번에 가져올수 없는지 검토. if(getUrl == null) { getUrl = target.getClass().getMethod("__getUrl"); } @@ -80,9 +74,9 @@ public class ExecuteQueryMethodInterceptor implements StaticAroundInterceptor { } @Override - public void after(Object target, String className, String methodName, Object[] args, Object result) { + public void after(Object target, String className, String methodName, String parameterDescription, Object[] args, Object result) { if (logger.isLoggable(Level.INFO)) { - logger.info("after className:" + className + " methodName:" + methodName + " args:" + Arrays.toString(args) + " result:" + result); + logger.info("after " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args) + " result:" + result); } if (Trace.getCurrentTraceId() == null) { diff --git a/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteUpdateMethodInterceptor.java b/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteUpdateMethodInterceptor.java index 505977bd6..d112652cf 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteUpdateMethodInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteUpdateMethodInterceptor.java @@ -15,7 +15,7 @@ import com.profiler.interceptor.StaticAroundInterceptor; public class ExecuteUpdateMethodInterceptor implements StaticAroundInterceptor { @Override - public void before(Object target, String className, String methodName, Object[] args) { + public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { System.out.println("ExecuteUpdateMethodInterceptor.before"); try { /** @@ -44,7 +44,7 @@ public class ExecuteUpdateMethodInterceptor implements StaticAroundInterceptor { } @Override - public void after(Object target, String className, String methodName, Object[] args, Object result) { + public void after(Object target, String className, String methodName, String parameterDescription, Object[] args, Object result) { System.out.println("ExecuteUpdateMethodInterceptor.after"); if (Trace.getCurrentTraceId() == null) { return; diff --git a/src/main/java/com/profiler/modifier/tomcat/interceptors/InvokeMethodInterceptor.java b/src/main/java/com/profiler/modifier/tomcat/interceptors/InvokeMethodInterceptor.java index 299d5bc22..235a8d9c5 100644 --- a/src/main/java/com/profiler/modifier/tomcat/interceptors/InvokeMethodInterceptor.java +++ b/src/main/java/com/profiler/modifier/tomcat/interceptors/InvokeMethodInterceptor.java @@ -18,7 +18,7 @@ import com.profiler.util.NumberUtils; public class InvokeMethodInterceptor implements StaticAroundInterceptor { @Override - public void before(Object target, String className, String methodName, Object[] args) { + public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { try { HttpServletRequest request = (HttpServletRequest) args[0]; String requestURL = request.getRequestURI(); @@ -50,7 +50,7 @@ public class InvokeMethodInterceptor implements StaticAroundInterceptor { } @Override - public void after(Object target, String className, String methodName, Object[] args, Object result) { + public void after(Object target, String className, String methodName, String parameterDescription, Object[] args, Object result) { // TODO result 가 Exception 타입일경우 호출 실패임. Trace.record(Annotation.ServerSend, StopWatch.stopAndGetElapsed("InvokeMethodInterceptor-starttime")); RequestTracer.endTransaction(); diff --git a/src/main/java/com/profiler/util/JavaAssistUtils.java b/src/main/java/com/profiler/util/JavaAssistUtils.java new file mode 100644 index 000000000..6a231bece --- /dev/null +++ b/src/main/java/com/profiler/util/JavaAssistUtils.java @@ -0,0 +1,39 @@ +package com.profiler.util; + +import javassist.CtClass; + +public class JavaAssistUtils { + /** + * test(int, java.lang.String) 일경우 + * (int, java.lang.String)로 생성된다. + * @param params + * @return + */ + public static String getParameterDescription(CtClass[] params) { + StringBuilder sb = new StringBuilder(); + sb.append("("); + if (params != null) { + for (int i = 0; i < params.length; i++) { + sb.append(params[i].getName()); + if (i < (params.length - 1)) + sb.append(", "); + } + } + sb.append(")"); + return sb.toString(); + } + + public static String getParameterDescription(Class[] params) { + StringBuilder sb = new StringBuilder(); + sb.append("("); + if (params != null) { + for (int i = 0; i < params.length; i++) { + sb.append(params[i].getName()); + if (i < (params.length - 1)) + sb.append(", "); + } + } + sb.append(")"); + return sb.toString(); + } +} diff --git a/src/main/java/com/profiler/util/NamedThreadLocal.java b/src/main/java/com/profiler/util/NamedThreadLocal.java index 0ded4ab39..1f407b422 100644 --- a/src/main/java/com/profiler/util/NamedThreadLocal.java +++ b/src/main/java/com/profiler/util/NamedThreadLocal.java @@ -1,6 +1,7 @@ package com.profiler.util; /** + * NamedThreadLocal 사용시 thread local leak 발생시 추적이 쉬움 * @author emeroad */ public class NamedThreadLocal extends ThreadLocal { diff --git a/src/test/java/com/profiler/interceptor/TestAfterInterceptor.java b/src/test/java/com/profiler/interceptor/TestAfterInterceptor.java index 86e73a0e3..b2f72b526 100644 --- a/src/test/java/com/profiler/interceptor/TestAfterInterceptor.java +++ b/src/test/java/com/profiler/interceptor/TestAfterInterceptor.java @@ -14,8 +14,8 @@ public class TestAfterInterceptor implements StaticAfterInterceptor { public Object result; @Override - public void after(Object target, String className, String methodName, Object[] args, Object result) { - logger.info("after target:" + target + " className:" + className + " methodName:" + methodName + " args:" + Arrays.toString(args)); + public void after(Object target, String className, String methodName, String parameterDescription, Object[] args, Object result) { + logger.info("after target:" + target + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args)); this.target = target; this.className = className; this.methodName = methodName; diff --git a/src/test/java/com/profiler/interceptor/TestAroundInterceptor.java b/src/test/java/com/profiler/interceptor/TestAroundInterceptor.java index 693932dc9..45802a21f 100644 --- a/src/test/java/com/profiler/interceptor/TestAroundInterceptor.java +++ b/src/test/java/com/profiler/interceptor/TestAroundInterceptor.java @@ -6,13 +6,13 @@ public class TestAroundInterceptor implements StaticAroundInterceptor { public TestAfterInterceptor after = new TestAfterInterceptor(); @Override - public void before(Object target, String className, String methodName, Object[] args) { - before.before(target, className, methodName, args); + public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { + before.before(target, className, methodName, parameterDescription, args); } @Override - public void after(Object target, String className, String methodName, Object[] args, Object result) { - after.after(target, className, methodName, args, result); + public void after(Object target, String className, String methodName, String parameterDescription, Object[] args, Object result) { + after.after(target, className, methodName, parameterDescription, args, result); } diff --git a/src/test/java/com/profiler/interceptor/TestBeforeInterceptor.java b/src/test/java/com/profiler/interceptor/TestBeforeInterceptor.java index 983a64dd6..599cc7f91 100644 --- a/src/test/java/com/profiler/interceptor/TestBeforeInterceptor.java +++ b/src/test/java/com/profiler/interceptor/TestBeforeInterceptor.java @@ -1,7 +1,5 @@ package com.profiler.interceptor; -import com.profiler.interceptor.StaticBeforeInterceptor; - import java.util.Arrays; import java.util.logging.Logger; @@ -15,8 +13,8 @@ public class TestBeforeInterceptor implements StaticBeforeInterceptor { public Object[] args; @Override - public void before(Object target, String className, String methodName, Object[] args) { - logger.info("before target:" + target + " className:" + className + " methodName:" + methodName + " args:" + Arrays.toString(args)); + public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { + logger.info("before target:" + target + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args)); this.target = target; this.className = className; this.methodName = methodName; diff --git a/src/test/java/com/profiler/interceptor/bci/ReflectionTest.java b/src/test/java/com/profiler/interceptor/bci/ReflectionTest.java index 8eceb384c..2ccc6a3d0 100644 --- a/src/test/java/com/profiler/interceptor/bci/ReflectionTest.java +++ b/src/test/java/com/profiler/interceptor/bci/ReflectionTest.java @@ -1,23 +1,26 @@ package com.profiler.interceptor.bci; -import javassist.ClassPool; -import javassist.CtClass; -import javassist.CtConstructor; -import javassist.NotFoundException; +import javassist.*; +import org.junit.Before; import org.junit.Test; import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.Arrays; public class ReflectionTest { + private ClassPool pool = new ClassPool(); + @Before + public void setUp() throws Exception { + pool.appendSystemPath(); + } + @Test public void test() throws NotFoundException { Constructor[] constructors = String.class.getConstructors(); for(Constructor c: constructors) { System.out.println(c.getName()); } - - ClassPool pool = new ClassPool(); - pool.appendSystemPath(); CtClass ctClass = pool.get("java.lang.String"); CtConstructor[] constructors1 = ctClass.getConstructors(); for(CtConstructor cc : constructors1) { @@ -25,5 +28,25 @@ public class ReflectionTest { System.out.println(cc.getLongName()); System.out.println(cc.getSignature()); } + + + } + @Test + public void methodName() throws NotFoundException, ClassNotFoundException, NoSuchMethodException { + CtClass ctClass = pool.get("java.lang.String"); + + CtMethod subString = ctClass.getDeclaredMethod("substring", new CtClass[]{pool.get("int")}); + System.out.println("getLongName:" + subString.getLongName()); + System.out.println("getName:"+ subString.getName()); + System.out.println("getDescriptor:"+ subString.getMethodInfo().getDescriptor()); + System.out.println("getDescriptor2:"+ subString.getMethodInfo2().getDescriptor()); + System.out.println("getSignature:"+ subString.getSignature()); + + + Method substring = String.class.getMethod("substring", int.class); + System.out.println(substring.toString()); + System.out.println(Arrays.toString(substring.getParameterTypes())); + +// M } } diff --git a/src/test/java/com/profiler/modifier/tomcat/InvokeMethodInterceptorTest.java b/src/test/java/com/profiler/modifier/tomcat/InvokeMethodInterceptorTest.java index 689306c17..01c84c9e5 100644 --- a/src/test/java/com/profiler/modifier/tomcat/InvokeMethodInterceptorTest.java +++ b/src/test/java/com/profiler/modifier/tomcat/InvokeMethodInterceptorTest.java @@ -33,11 +33,11 @@ public class InvokeMethodInterceptorTest { InvokeMethodInterceptor interceptor = new InvokeMethodInterceptor(); - interceptor.before("target", "classname", "methodname", new Object[] { request, response }); - interceptor.after("target", "classname", "methodname", new Object[] { request, response }, new Object()); + interceptor.before("target", "classname", "methodname", null, new Object[] { request, response }); + interceptor.after("target", "classname", "methodname", null, new Object[] { request, response }, new Object()); - interceptor.before("target", "classname", "methodname", new Object[] { request, response }); - interceptor.after("target", "classname", "methodname", new Object[] { request, response }, new Object()); + interceptor.before("target", "classname", "methodname", null, new Object[] { request, response }); + interceptor.after("target", "classname", "methodname", null, new Object[] { request, response }, new Object()); } @Test @@ -58,10 +58,10 @@ public class InvokeMethodInterceptorTest { InvokeMethodInterceptor interceptor = new InvokeMethodInterceptor(); - interceptor.before("target", "classname", "methodname", new Object[] { request, response }); - interceptor.after("target", "classname", "methodname", new Object[] { request, response }, new Object()); + interceptor.before("target", "classname", "methodname", null, new Object[] { request, response }); + interceptor.after("target", "classname", "methodname", null, new Object[] { request, response }, new Object()); - interceptor.before("target", "classname", "methodname", new Object[] { request, response }); - interceptor.after("target", "classname", "methodname", new Object[] { request, response }, new Object()); + interceptor.before("target", "classname", "methodname", null, new Object[] { request, response }); + interceptor.after("target", "classname", "methodname", null, new Object[] { request, response }, new Object()); } } diff --git a/src/test/java/com/profiler/util/JavaAssistUtilsTest.java b/src/test/java/com/profiler/util/JavaAssistUtilsTest.java new file mode 100644 index 000000000..a135ebee7 --- /dev/null +++ b/src/test/java/com/profiler/util/JavaAssistUtilsTest.java @@ -0,0 +1,42 @@ +package com.profiler.util; + +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.logging.Logger; + +public class JavaAssistUtilsTest { + private final Logger logger = Logger.getLogger(JavaAssistUtilsTest.class.getName()); + private ClassPool pool; + + @Before + public void setUp() throws Exception { + pool = new ClassPool(); + pool.appendSystemPath(); + } + + @Test + public void testGetParameterDescription() throws Exception { + CtClass ctClass = pool.get("java.lang.String"); + CtMethod substring = ctClass.getDeclaredMethod("substring", new CtClass[]{CtClass.intType}); + + String ctDescription = JavaAssistUtils.getParameterDescription(substring.getParameterTypes()); + logger.info(ctDescription); + + String clsDescription = JavaAssistUtils.getParameterDescription(new Class[]{int.class}); + logger.info(clsDescription); + Assert.assertEquals(ctDescription, clsDescription); + } + + @Test + public void testGetParameterDescription2() throws Exception { + String clsDescription = JavaAssistUtils.getParameterDescription(new Class[]{String.class, Integer.class}); + logger.info(clsDescription); + Assert.assertEquals("(java.lang.String, java.lang.Integer)", clsDescription); + } + +}