我已经使用自定义类加载器将ASM与Java一起使用,但是在scala中无法做到这一点。首选的方法是什么?

HelloScala.scala编译为两个类(HelloScala.classHelloScala$.class)。我是否都需要欺骗字节码?

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


通过忽略HelloScala.class,我是否缺少任何有价值的东西?
这是危险的还是臭的?


“正确”的方法可能是在main中调用公共的静态HelloScala,但出现此错误:

[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 $吗?

07-24 09:36