簡體   English   中英

Scala中的Java反射

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM