引用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
不导出该程序包。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)