我已经使用自定义类加载器将ASM与Java一起使用,但是在scala中无法做到这一点。首选的方法是什么?HelloScala.scala
编译为两个类(HelloScala.class
和HelloScala$.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 $吗?