1

我正在使用 ASM 字节码库来使用 pre-main 来检测 Java 类。我们如何获得执行的方法的名称?提前致谢...

4

2 回答 2

0
Attached my Code for your reference

package com.eg.agent;

import java.lang.instrument.Instrumentation;

public class Agent {
 private Agent(Instrumentation instrumentation){
}

public static void premain(String agentArgs, Instrumentation inst)
{
 EgClassFileTransformer egClassFileTransformer = 
       new EgClassFileTransformer (agentArgs , inst);
}

}

package com.eg.agent;

import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

import org.objectweb.asm.ClassReader;

public class EgClassFileTransformer implements ClassFileTransformer {

    protected String agentArgString = "";
    protected Instrumentation instrumentation;

    public EgClassFileTransformer(String agentArgs, Instrumentation inst){
        agentArgString = agentArgs;
        instrumentation = inst;
        instrumentation.addTransformer(this);
    }

    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, 
            ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException
        {
            //System.out.println("ClassName :"+className);
            InputStream in = loader.getResourceAsStream(className.replace('.', '/') + ".class");
            try{
                ClassReader classReader=new ClassReader(in);
                String superClassName = classReader.getSuperName();
                String[] interfaces = classReader.getInterfaces();
                if(interfaces!=null && interfaces.length > 0){
                    for(int k=0;k<interfaces.length;k++){
                        String inface = interfaces[k];
                        System.out.println(" \t interface :"+inface);
                    }
                }
                //System.out.println("superClassName :"+superClassName);
                ArrayList thisList = new ArrayList();
                thisList.add(superClassName);
                ArrayList superList = printSuperClassNames(superClassName , thisList);
                System.out.println("className :"+className +" ==>"+ " superList :"+superList);
            } catch (IOException e) {
                //e.printStackTrace();
                System.out.println("[EXECEPTION] ..."+className);
            }
            return null;
        }

    public static ArrayList printSuperClassNames(String className, ArrayList list)
    {
        ClassReader cr=null;
        try {
            cr = new ClassReader(className);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String superName = cr.getSuperName();
        //System.out.println("[superName]"+superName);
        if(superName!=null && !superName.equals("java/lang/Object"))
        {
            list.add(superName);
            String superClass = superName.replace('.', '/');
            printSuperClassNames(superClass, list);
        }
        return list;
    }
}
于 2013-02-13T07:49:37.493 回答
0

简而言之,对应的方法调用name上有一个参数。visit*()您必须提供更具体的示例才能获得更详细的答案。

于 2013-02-06T07:02:52.200 回答