자바 에이전트,dubbo 그 레이스 케 일 발표 데모 실현
6428 단어 자바
package com.zcm.transform.premain;
import javassist.*;
import java.io.File;
import java.io.IOException;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.net.URISyntaxException;
import java.net.URL;
import java.security.ProtectionDomain;
import java.util.*;
import java.util.jar.JarFile;
/**
*
*
* @author cm
* @myblog xx
* @create 2018 4 21
*/
public class DubboTransformer extends BaseTransformer implements ClassFileTransformer {
final static String prefix = "
long startTime = System.currentTimeMillis();
";
final static String postfix = "
long endTime = System.currentTimeMillis();
";
//
final static Map> methodMap = new HashMap>();
static boolean hasIn = false;
ClassLoader dubboTransformClassLoader;
String agentOps;
Instrumentation inst;
public DubboTransformer() {
add("com.zcm.service.impl.IDogImpl",ROUTER);
add("com.alibaba.dubbo.config.ReferenceConfig", ROUTER);
add("com.alibaba.dubbo.config.ApplicationConfig", ROUTER);
//add("com.alibaba.dubbo.config.ConsumerConfig", ROUTER);
add("com.alibaba.dubbo.config.ServiceConfig", DYNAMIC_GROUP);
dubboTransformClassLoader = DubboTransformer.class.getClassLoader();
}
public DubboTransformer(String agentOps, Instrumentation inst){
this();
this.agentOps = agentOps;
this.inst = inst;
try {
String filePath = "C:\\Users\\ody\\workspace\\jim-framework-master\\full-link-log\\web\\target\\web-1.2-SNAPSHOT\\WEB-INF\\lib\\dubbo-2.6.0.jar";
String filePath1 = "C:\\Users\\ody\\workspace\\jim-framework-master\\full-link-log\\web\\target\\web-1.2-SNAPSHOT\\WEB-INF\\lib\\javassist-3.20.0-GA.jar";
JarFile jarFile = new JarFile(filePath);
//inst.appendToBootstrapClassLoaderSearch(jarFile);
//inst.appendToSystemClassLoaderSearch(jarFile);
//inst.appendToSystemClassLoaderSearch(new JarFile(filePath1));
//SimpleLoadAJar.addJar(filePath);
//SimpleLoadAJar.addJar(filePath1);
} catch (IOException e) {
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
}
private void add(String clazzString,String method) {
methodMap.put(clazzString, Arrays.asList(method));
}
public static final String DYNAMIC_GROUP = "dynamicGroup";
public static final String ROUTER = "router";
@Override
public byte[] transform(ClassLoader loader, String className, Class> classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
className = className.replace("/", ".");
if (methodMap.containsKey(className)) {// class
CtClass ctclass = null;
ensureAdditionalJar( loader);
try {
ctclass = ClassPool.getDefault().get(className);// ,
List methods = methodMap.get(className);
if (methods != null){
for (String method : methods){
addAdditionMethod(ctclass,method,method);
}
}
return ctclass.toBytecode();
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
return null;
}
private void ensureAdditionalJar( ClassLoader classLoader) {
if ( !hasIn ){
hasIn = true;
}else {
return ;
}
if (classLoader == dubboTransformClassLoader){
return;
}
for (String className : Arrays.asList("com/alibaba/dubbo/config/ApplicationConfig.class","javassist/ClassPool.class")){
URL url = classLoader.getResource(className);
if ( url == null){
System.err.println(" can not found dubbo.jar in " + classLoader);
continue;
}
System.out.println(url);
inst.appendToSystemClassLoaderSearch(convertUrl2jarFile(url));
}
}
private JarFile convertUrl2jarFile(URL url) {
String filePath = url.getPath();
try {
int index = filePath.indexOf("!");
if (index > -1){
filePath = filePath.substring(5,index);
return new JarFile(filePath);
}
File file = new File( url.toURI());
System.out.println("..");
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private CtClass addAdditionMethod(CtClass ctClass , String methodKey , String systemPropertyKey){
String methodName = "get" + methodKey.substring(0,1).toUpperCase() + methodKey.substring(1);
CtMethod method = null;
try {
CtMethod ctmethod = ctClass.getDeclaredMethod(methodName);
if (ctmethod != null){
System.err.println(ctClass + " has got " + method);
return ctClass ;
}
}catch (Exception e){
// no method
}
try {
method = new CtMethod(ClassPool.getDefault().get("java.lang.String"), methodName, new CtClass[]{}, ctClass);
method.setModifiers(Modifier.PUBLIC);
String methodContent = "{return System.getProperty(\"" + systemPropertyKey + "\");}";
//methodContent = "{return System.getProperty(\"hah\");}";
method.setBody(methodContent);
ctClass.addMethod(method);
}catch (Exception e){
System.err.println(" agent dynamic add method error");
e.printStackTrace();
}
return ctClass;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.