gpt4 book ai didi

java - 如何使用默认访问(或包默认)访问构造函数

转载 作者:行者123 更新时间:2023-12-02 04:31:01 25 4
gpt4 key购买 nike

我正在尝试实例化一个类的构造函数,该类是我通过其坐标作为 Maven 依赖项导入的。我遇到的问题是这个类的特定构造函数对我来说是不可见的,因为它没有与之关联的访问修饰符,所以它是默认的,这意味着我无法从外部访问它。

我知道有一种方法可以通过反射访问私有(private)方法,使用 Method 类的 getDeclaredMethod() 方法,但这对构造函数不起作用(如果我错了,请纠正我)。

我尝试使用的类在这里:

public class DecisionTableBuilder {

// Notice no access modifier here so it's package-default
DecisionTableBuilder(Log log, File in, File out) {
some stuff ...
}

// public constructor
public DecisionTableBuilder() {}

// Method 1
public void compiler(File schema) {
some stuff ...
}

// Method 2
public void linker(File attribute) {
some stuff ...
}
}

这是我在一个单独项目中的顶层:

public class TopLevel {

public void testDecisionTableBuilder() {

// I get an error saying the constructor DecisionTableBuilder is not visible
DecisionTableBuilder builder = new DecisionTableBuilder();

// This works just fine, but no constructor...
DecisionTableBuilder builder2;

// This doesn't really work
Method[] m = DecisionTableBuilder.class.getDeclaredMethods("DecisionTableBuilder", "Log", "File", "File");

}
}

如何访问我在新项目中创建的顶级类中的构造函数和方法?任何帮助将不胜感激

编辑

public File graphDir;
public File outputDir;
public Log log;

Constructor<DecisionTableBuilder> constructor = DecisionTableBuilder.class.getDeclaredConstructor(Log.class,File.class,File.class);
constructor.setAccessible(true);
DecisionTableBuilder builder =constructor.newInstance(log, graphDir, outputDir);

这是正确的吗?

最佳答案

您无法使用 getDeclaredMethodgetDeclaredMethods 访问构造函数。 Java反射机制区分方法和构造函数,并有单独的方法来访问它们。

尝试getDeclaredConstructors method ,

Constructor[] c = DecisionTableBuilder.class.getDeclaredConstructors();

或者对于特定的构造函数,getDeclaredConstructor 。传入表示参数类型的 Class 对象,而不是类的字符串名称。

Constructor<DecisionTableBuilder> constructor =
DecisionTableBuilder.class.getDeclaredConstructor(Log.class, File.class, File.class);

您需要将其设置为可访问,然后调用 newInstance 来创建 DecisionTableBuilder。'

constructor.setAccessible(true);
DecisionTableBuilder dtb = constructor.newInstance(yourLog, inFile, outFile);

您当然需要捕获这些反射调用可能引发的几个异常。

关于java - 如何使用默认访问(或包默认)访问构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31465366/

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