【发布时间】:2012-12-21 13:16:31
【问题描述】:
我使用自定义类加载器将 ASM 与 java 结合使用,但在 scala 中执行相同操作时遇到了麻烦。首选的方法是什么?
HelloScala.scala 编译成 两个 类(HelloScala.class 和 HelloScala$.class)。我需要欺骗两者的字节码吗?
我的代码似乎只填充了一个HelloScala$.class,但没有公共构造函数或方法。我可以使用 Reflection API 并使用 Constructor 来获取访问权限,但有两个问题:
- 忽略
HelloScala.class,我是否错过了任何有价值的东西? - 这是危险的还是有异味的?
“正确”的方式可能是在HelloScala 中调用公共的、静态的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$ 似乎正在加载,为什么找不到呢?
谢谢!
【问题讨论】:
-
“假设您不想在项目目录中有多个无用的文件...” -- 不,我不介意多个文件。我的问题实际上是我没有代表这些类的 any .java 或 .class 文件,因此没有任何东西可以放入 jar 中。相反,我试图在运行时动态定义类(基于仅在运行时知道的数据)。
标签: java scala classloader java-bytecode-asm