Tag: java bytecode asm

是否可以在运行时指定System ClassLoader加载.class文件?

我正在编写一个用于赋值的静态分析工具,它使用ASM库分析Java字节码。 我们使用的ASM的一个部分需要(或者至少看起来需要)从ClassLoader加载类。 我们希望该工具能够分析.class文件,而不需要它们在类路径上。 我们已经在运行时从指定的目录加载.classes并使用InputStream读取它们。 在大多数情况下,这对于ASM是可接受的。 有一些类,例如SimpleVerifier ,它们尝试加载类。 在这种情况下,是否可以注册要加载的.class文件,以便调用Class.forName()来加载它们? 或者有一种简单的方法来扩展ClassLoader以允许它吗? 编辑: URLClassLoader上的信息很有用。 不幸的是,使用Thread.currentThread().setContextClassLoader()到它的实例在这种情况下不起作用。 我正在调用的库代码使用它在使用getClass().getClassLoader()进行实例初始化时检索的加载器。 当我设置URLClassLoader时,该类尚未初始化,所以我猜contextClassLoader不加载该类。 我是否正确理解了答案? 是否可以使用URLClassLoader加载第三方类?

生成’Hello,World!’ 使用Java ASM库的类

我已经开始乱用我正在研究的编译器项目的ASM API。 但是,我发现文档对于很多地方的新手来说还不太清楚,我认为有一个很好的例子来生成一个只打印“Hello,World!”的类。 这将是一个很好的例子。 目前,我可以使用main()(使用ClassWriter,ClassVisitor和MethodVisitor类)生成一个类,但我似乎无法弄清楚如何生成main的主体。 任何人都可以给我一个在ASM中生成类文件的示例: 包含一个main() 在main()中创建一个本地String变量,其值为“Hello,World!” 打印变量

ArrayOutOfBoundsException:asm.ClassReader.readClass(Unknown Source)

我有一个具有以下依赖项的层次结构: Base(Timer timer) Timer(PublisherService service, BaseDao userDao, DataProcessor processor) DataProcessor还有其他依赖DataProcessor但我不会那么远,因为看起来我的错误很早就发生了。 与该依赖图对应,我有以下Spring配置: 在我的应用程序的顶层,我将运行: ApplicationContext context = new ClassPathXmlApplicationContext(“spring-configuration.xml”); Base consumerBase = context.getBean(“base”, Base.class); 当我按照调试时发现Timer已成功初始化。 。 。有些。 在Timer完全解析并注入Base我回过头来看: java.lang.ArrayIndexOutOfBoundsException: 3145 at org.springframework.asm.ClassReader.readClass(Unknown Source) at org.springframework.asm.ClassReader.accept(Unknown Source) at org.springframework.asm.ClassReader.accept(Unknown Source) at org.springframework.core.LocalVariableTableParameterNameDiscoverer.visitConstructor(LocalVariableTableParameterNameDiscoverer.java:123) at org.springframework.core.LocalVariableTableParameterNameDiscoverer.getParameterNames(LocalVariableTableParameterNameDiscoverer.java:89) at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:984) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:886) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) […]

在ASM字节码中打印方法很漂亮

我正在尝试(没有成功) 仅打印给定方法的内容。 以下代码几乎可以解决问题: class MyTraceMethodVisitor extends MethodVisitor { public MyTraceMethodVisitor(MethodVisitor mv) { super(Opcodes.ASM4, mv); } @Override public void visitMaxs(int maxStack, int maxLocals) { } } class MyClassVisitor extends ClassVisitor { public MyClassVisitor(ClassVisitor cv) { super(Opcodes.ASM4, cv); } @Override public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { return null; } @Override […]

Java:在同一个JVM中从运行时获取类的字节码

相关: 有没有办法在运行时获取类的字节码? 我正在为Clojure增加耐久性,我终于到了准备添加function的地步。 在Clojure中,函数通过调用方法(以及其他方式)被字节编译为类。 通过这种方式,function是一流的。 为了使这些持久,我需要序列化和反序列化这些类。 如何在不访问.class文件的情况下获取类的字节码? 如果我弄错了,请纠正我,但使用代理需要生成一个单独的VM,代理连接到第一个VM。 我需要从同一个VM做到这一点。 使用Serializable来设置和获取Class对象是不够的。 在反序列化时,我需要加载该类,并且在后续VM实例上,可能存在类名冲突。 我需要修改字节码,以便在反序列化/类加载时将类重命名为唯一的。

ASM中的Java方法参数值

我试图获取Java程序的方法参数的值。 我正在使用ASM来检测字节码并获取这些值。 但是,我遇到了一些麻烦。 这是用于检测代码的visitCode()方法。 它正在做的是: 创建一个空数组以存储收集的参数。 对于每个参数,将其值加载到数组中。 将此数组发送到我的代理的OnMethodEntry方法(将使用值)。 。 @Override public void visitCode() { int paramLength = paramTypes.length; // Create array with length equal to number of parameters mv.visitIntInsn(Opcodes.BIPUSH, paramLength); mv.visitTypeInsn(Opcodes.ANEWARRAY, “java/lang/Object”); mv.visitVarInsn(Opcodes.ASTORE, paramLength); // Fill the created array with method parameters int i = 0; for (Type tp : paramTypes) { mv.visitVarInsn(Opcodes.ALOAD, paramLength); mv.visitIntInsn(Opcodes.BIPUSH, […]

了解常量池的javap输出

在一个非常简单的HelloWorld应用程序上运行javap时,我对常量池周围的输出有一些混淆。 测试代码 public class TestClass { public static void main(String[] args) { System.out.println(“hello world”); } } Javap -c -verbose输出(剪切) // Header + consts 1..22 snipped const #22 = String #23; // hello world const #23 = Asciz hello world; public static void main(java.lang.String[]); Signature: ([Ljava/lang/String;)V Code: Stack=2, Locals=1, Args_size=1 0: getstatic #16; //Field java/lang/System.out:Ljava/io/PrintStream; 3: […]