java – 在groovy中仅使用来自另一个类的私有构造函数的类的实例化

我有一个场景,如下面的世界类只有一个私有构造函数和另一个类App.

如代码所示,尽管World中只有私有构造函数,但可以在App类中创建一个新的World实例.

它在Java中被禁止,我认为它在groovy中也被禁止,但App运行没有任何错误.

// World.groovy
class World {
    private World() {
    }
}

// App.groovy
class App {
    static void main(String[] args) {
    def world = new World()
    println world
}

我无法理解在groovy中它是如何可能的.
另一个类如何在groovy中实例化一个只有私有构造函数的类?

最佳答案
Groovy无法识别私有访问修饰符. See this question. Groovy中没有任何私密内容.

至于Groovy是如何做到的,Groovy正在为你在Groovy中编写的东西生成类.它可以在类文件中编写它想要的任何访问修饰符.但是您也可以使用Groovy来检查Java代码的私有部分. Groovy在构造函数上调用setAccessible为AlexR’s answer demonstrates.

安全经理可以阻止这种事情.在groovysh中,安全管理器是org.codehaus.groovy.tools.shell.util.NoExitSecurityManager,它只检查其父项是否为空的权限.在groovysh中,它的父级为空.

Groovy依赖于设置’suppressAccessChecks’权限才能运行. groovy.policy file for the core-groovy project有此通知:

/* Notes on the contents of this policy file:
 *
 * The following methods in groovy have privileged operations wrapping
 * setAccessible.  If these wrappers are not provided, most codebases below
 * must have the following grant: 
 * permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
 *  MetaMethod.createMetaMethod
 *  MetaMethod.invoke(Object Object[])
 *  ReflectionMetaMethod.invoke(Object Object[])
 *  DefaultGoovyMethods.dump(Object)
 */

有一个page on Groovy’s website of “things you can do but better leave undone”,它列出了隐私问题:

  1. Disregarding other objects’ privacy

When accessing methods, fields, or properties of other classes, make
sure that you do not interfere with private or protected members.
Currently Groovy doesn’t distinguish properly between public, private,
and protected members, so watch out yourself.

正如蒂姆耶茨在链接问题上所说,目前尚不清楚这是一个缺陷还是一个特征.鉴于它可能会破坏现有的代码,我似乎不太可能在任何时候很快得到“修复”,如果有的话.

转载注明原文:java – 在groovy中仅使用来自另一个类的私有构造函数的类的实例化 - 代码日志