I以下のScalaのクラス階層があります。動的クラスローディングScalaの種類
abstract class BaseModule(val appConf : AppConfig) {
// ...
}
class SimpleModule(appConf : AppConfig) extends BaseModule(appConf) {
// ...
}
class FairlyComplexModule(appConf : AppConfig) extends BaseModule(appConf) {
// ...
}
// dozens of other BaseModule subclasses...
実行時に、私のアプリは、インスタンス化するBaseModule
サブクラスの完全修飾クラス名の文字列入力引数を受け入れますが、をコードはどの具体的なサブクラスになるのかわかりません。だから私は持っている:
val moduleFQCN = loadFromInputArgs() // ex: "com.example.myapp.SimpleModule"
val moduleClass = Class.forName(moduleFQCN)
println(s"Found ${moduleFQCN} on the runtime classpath.")
val module = Class.forName(moduleFQCN).getConstructor(classOf[AppConfig]).newInstance(appConf).asInstanceOf[BaseModule]
にしたがって、この方法は、入力がクラスパス上を探すために、そしてその後、インスタンス化するためにどのBaseModule
サブクラスを指定します。上の最初の3行はうまく実行され、私はprintln
の火を見る。しかし、上記の最後の行は、例外をスロー:SimpleModule
サブクラスのインスタンスを作成しようとすると、明らか私が何か間違ったことをやっている
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
<rest of stacktrace omitted for brevity>
ので、ちょうどそれが何であるかを把握することはできません。何か案は?
「InvocationTargetException' [wrapps](https://docs.oracle.com/javase/7/docs/api/java/lang/reflect/InvocationTargetException.html)の原因となる例外として、最初に 'getCause()'を呼び出します。 'appConfig'が呼び出し時に有効かどうかを確認してください。 –
インスタンス化しているクラスのコンストラクタが例外をスローしている可能性があります。 –
「newInstance」の[JavaDoc](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Constructor.html#newInstance-java.lang.Object...-)から':' @throws InvocationTargetException - 基底のコンストラクタが例外をスローする場合 'あなたが与えたコードは問題ではなく、むしろオブジェクトの作成中に問題があります。さらに進歩を遂げるためには、問題のあるスタックトレースまたは実際のコードのすべてを私たちに与えるべきです。 – rxg