修改已编译的java类构造函数访问

时间:2018-01-11 10:38:25

标签: java

我有一个jar文件,其中的类附加到我的项目中,但是我无法从这些类中实现对象,因为构造函数是私有的,我无法更改它,因为这些文件处于只读模式 有人可以帮我java吗?

private DicomImageViewer(String title,int w,int h) { 
} 

/**
 * @param   title
 */
private DicomImageViewer(String title) {
} 

1 个答案:

答案 0 :(得分:0)

我假设我们在谈论DicomImageViewer of the PixelMed Project?调用你提供的构造函数无济于事,因为它们什么都不做。实际执行某项操作的唯一构造函数是private DicomImageViewer(String title,String applicationPropertyFileName,String dicomFileName),并且是main方法调用的构造函数。

因此,对于这个特定的类,您只需调用main方法DicomImageViewer.main(new String[]{filename})即可。通过使用java -jar调用jar,您将获得与获取相同的功能,即您没有获得DicomImageViewer的实际实例。

有一种方法可以使用反射来调用私有构造函数,但如果上面的答案已经是你需要的,我可以跳过那部分;-)这样做绝不是一个好主意,因为这些事情被声明{{1} } 因为某种原因。所述类的作者假设这些构造函数和方法可以在没有任何通知的情况下进行更改,并且可以预期会定期更改。因此,在更新jar后,如果私有方法消失或改变了行为,整个应用程序将会中断。

编辑:您在评论中提出了这个要求,所以这里是;-)使用它需要您自担风险。

private

作为Jar的创建者,您可以阻止import java.lang.reflect.Constructor; public class CallPrivateConstructor { public final static void main(String[] args) throws Exception { // TargetClass tc = new TargetClass("value", 1, 2); // leads to compile error Constructor<TargetClass> c = TargetClass.class.getDeclaredConstructor(String.class, Integer.TYPE, Integer.TYPE); c.setAccessible(true); TargetClass tc = c.newInstance("value", Integer.valueOf(1), Integer.valueOf(2)); System.out.println(tc); } } final class TargetClass { private String val; private int number1; private int number2; private TargetClass(String val, int number1, int number2) { this.val = val; this.number1 = number1; this.number2 = number2; } public String toString() { return "val: " + val + ", number1: " + number1 + ", number2: " + number2; } } 的调用成功,因此此解决方案可能无法在您的特定情况下工作。