2014-12-23 3 views
2

У меня есть Java-код, который ищет аннотации в статических методах класса.Как я могу предоставить класс объекта compaion scala для Java?

processor.readStatics(MyClass.class); // Takes Class<?> 

Как я могу предоставить методы объекта-компаньона scala для этой функции из scala?

class MyClass { 
} 
object MyClass { 
    def hello() { println("Hello (object)") } 
} 

Я, кажется, что:

MyClass$.MODULE$.getClass() 

должен быть answer. Тем не менее, MyClass $, кажется, отсутствует в scala (по крайней мере, в 2.10) и только видима для Java.

println(Class.forName("MyClass$.MODULE$")) 

также не удается.

+1

Вы пробовали ' Class.forName ("MyClass $ MODULE $") '? Для внутренних классов нет необходимости в дополнительных '.'. –

+1

Или 'Class.forName (« MyClass $$ MODULE $ »)', потому что для внутренних классов мы должны использовать '$' вместо '.'. –

+1

Хм, может быть, достаточно использовать класс, возвращаемый 'Class.forName (MyClass $)'. По крайней мере, он найден с помощью Scala 2.10.3. –

ответ

2

Имя класса: MyClass$ (с указанием соответствующего названия пакета).

println(Class.forName("MyClass$")) распечатает «класс MyClass $».

MyClass$.MODULE$ - это экземпляр класса, ссылающийся на одноэлементный объект.

println(MyClass$.MODULE$ == MyClass) напечатает «правда», хотя, при компиляции, вы получите предупреждение, что это сравнение всегда дает ложные :)

Обратите внимание, что ни один из этого не работает в РЕПЛ по какой-то причине. Вам нужно создать файл .scala, скомпилировать его с помощью scalac и запустить.

Таким образом, в Java, используйте MyClass$ ссылаться на классе MyClass объекта статический используйте MyClass$.MODULE$ ссылаться на одноэлементный экземпляре MyClass объекта, используйте MyClass$.class или MyClass$.MODULE$.getClass() ссылаться на классе одноплодного объекта динамически, используйте Class.forName("MyClass$") для доступа к нему во время выполнения по имени.

1

Самый короткий и тип-безопасное решение, чтобы просто использовать

MyClass.getClass 

Я хотел бы надеяться следующее работать, но, видимо, scalac не счастлива с ним:

classOf[MyClass.type] 
Смежные вопросы