【发布时间】:2015-10-06 13:22:54
【问题描述】:
我正在尝试实例化一个类的构造函数,该类通过它的坐标作为 Maven 依赖项导入。我遇到的问题是这个类的特定构造函数对我来说是不可见的,因为它没有与之关联的访问修饰符,所以它是默认的,这意味着我无法从外部访问它。
我知道有一种方法可以通过反射访问私有方法,使用类 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);
这是正确的吗?
【问题讨论】:
-
你冒着破坏第三方代码和/或让自己很容易受到其实施变化的影响。
-
这是有意的,我希望这个代码在依赖类发生变化时中断
标签: java maven reflection access-modifiers