gpt4 book ai didi

java - 使用反射 Java 的 `newInstance` 实例化 Scala 类

转载 作者:行者123 更新时间:2023-11-30 06:24:06 27 4
gpt4 key购买 nike

对于一些特殊的用例,我有一个小实用程序可以使用动态类加载器 DynamicClassLoader 从 jar 加载 Java 类。这适用于 jar 中包含的 Java 类。从 jar 加载 Scala 类也没有问题。但是,实例化加载的 Scala 类会导致以下异常。看起来 Scala 类有私有(private)默认构造函数?注意编译后的 Scala 类名以 $

结尾
java.lang.IllegalAccessException: Class XXX can not access a member of class ScalaClassYYY$ with modifiers "private"

下面的代码片段说明了我正在努力实现的想法,并提供了更多背景信息。异常发生在注释行:

// deploy and register the new code
byte[] jarBytes = (byte[]) ((Object) message.getAttachment("jar"));
String registerClassName = message.getAttachment("register");
logger.debug("the register is '" + registerClassName + "'");

DynamicClassLoader loader = new DynamicClassLoader(jarBytes);
Class<?> registerClass = loader.lookUp(registerClassName);
// ===> this is where the java.lang.IllegalAccessException happens
IRegisterExecutor registerExecutor = (IRegisterExecutor) registerClass.newInstance();
registerExecutor.register();

有什么解决办法吗?

最佳答案

显然,您需要将默认构造函数公开(它也不适用于没有公共(public)默认构造函数的 Java 类)。例如

class ScalaClassYYY() {
...
}

或者如果你想让主构造函数接受一些参数,

class ScalaClassYYY(arg1: Int) {
def this() = this(0)
}

但是从

Note the compiled Scala class name ending with $

看起来您实际上是在尝试实例化一个 Scala 对象:

object ScalaClassYYY { ... }

在这种情况下,您不应创建新实例,而应使用 the existing one :

(IRegisterExecutor) registerClass.getField("MODULE$").get(null);

编辑:

I don't see in your answer how you add a default public constructor to a Scala class that does NOT require any parameters.

不需要任何参数的(不是对象)已经有一个默认的公共(public)构造函数(我的第一个例子)。

Actually in Java all classes by default offer a public default constructor

没有。只有那些没有带参数的构造函数的类。

remove the "(it won't work for Java classes without a public default constructor either)" because it is wrong

documentation for Class.newInstance()

IllegalAccessException - if the class or its nullary constructor is not accessible.

所以我很确定这是正确的。如果它确实适用于没有公共(public)默认构造函数的 Java 类,那么这似乎是您使用的类加载器中的一个主要错误。您可以使用如下所示的 Java 类对其进行测试:

public class TestClass implements IRegisterExecutor {
public TestClass(int dummy) {}

// some implementation for IRegisterExecutor methods to get it to compile
}

关于java - 使用反射 Java 的 `newInstance` 实例化 Scala 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17401565/

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