SharedSecrets机制如何工作?
jdk.internal.misc.SharedSecrets
描述为:
“共享秘密”的存储库,这是一种在不使用反射的情况下在另一个程序包中调用实现私有方法的机制。package-
private类实现了一个公共接口,并提供了在该包内调用package-
private方法的能力。实现该接口的对象是通过限制访问的第三包提供的。该框架避免了为此目的使用反射的主要缺点,即损失了编译时检查。
有人可以提供一个示例来说明此机制如何使一个包中的类访问另一个包中的包私有方法吗?
回答:
引用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
。
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);
}
}
package external.story;import external.character.Character;
import internal.secrets.SharedSecrets;
public final class Story
{
/**
* Introduces a character.
*
* @param character the character
*/
public void introduce(Character character)
{
System.out.println(character.name() + " enters the room and says: " + SharedSecrets.INSTANCE.secretCharacter.getPhrase(character));
}
}
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();
}
};
}
/**
* @return the character's introductory phrase
*/
abstract String getPhrase();
}
package internal.secrets;public final class SharedSecrets
{
public static SharedSecrets INSTANCE = new SharedSecrets();
public SecretCharacter secretCharacter;
/**
* Prevent construction.
*/
private SharedSecrets()
{
}
}
package internal.secrets;import external.character.Character;
public interface SecretCharacter
{
/**
* @param character a character
* @return the character's introductory phrase
*/
String getPhrase(Character character);
}
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
不导出该程序包。
以上是 SharedSecrets机制如何工作? 的全部内容, 来源链接: utcz.com/qa/412149.html