2015-01-23 3 views
0

런타임시 메서드 호출을 동적으로 래핑하는 데 사용할 수있는 기술은 무엇입니까? 예를 들어, 사용자가 코드를 전혀 변경하지 않고도 일부 타이밍 정보와 함께 foo() 메서드에 대한 호출을 래핑하려고한다고 가정합니다.런타임시 메서드 호출 랩

+0

당신이됩니다 JavaEE 또는 JavaSE 사용? – Simon

+0

답변이 변경 되었습니까? – imrichardcole

답변

1

응용 프로그램의 모든 위치에서 전화를 랩하려면 간단한 JavaAgent 작성을 고려할 수 있습니다. 예를 들어, Javassist를 사용하여 메소드가 호출되기 전이나 후에 특정 메소드를 호출 할 수 있습니다. 다음 예제 광고는 특정 클래스의 모든 메소드에 대한 추적 호출입니다.

import java.io.IOException; 
import java.lang.instrument.ClassFileTransformer; 
import java.lang.instrument.IllegalClassFormatException; 
import java.security.ProtectionDomain; 

import javassist.CannotCompileException; 
import javassist.ClassPool; 
import javassist.CtClass; 
import javassist.CtMethod; 
import javassist.NotFoundException; 

public class MethodTraceTransformer implements ClassFileTransformer { 

    public byte[] transform(ClassLoader loader, String className, 
     Class<?> classBeingRedefined, ProtectionDomain protectionDomain, 
     byte[] classfileBuffer) throws IllegalClassFormatException { 

     byte[] byteCode = classfileBuffer; 

     if (className.equals("<The class you want to instrument>")) { 
      try { 
       byteCode = addTracer(className.replace("/", ".")); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
     } 

     return byteCode; 
    } 

    private byte[] addTracer(String classname) throws NotFoundException, 
     CannotCompileException, IOException { 
     CtClass clazz = ClassPool.getDefault().get(classname); 

     CtMethod[] methods = clazz.getDeclaredMethods(); 
     for (CtMethod c : methods) { 
      c.insertBefore(TraceLogger.class.getName() 
        + ".get().logTrace($args);"); 
     } 

     byte[] byteCode = clazz.toBytecode(); 
     clazz.detach(); 
     return byteCode; 
    } 
} 
당신은 여기에 더 광범위한 자습서를 찾을 수 있습니다

: 당신은 당신의 방법의 실행 시간을 측정하려면 http://blog.javabenchmark.org/2013/05/java-instrumentation-tutorial.html

것은, AspectJ를 같은 것을 사용하는 것이 더 쉬울 수 있습니다 http://www.pabloguerrero.org/cgblog/9/15/Monitor-Java-methods-memory-usage-and-execution-time-with-AspectJ