如何使用默认访问(或包默认)访问构造函数
How to access a constructor of with default access (or package-default)
我正在尝试实例化 class 的构造函数,我通过它的坐标将其导入为 Maven 依赖项。我遇到的问题是这个 class 的特定构造函数对我来说是不可见的,因为它没有关联的访问修饰符,所以它是默认的,这意味着我无法从外部访问它。
我知道有一种方法可以通过反射访问私有方法,使用 class 方法的 getDeclaredMethod() 方法,但这对构造函数不起作用(如果我错了请纠正我)。
我正在尝试使用的 class 在这里:
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");
}
}
如何访问我在新项目中创建的顶层 class 中的构造函数和方法?如有任何帮助,我们将不胜感激
编辑
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);
这是正确的吗?
您不能使用 getDeclaredMethod
或 getDeclaredMethods
访问构造函数。 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);
您当然需要 catch
这些反射调用可能抛出的几个异常。
我正在尝试实例化 class 的构造函数,我通过它的坐标将其导入为 Maven 依赖项。我遇到的问题是这个 class 的特定构造函数对我来说是不可见的,因为它没有关联的访问修饰符,所以它是默认的,这意味着我无法从外部访问它。
我知道有一种方法可以通过反射访问私有方法,使用 class 方法的 getDeclaredMethod() 方法,但这对构造函数不起作用(如果我错了请纠正我)。
我正在尝试使用的 class 在这里:
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");
}
}
如何访问我在新项目中创建的顶层 class 中的构造函数和方法?如有任何帮助,我们将不胜感激
编辑
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);
这是正确的吗?
您不能使用 getDeclaredMethod
或 getDeclaredMethods
访问构造函数。 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);
您当然需要 catch
这些反射调用可能抛出的几个异常。