私は次のように定義されたscalaオブジェクトを持っています:
package com.example
object Foo {
def bar(): String = "Interesting Result"
}
がビルドおよびランタイムクラスパスにあるFoo$.MODULE$.bar()
場合Foo
はJavaから呼び出すことができることはわかっていますが、私の状況Foo
ではビルドクラスパスになく、ランタイムクラスパスで構成されている場合と構成されていない場合があります。
私のJavaコードから、bar()
実行時クラスパスで使用できる場合はリフレクションを使用して呼び出します。それ以外の場合は、デフォルトの実装にフォールバックします。
これは可能ですか?
これは、次のようなコードで実行できます。
package com.example.java;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Example {
/**
* Returns null or the result of calling a method on a scala object from java
*/
public String callScalaFromJava(){
String result = null;
try {
Class<?> clazz = Class.forName("com.example.Foo$"); // Note the trailing '$'
Method method = clazz.getDeclaredMethod("bar");
Field field = clazz.getField("MODULE$");
Object instance = field.get(null);
Object obj = method.invoke(instance, new Object[] {});
if (obj instanceof String) {
result = (String) obj);
}
} catch (Exception ex) {
// SWALLOWING
}
return result;
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加