2016-08-22 3 views
1

Я пытаюсь получить простую программу Java Reflection, работая в Scala, и, кажется, что-то ... не хватаетJava Reflection в Scala

scala> val cl = new URLClassLoader(Array(new File("Hi.jar").toURI.toURL), getClass.getClassLoader) 
cl: java.net.URLClassLoader = [email protected] 

scala> val c = cl.loadClass("Hi") 
c: Class[_] = class Hi 

scala> val m = c.getMethod("run") 
m: java.lang.reflect.Method = public void Hi.run() 

scala> m.invoke() 
<console>:21: error: not enough arguments for method invoke: (x$1: Any, x$2: Object*)Object. 
Unspecified value parameters x$1, x$2. 
     m.invoke() 
      ^

Что я не хватает, так как до линии показало -

public void Hi.run() 

Что именно он ожидает от двух аргументов?

ответ

1

Scala сообщает вам, в чем заключается ваша проблема: invoke нуждается в 1+ параметрах!

Смотрите java doc:

Invoke (OBJ Object, Object ... арг)

Запускает основной метод, представленный этим методом объекта, на указанном объекте с заданными параметрами.

Итак, вы должны указать хотя бы один аргумент - ссылку на объект (или класс), на который вы хотите называть этот метод! Поскольку Hi.run() кажется статическим, вы бы хотели использовать свой c как только аргумент вашего вызова.

Следующие аргументы будут действительными параметрами, которые ожидает ваш «отраженный» метод. В вашем случае нет дальнейших аргументов.

Короче говоря: вам лучше держать отличные уроки от Oracle на отражении рядом с консолью scala во время экспериментов. Если вы попытаетесь научиться «отражению» в пробной версии &error; Я гарантирую вам: лот разочаровывающих испытаний со многими странными ошибками. Действительно: API отражения не очень прощает, когда вы не знаете, что делаете; даже малейшие ошибки могут привести к очень неожиданным результатам.

0

В Scala нет ничего особенного. Method.invoke требует, чтобы хотя бы один аргумент был экземпляром, на который он был применен (или null для метода static).

В Scala вы можете использовать структурную типизацию для такого простого случая.