自写String类和修改字节码的问题

1 可不可以自己写个String类呢?

不可以,因为根据类加载的双亲委派机制,会去委派父类加载,在父类加载时,BootStrap会优先加载rt.jar中的String类,然后返回,那么自己定义的String类就不会被加载了;

因加载某个类时,优先使用父类加载器加载需要使用的类。
如果我们自定义了java.lang.String这个类,加载该自定义的String类,该自定义String类使用的加载器是AppClassLoader,根据优先使用父类加载器原理;
AppClassLoader加载器的父类为ExtClassLoader,所以这时加载String使用的类加载器是ExtClassLoader,但是类加载器ExtClassLoader在jre/lib/ext目录下没有找到String.class类,然后使用ExtClassLoader父类的加载器BootStrap;
父类加载器BootStrap在JRE/lib目录的rt.jar找到了String.class,将其加载到内存中。这就是类加载器的委托机制。

所以,用户自定义的java.lang.String不被加载,也就是不会被使用。

2 能否在加载类的时候,对类的字节码进行修改?

参考:java字节码修改

可以的,

  • 可以反编译class文件,比如:Java Decompiler;
  • 使用工具直接修改class字节码,比如:Javassist、ASM;使用Java探针技术;
  • 基于javaAgent和Java字节码注入技术的java探针工具技术

具体见Java探针-Java Agent技术

你可能感兴趣的:(自写String类和修改字节码的问题)