SharedSecrets机制如何工作?

SharedSecrets机制如何工作?,第1张

SharedSecrets机制如何工作?

引用http://blog.fuseyism.com/index.php/2008/05/26/sharing-
secrets/

在通过OpenJDK查找VM项目时,我注意到他们对此有一个非常有趣的解决方案。它封装在sun.misc.SharedSecrets中。此类提供对许多公共接口实例的访问,例如sun.misc.JavaLangAccess。实际的实现作为相应包中的内部类提供,例如java.lang,在其中它可以访问其中的私有和私有包变量及方法。

这是一个具体的例子:

  • 我们有两个类:
    Character
    Story
  • 我们想向外部用户(而不是模块外部的类)公开
    Character
    的非公共方法
    Story

Main.java:

package external.main;import external.character.Character;import external.story.Story;public class Main{    public static void main(String[] args)    {        Story story = new Story();        story.introduce(Character.HARRY_POTTER);        story.introduce(Character.RON_WEASLEY);        story.introduce(Character.HERMIONE_GRANGER);    }}

Story.java

package external.story;import external.character.Character;import internal.secrets.SharedSecrets;public final class Story{        public void introduce(Character character)    {        System.out.println(character.name() + " enters the room and says: " + SharedSecrets.INSTANCE.secretCharacter.getPhrase(character));    }}

Character.java:

package external.character;import internal.secrets.SecretCharacter;import internal.secrets.SharedSecrets;public enum Character{    HARRY_POTTER    {        @Override        String getPhrase()        { return "Your bird, there was nothing I could do. He just caught fire.";        }    },    RON_WEASLEY    {        @Override        String getPhrase()        { return "Who are you and what have you done with Hermione Granger?";        }    },    HERMIONE_GRANGER    {        @Override        String getPhrase()        { return "I'm not an owl!";        }    };    static    {        SharedSecrets.INSTANCE.secretCharacter = new SecretCharacter()        { @Override public String getPhrase(Character character) {     return character.getPhrase(); }        };    }        abstract String getPhrase();}

SharedSecrets.java:

package internal.secrets;public final class SharedSecrets{    public static SharedSecrets INSTANCE = new SharedSecrets();    public SecretCharacter secretCharacter;        private SharedSecrets()    {    }}

SecretCharacter.java:

package internal.secrets;import external.character.Character;public interface SecretCharacter{        String getPhrase(Character character);}

module-info.java:

module SharedSecret{    exports external.character;    exports external.main;    exports external.story;}

输出量

HARRY_POTTER进入房间说:您的鸟儿,我无能为力。他只是着火了。

RON_WEASLEY进入房间说:你是谁,你对Hermione Granger做过什么?

HERMIONE_GRANGER进入房间并说:我不是猫头鹰!

说明

  • external.character.Character.getPhrase()
    受包装保护。
  • external.story.Story
    位于不同的程序包中。
  • 通常
    Story
    无法调用
    Character.getPhrase()
    ; 但是,
    SharedSecrets
    允许
    Character
    与其信任的类共享访问权限。
  • Story
    调用
    SharedSecrets.INSTANCE.secretCharacter
    ,该调用使用匿名嵌套类访问
    Character
    的内部。
  • external.story.Story
    可以访问,
    internal.secrets.SharedSecrets
    因为两者位于同一模块中,但是外部用户无法访问它,因为
    module-info.java
    不导出该程序包。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5616209.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存