当我尝试将Reflection API用于PHP中的单例模式类的新实例时,由于非公共构造函数,我失败了。
简单代码:
JButton b;
new JPanel().add(b=new JButton(new AbstractAction("Click Me"){
@Override
public void actionPerformed(ActionEvent e){
//
}
}));
然后,在调用newInstanceArgs方法之前,我尝试使用$ class-> getConstructor() - > setAccessible(true)。它也失败了,异常消息也一样。
现在,我知道这些代码无法获得某个对象的正确实例。但是,我想知道为什么setAccessible方法不能改变构造函数方法是否可访问?
答案 0 :(得分:0)
$class->getConstructor()
返回一个ReflectionMethod,setAccessible(true)
允许调用该方法,但只能从ReflectionMethod实例调用。在ReflectionClass级别,构造函数保持私有。
要做你想做的事,你可以尝试这样的事情:
$reflection = new ReflectionClass(MySingletonClass::class);
$constructor = $reflection->getConstructor();
$constructor->setAccessible(true);
$mySingleton = $reflection->newInstanceWithoutConstructor();
$constructor->invokeArgs($mySingleton, [/*your arguments*/]);