java从私有类调用公共方法

java从私有类调用公共方法,java,methods,call,private,public,Java,Methods,Call,Private,Public,我需要从库中的公共类调用私有构造函数,如下所示: public class XMLRoutine { private static XMLRoutine _instance; private XMLRoutine() { } public String signXml(String xml, PrivateKey privateKey, Certificate cert, String encoding) throws ParserConfigurationExc

我需要从库中的公共类调用私有构造函数,如下所示:

public class XMLRoutine {
    private static XMLRoutine _instance;
    private XMLRoutine() {
    }
    public String signXml(String xml, PrivateKey privateKey, Certificate cert, String encoding) throws ParserConfigurationException, SAXException, IOException, PrivilegedActionException {
    }
}
import kz.softkey.iola.applet.XMLRoutine;
...
XMLRoutine xmlr = new XMLRoutine();
当我试着这样称呼它时:

public class XMLRoutine {
    private static XMLRoutine _instance;
    private XMLRoutine() {
    }
    public String signXml(String xml, PrivateKey privateKey, Certificate cert, String encoding) throws ParserConfigurationException, SAXException, IOException, PrivilegedActionException {
    }
}
import kz.softkey.iola.applet.XMLRoutine;
...
XMLRoutine xmlr = new XMLRoutine();
我得到一个错误:
XMLRoutine()在XMLRoutine
中具有私有访问权限,因此我无法调用signXml方法


如何解决此问题?

XMLRoutine具有专用构造函数。因此,无法使用新的XMLRoutine()创建。它可能有getInstance()方法来创建新的singleton对象,或者其他一些静态方法,您可以使用这些方法来代替创建同一类的对象。因此,无法使用新的XMLRoutine()创建。它可能有getInstance()方法来创建新的singleton对象,或者可以使用其他静态方法来代替创建同一类的对象。构造函数是私有的。因此,您无法使用
newxmlroutine()
以常规方式实例化它

如果它有公共静态getInstance()方法,那么您可以使用该方法来实例化该类

XMLRoutine xmlRoutine = XMLRoutine.getInstance();
String res = xmlRoutine.anyPublicMethod();

构造函数是私有的。因此,您无法使用
newxmlroutine()
以常规方式实例化它

如果它有公共静态getInstance()方法,那么您可以使用该方法来实例化该类

XMLRoutine xmlRoutine = XMLRoutine.getInstance();
String res = xmlRoutine.anyPublicMethod();

你需要考虑构造函数是私有的原因。这很可能是因为您不应该直接实例化该类

如果您确实非常需要实例化它,并且没有其他方法来做事情,那么您总是可以恢复到反射(同样,首先要用尽所有其他选项)

尝试以下几点:

try {
    Class<?> cls = XMLRoutine.class;
    Constructor<XMLRoutine> constructor = cls.getDeclaredConstructor();
    constructor.setAccessible(true);
    XMLRoutine xmlRouting = constructor.newInstance();
} catch (Exception e) { // Change to specific exception types being thrown from reflection
    // handle error ...
}
试试看{
类cls=XMLRoutine.Class;
构造函数=cls.getDeclaredConstructor();
constructor.setAccessible(true);
xmlRouting=constructor.newInstance();
}catch(异常e){//更改为从反射引发的特定异常类型
//处理错误。。。
}

您需要考虑构造函数是私有的原因。这很可能是因为您不应该直接实例化该类

如果您确实非常需要实例化它,并且没有其他方法来做事情,那么您总是可以恢复到反射(同样,首先要用尽所有其他选项)

尝试以下几点:

try {
    Class<?> cls = XMLRoutine.class;
    Constructor<XMLRoutine> constructor = cls.getDeclaredConstructor();
    constructor.setAccessible(true);
    XMLRoutine xmlRouting = constructor.newInstance();
} catch (Exception e) { // Change to specific exception types being thrown from reflection
    // handle error ...
}
试试看{
类cls=XMLRoutine.Class;
构造函数=cls.getDeclaredConstructor();
constructor.setAccessible(true);
xmlRouting=constructor.newInstance();
}catch(异常e){//更改为从反射引发的特定异常类型
//处理错误。。。
}

私有类在哪里?具有私有访问的公共类在哪里?具有私有访问的公共类是的,它有getInstance()方法。所以我必须创建
对象xmlr=XMLRoutine.getInstance()
,然后呢?我不知道这之后该怎么办。Help pls.XMLRoutine xmlr=XMLRoutine.getInstance();它将为您创建一个单例对象。然后使用参数尝试xmlr.signXml(…),您可以继续使用您的代码是的,它有getInstance()方法。所以我必须创建
对象xmlr=XMLRoutine.getInstance()
,然后呢?我不知道这之后该怎么办。Help pls.XMLRoutine xmlr=XMLRoutine.getInstance();它将为您创建一个单例对象。然后尝试xmlr.signXml(…)和args,您可以继续编写代码,您想说的是'XMLRoutine.class.newInstance()<代码>。这相当于新的
XMLRoutine()。所以它也不会起作用。。!!你迟到了,另一个答案(及其评论)中包含了完全相同的内容@Dileep不,根本不是这么说的。
.class
是从哪里来的,工厂方法是从哪里来的!=构造函数。@Iwan Satria您不能将静态函数的返回值赋给非静态对象。。!!将其更改为
static XMLRoutine XMLRoutine
您想说的是`XMLRoutine.class.newInstance()<代码>。这相当于新的XMLRoutine()。所以它也不会起作用。。!!你迟到了,另一个答案(及其评论)中包含了完全相同的内容@Dileep不,根本不是这么说的。
.class
是从哪里来的,工厂方法是从哪里来的!=构造函数。@Iwan Satria您不能将静态函数的返回值赋给非静态对象。。!!将其更改为
静态XMLRoutine XMLRoutine