main类:public static void main(String[] args) {
File file = new File("e:\\3.txt");
System.out.println(file.getName());
}premain类:public static void premain(String agentArs, Instrumentation inst) throws IOException {
        // 初始化配置
        inst.addTransformer(new ThunisoftClassFileTransformer());
    }转换器类:public byte[] transform(ClassLoader loader, String className,
            Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
            byte[] classfileBuffer) throws IllegalClassFormatException {
        className = className.replace('/', '.'); 
        System.out.println(className);
        return null;
}
拦截什么都不干,只是输出拦截到的类,执行结果只能拦截到以下类,为什么拦截不到File类???贴图有点问题,我就直接贴运行结果了。求大神解答啊,这个拦截的类到底是怎么定义的,是拦截哪些类啊,为什么会没有File类?
java.lang.invoke.Method
java.lang.invoke.Method
java.lang.invoke.Method
java.util.function.Func
java.lang.invoke.Method
java.lang.invoke.Method
java.lang.ClassValue
java.lang.ClassValue$En
java.lang.ClassValue$Id
java.lang.ClassValue$Ve
java.lang.invoke.Member
java.lang.invoke.Method
java.lang.invoke.Method
sun.misc.PostVMInitHook
sun.usagetracker.UsageT
java.util.concurrent.at
sun.usagetracker.UsageT
sun.usagetracker.UsageT
sun.usagetracker.UsageT
java.lang.ProcessEnviro
java.lang.ProcessEnviro
java.lang.ProcessEnviro
java.util.Collections$U
java.lang.ProcessEnviro
java.util.HashMap$Entry
java.lang.ProcessEnviro
java.util.HashMap$Entry
java.lang.ProcessEnviro
sun.usagetracker.UsageT
java.io.FileOutputStrea
sun.launcher.LauncherHe
hello.IOTest
sun.launcher.LauncherHe
3.txt
sun.misc.Signal$1
java.lang.Shutdown
java.lang.Shutdown$Lock

解决方案 »

  1.   

    3.txt那行是复制错了哈,结果没有那一行的
      

  2.   

    java -javaagent agent.jar -jar app.jar
    楼主的app.jar里有用的file类吗?虚拟机没有加载的话,肯定不能transform的
      

  3.   

    唉,看到你这个问题让我想起了在以前那个公司用asm 给安卓做hook的日子。虽然苦逼,不过挺有意思的
      

  4.   

    肯定用了啊,app.jar就是第一段测试代码,main类导出的呀
      

  5.   

    肯定用了啊,app.jar就是第一段测试代码,main类导出的呀
    是想实现哪一种功能呢?你试一下这个:在premain里,看看有没有你要找的类
    inst.getAllLoadedClasses();
      

  6.   

    肯定用了啊,app.jar就是第一段测试代码,main类导出的呀
    是想实现哪一种功能呢?你试一下这个:在premain里,看看有没有你要找的类
    inst.getAllLoadedClasses();
    这个我试过,感觉输出出来的类太多了,不只是加载过的类,感觉JDK里的类都会输出来。
    是想在transform中拦截File类,监控所有涉及了File类传入文件的操作并记录传入的文件到数据库。
      

  7.   

    肯定用了啊,app.jar就是第一段测试代码,main类导出的呀
    是想实现哪一种功能呢?你试一下这个:在premain里,看看有没有你要找的类
    inst.getAllLoadedClasses();
    这个我试过,感觉输出出来的类太多了,不只是加载过的类,感觉JDK里的类都会输出来。
    是想在transform中拦截File类,监控所有涉及了File类传入文件的操作并记录传入的文件到数据库。
    这样的话,在transform方法里找你的hello.IOTest类,然后写对应的classVisitor,根据全限定名找调用file类的init方法,并重写即可。没必要改file类
    如果我没记错的话,直接改File类的话,实际执行的还是没有改过的类。而且还涉及到类加载器方面的问题。
      

  8.   

    我想拦截不一定是真正有的File类啊,比如PrintWriter(String FileName),这个方法底层也是调用了File(String FileName)的,这种我也想拦截下来。
      

  9.   

    我想拦截不一定是真正有的File类啊,比如PrintWriter(String FileName),这个方法底层也是调用了File(String FileName)的,这种我也想拦截下来。举个例子吧,我之前做的是拦截网络请求。比如httpclient这个框架,是在调用urlconnection方法时开启网络请求。我就可以在目标代码里(相当与app,jar)找所有调用urlconnection方法的地方进行hook,而不用更改框架本身。    虽然公司内部肯定会针对框架再封装一层,但是只要他是基于httpclient的话,都是一样可以拦截的。
      

  10.   

    我想拦截不一定是真正有的File类啊,比如PrintWriter(String FileName),这个方法底层也是调用了File(String FileName)的,这种我也想拦截下来。举个例子吧,我之前做的是拦截网络请求。比如httpclient这个框架,是在调用urlconnection方法时开启网络请求。我就可以在目标代码里(相当与app,jar)找所有调用urlconnection方法的地方进行hook,而不用更改框架本身。    虽然公司内部肯定会针对框架再封装一层,但是只要他是基于httpclient的话,都是一样可以拦截的。  哦哦,所以用这个方法,也可以找到封装过的方法是吗?我是想拦截所有File的构造方法,获取文件名文件路径,然后分析判断记录。因为像PrintWriter和FileOutputStream这些方法,如果传入的是文件路径,其实jdk底层还是调用了File的构造方法来创建的,所以就想拦截File的构造方法。
      

  11.   

    还有高手了解吗,为什么拦截不到File类
      

  12.   

    javaagent 拦截不到BootstrarLoader加载器加载的类