[英]Java Reflection in Scala
我正在嘗試讓一個簡單的Java反射程序在Scala中運行,並且似乎缺少了一些東西...
scala> val cl = new URLClassLoader(Array(new File("Hi.jar").toURI.toURL), getClass.getClassLoader)
cl: java.net.URLClassLoader = java.net.URLClassLoader@3c7b137a
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()
這兩個參數到底期望什么?
Scala准確地告訴您您的問題是什么:invoke需要1個以上的參數!
請參閱java doc :
invoke(Object obj,Object ... args)
在具有指定參數的指定對象上調用此Method對象表示的基礎方法。
因此,您必須至少提供一個參數-對要調用該方法的對象(或類)的引用! 由於Hi.run()似乎是靜態的,因此您希望將c用作調用的唯一參數。
以下參數將是您的“反射”方法所期望的實際參數。 在您的情況下,沒有其他爭論。
長話短說:在實驗時,最好將Oracle的優秀教程放在您的Scala控制台附近進行反思。 如果您嘗試通過試錯來學習“反思”; 我向您保證: 很多令人沮喪的嘗試,其中包含許多奇怪的錯誤。 確實:當您不知道自己在做什么時,反射API並不是很寬容。 即使是最輕微的錯誤也會導致非常意外的結果。
那里沒有特定於Scala的東西。 Method.invoke
要求至少一個參數是應用它的實例(對於static
方法為null
)。
在Scala中,可以將結構化類型用於這種簡單情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.