【问题标题】:Make a class method callable from anywhere in your program but not outside programs使类方法可从程序中的任何位置调用,但不能从程序外部调用
【发布时间】:2016-08-18 20:56:07
【问题描述】:

我在我的项目中创建了一个扩展 java.util.Logger 的类 MyLogger,我希望每个类都使用相同的记录器,因此有一个静态的 getLogger() 方法,它返回一个 Logger 对象。

计划将此作为一个 jar 文件,可以包含在其他人的程序中,但我不希望他们能够使用这个自定义记录器(即,如果他们想要记录,他们需要设置它使用自己的记录器)。

有什么方法可以让MyLogger 类在它自己的包中,同时允许我的项目/jar 中的其余类能够访问getLogger() 方法,但不允许我的项目之外的类调用它(有点像包私有,但对于整个项目)还是将它放在我的“父”包中的唯一方法?

【问题讨论】:

  • 有点像包私有,但适用于整个项目不。没有这样的访问修饰符。
  • 顺便说一句,您评估过SLF4J吗?
  • 您将能够在 Java 9 中使用模块来执行此操作。参考this table

标签: java access-modifiers


【解决方案1】:

是的,您可能注意到您不能将类放入包java.util,技术就是JSA。您可以使用 SecurityManager(使用访问控制器)。如果调用 logger-event 的库未通过您的私有证书认证,则会抛出未选中的 AccessControlException

您会在 FileOutputStream 中找到一个很好的示例,如下所示:

SecurityManager security = System.getSecurityManager();
if (security != null) {
    security.checkWrite(name); // throws ACE
}

要验证完整的 JVM 并禁用检查,您可以将私钥添加到 jdk-xxx/jre/lib/security/cacerts (keystore)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2015-07-18
    相关资源
    最近更新 更多