javajaxb是如何工作的?

javajaxb是如何工作的?,java,jaxb,Java,Jaxb,出于对jaxb工作原理的好奇,我有一个类注释如下: @XmlRootElement(name = "MyJaxb") Class MyJaxb { @XmlElement protected String str; public void setStr(String str) { this.str = str; } } 字段str的访问修饰符是受保护的,为什么Jaxb仍然可以对其进行marshall和unma

出于对jaxb工作原理的好奇,我有一个类注释如下:

@XmlRootElement(name = "MyJaxb")
Class MyJaxb
{
      @XmlElement
      protected String str;

      public void setStr(String str)
      {
           this.str = str;
      }
 }
字段str的访问修饰符是受保护的,为什么Jaxb仍然可以对其进行marshall和unmarshall?

它使用。可以使用反射API(在相应的
字段
方法
对象上使用
setAccessible(true)
)来访问
受保护的
私有
字段或方法)


请记住-
public
protected
private
是默认可见性的控件,仅此而已。它们不会(也不能)阻止使用反射进行访问。

除了回答反射可以通过检查(这是正确的)之外,这也是其他JDK内部部件所需要的,特别是默认对象序列化和反序列化。一般来说,这是允许的,因为许多工具受益于这种访问。正如其他人正确指出的那样,访问权并不是真正的安全屏障。它们可以帮助程序员正确地设计抽象,更容易地设计出好的设计。

谢谢,但我很好奇为什么Java提供了类似反射的接口来更改修饰符(setAccessible(true)),这有什么意义?我的意思是它打破了访问的概念control@Guoqin如果您真的愿意,您可以使用反射强制通过访问控制,但您知道您是在故意破坏它。访问控制关键字旨在表达程序员的意图,而不是作为安全工具。如果程序员将一个字段
设置为私有的
,(s)他说的是“你不应该自己弄乱这个字段”-如果你强制设置,程序的行为就不能保证。@Jesper是对的,但是修改私有/受保护字段的能力可能会在Java安全管理器级别被阻止(如果有人偏执到可以这么做)如果有人对我感兴趣,我写这封信是为了访问私有和受保护的字段。