런타임시 메서드 호출을 동적으로 래핑하는 데 사용할 수있는 기술은 무엇입니까? 예를 들어, 사용자가 코드를 전혀 변경하지 않고도 일부 타이밍 정보와 함께 foo()
메서드에 대한 호출을 래핑하려고한다고 가정합니다.런타임시 메서드 호출 랩
0
A
답변
1
인터페이스의 경우 java.lang.reflect.Proxy, 수업의 경우 cglib입니다.
희망이 있습니다.
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
관련 문제
- 1. 런타임시 메서드 호출
- 2. 비동기 메서드 랩
- 3. EF 메서드 랩
- 4. 연산자 오버랩 메서드 랩
- 5. 런타임시 메서드 구현 선택
- 6. 런타임시 메서드/함수 수정
- 7. 런타임시 동적 메소드 호출
- 8. 런타임시 호출 방법
- 9. 런타임시 이름으로 함수 호출
- 10. .NET에서 런타임시 스왑 메서드 구현?
- 11. 런타임시 메서드 인터셉터를 비활성화하는 방법
- 12. 런타임시 자동으로 메서드 콜백을 생성합니까?
- 13. 자바 메서드(). 메서드() 호출
- 14. 메서드 호출
- 15. 메서드 호출
- 16. 메서드 호출
- 17. 메서드 호출
- 18. C# 메서드 런타임시 멤버 해상도 숨기기
- 19. JAXB 랩 랩 모음
- 20. 리플렉션을 사용하여 동적으로 메서드 호출
- 21. 동일한 메서드 내에서 메서드 호출?
- 22. 다른 메서드 호출 제한 메서드
- 23. 메서드 내부 메서드 호출 방법
- 24. 다른 메서드 내에서 메서드 호출
- 25. 자식에서 부모 :: 메서드 호출 :: 메서드
- 26. 제네릭 메서드 - 다른 메서드 호출
- 27. 랩
- 28. 랩
- 29. UIButton에서 대상으로 호출 메서드 호출
- 30. 호출 된 개체에서 메서드 호출
당신이됩니다 JavaEE 또는 JavaSE 사용? – Simon
답변이 변경 되었습니까? – imrichardcole