カスタムクラスローダーを使用してJavaでASMを使用しましたが、scalaで同じことを行うのに問題があります。推奨されるアプローチは何ですか?
Aは2つのクラス(およびHelloScala.scala
)にコンパイルされます。両方のバイトコードをスプーフィングする必要がありますか?HelloScala.class
HelloScala$.class
私のコードは1つだけに詰め込まれているように見えますがHelloScala$.class
、パブリックコンストラクターやメソッドはありません。Reflection APIを使用し、コンストラクターを使用してアクセスを取得できますが、2つの問題があります。
- を無視すること
HelloScala.class
で、私は何か価値のあるものを見逃していますか? - これは危険ですか、それとも臭いですか?
「正しい」方法は、おそらくpublic、static main
inを呼び出すことですが、次の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$
ですが、なぜ見つからないのですか?
ありがとう!