Вызов Java-класса из Scala с использованием отражения - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь использовать рефлексию для вызова моего java-метода из класса scala.

Я ссылался на этот пост. scala: в чем разница между Any и AnyRef? и мой "arg", переданный из Scala, является списком [AnyRef]

Scala

 val arg: List[AnyRef] = List ("a",Object B)
    val clazz = classLoader.loadClass("com.project.Hello")
    val clazzObject = clazz.newInstance()
    val myMethod = clazz.getDeclaredMethod("HelloJava", classOf[List[AnyRef]])
    myMethod.setAccessible(true)
    val response = myMethod.invoke(clazzObject, arg)

Java

package com.project;
     public class Hello {
        public static String HelloJava (List<Object> arg) {
        }

При вызове этого метода я получаю исключение ниже - java.lang.NoSuchMethodException: com.Project.Hello (scala.collection.immutable.List) в java.lang.Class.getDeclaredMethod

Однако вызов класса scala из scala прекрасно работает с той же сигнатурой метода.

Может ли кто-нибудь помочь в разъяснении концепции и скажите, что я делаю неправильно? Как я могу решить эту проблему, прежде всего, путем изменения класса Java (если нет, то изменения в классе Scala).Я посмотрел и другие посты, в которых говорится об использовании javaconversions и javaconverters, но это тоже не помогло.

1 Ответ

0 голосов
/ 14 сентября 2018

В Scala импортируемым по умолчанию List является scala.collection.immutable.List (как вы можете видеть в сообщении);в Java их нет, но этот класс, скорее всего, импортирует java.util.List.Если бы класс Java использовал список Scala, он бы работал (но коллекции Scala в основном непригодны для использования с Java).

Так что вам следует исправить класс Scala, чтобы вместо него использовать classOf[java.util.List[AnyRef]].

Отражениеничего не знает о javaconversions и javaconverters, они не имеют отношения.

...