gpt4 book ai didi

java - 如何使用 ASM 来欺骗 HelloWorld.scala?已加载到 JVM 但未找到?

转载 作者:太空宇宙 更新时间:2023-11-04 07:53:30 24 4
gpt4 key购买 nike

我已经使用自定义类加载器将 ASM 与 java 结合使用,但在 scala 中做同样的事情时遇到了麻烦。首选方法是什么?

HelloScala.scala 编译为两个 类(HelloScala.class HelloScala$.class)。我需要欺骗两者的字节码吗?

我的代码似乎只填充在一个 HelloScala$.class 中,但没有公共(public)构造函数或方法。我可以使用 Reflection API 并使用构造函数来获取访问权限,但有两个问题:

  1. 通过忽略 HelloScala.class,我是否错过了任何有值(value)的东西?
  2. 这危险或有臭味吗?

“正确”的方法可能是在 HelloScala 中调用公共(public)静态 main,但我收到此错误:

[Loaded HelloScala from __JVM_DefineClass__]
[Loaded scala.ScalaObject from file:/home/julianpeeters/asm-scala-example/lib/scala-library-2.9.1.jar]
[Loaded HelloScala$ from __JVM_DefineClass__]
[Loaded sun.reflect.NativeMethodAccessorImpl from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
[Loaded sun.reflect.DelegatingMethodAccessorImpl from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
[Loaded java.lang.reflect.InvocationTargetException from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at HelloScalaDump.main(HelloScalaDump.java:41)
Caused by: java.lang.NoClassDefFoundError: HelloScala$
at HelloScala.main(Unknown Source)
... 5 more
Caused by: java.lang.ClassNotFoundException: HelloScala$
at java.lang.ClassLoader.findClass(ClassLoader.java:373)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
... 6 more

看起来 HelloScala$ 正在加载,为什么找不到它?

谢谢!

最佳答案

Scala 使用了很多技巧将其语义映射到 JVM。因此,您会在字节码级别看到很多意想不到的事情。我认为您必须接受它并深入了解 scala 编译器如何使用 Java 结构。

类通过其名称和加载该类的类加载器(调用 Define 方法的类加载器)来标识。您确定加载 HelloScala 的加载器实际上也加载了 HelloScala$ 吗?

关于java - 如何使用 ASM 来欺骗 HelloWorld.scala?已加载到 JVM 但未找到?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13990918/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com