您可以在 Java 中访问私有变量,而无需来自非内部类的类的 getter [重复]

Posted

技术标签:

【中文标题】您可以在 Java 中访问私有变量,而无需来自非内部类的类的 getter [重复]【英文标题】:You can access private variables in Java without getters from a class that's not an inner class [duplicate] 【发布时间】:2015-09-26 08:44:26 【问题描述】:

我对 serialVersionUID 的用途有所了解,并且在我不知道的情况下,我可以查找它。但它可以是在类中不使用的私有变量。这背后有什么结构吗?是否还有其他未在同一类中使用的私有变量/方法的示例?我可以访问 Java 中的私有变量,而无需来自非内部类的类的 getter,就像序列化一样?

【问题讨论】:

你可以使用reflection 反对者请澄清。 不,请关闭。这就是我一直在寻找的。​​span> 【参考方案1】:

您可以访问这些值,并通过Reflection 操作它们。 通过这种机制,您可以检查字段并调用方法。

【讨论】:

【参考方案2】:

Java 虚拟机正在读取此字段,它可以对您的程序执行任何操作,包括读取私有字段。注意序列化相关的方法比如writeObjectcan also be private,不过这对于JVM来说也不是问题。

您还可以通过反射或 java.lang.invoke API 访问私有字段/方法(但是 SecurityManager 可能会阻止您这样做)。在 Oracle JDK/Open JDK 中,还有未记录的 sun.misc.Unsafe API,它允许您执行许多ughm 不安全的事情,甚至包括从对象中读取原始数据。

【讨论】:

【参考方案3】:

使用java.lang.reflect.Member.setAccessible(true) 将在运行时覆盖任何隐私(不是很多——JVM 会很高兴地访问给定名称的私有字段或方法,请参阅this answer。

【讨论】:

以上是关于您可以在 Java 中访问私有变量,而无需来自非内部类的类的 getter [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java中类变量可以被继承吗

Java入门——深入理解Java三大特性

来自孩子的PHP私有变量访问

JAVa类中默认的成员变量的访问权问题

从 C++ 中的类访问私有变量

函数中的私有变量和特权方法