问题描述
我正在尝试实例化通过其坐标作为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);
这是正确的吗?
1楼
您不能使用getDeclaredMethod
或getDeclaredMethods
访问构造函数。
Java反射机制区分方法和构造函数,并具有用于访问它们的单独方法。
试试 ,
Constructor[] c = DecisionTableBuilder.class.getDeclaredConstructors();
或对于特定的构造函数, 。
传入表示参数类型的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
这些反射调用可能引发的几个异常。