gpt4 book ai didi

scala 中的 Java 类反射

转载 作者:行者123 更新时间:2023-12-01 18:57:13 25 4
gpt4 key购买 nike

我正在尝试在 scala 上使用 java 的反射 API。我有一个使用 ClassLoader 从字节码加载的 KDTree 类。这是它的方法:

public class KDTree
{
public KDTree(int k)
public void insert(double[] key, Object value) throws Exception
public Object[] range(double[] lowk, double[] uppk) throws Exception
}

这是我的包装 scala 类:

class KDTree( dimentions: Int )
//wrapper!
{
private val kd= Loader.loadClass("KDTree")
private val constructor= kd.getConstructor(java.lang.Class.forName("java.lang.Integer"))
val wrapped= constructor.newInstance("1")
def insert( key:Array[Double], element:Object)=
kd.getDeclaredMethod("insert", classOf[Array[Double]])
.invoke(key, element)
def range( lowkey:Array[Double], highkey:Array[Double])=
kd.getDeclaredMethod("range", classOf[Array[Double]])
.invoke(lowkey, highkey)
}

当我尝试初始化时出现错误:

java.lang.NoSuchMethodException: KDTree.<init>(java.lang.Integer)

但是,构造函数的唯一参数确实是一个整数!

此外,我不能简单地执行java.lang.Integer.class,因为scala提示语法:错误:需要标识符但找到了“类”。

有人有什么建议吗?

编辑这是我完成的代码,以防有人使用它:

class KDTreeWrapper[T]( dimentions: Int )
{
private val kd= Loader.loadClass("KDTree")
private val constructor= kd.getConstructor(classOf[Int])
private val wrapped= constructor.newInstance(dimentions:java.lang.Integer)
.asInstanceOf[Object]
private val insert_method= kd.
getMethod("insert", classOf[Array[Double]], classOf[Object])
private val range_method=
kd.getMethod("range", classOf[Array[Double]], classOf[Array[Double]])
def insert( key:Iterable[Double], element:T)=
insert_method.invoke(wrapped, key.toArray, element.
asInstanceOf[Object])
def range( lowkey:Iterable[Double], highkey:Iterable[Double]):Array[T]=
range_method.invoke(wrapped, lowkey.toArray, highkey.toArray).
asInstanceOf[Array[T]]
}

最佳答案

您的问题是您尝试加载带有类型参数java.lang.Integer的构造函数。尝试使用int.class

而且编写kd.getConstructor(int.class)更短。

关于scala 中的 Java 类反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13565604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com