【问题标题】:Can java private data members be accessed from outside the class? [duplicate]可以从类外部访问java私有数据成员吗? [复制]
【发布时间】:2012-12-11 19:27:06
【问题描述】:

可能重复:
Is it possible in Java to access private fields via reflection

有什么办法可以让我们在java中调用一个类的私有数据成员,可以在类外访问。 我想要一个棘手的问题库。 根据我的 Java 经验,我认为这是可能的,但我不知道该怎么做。

【问题讨论】:

标签: java private data-members


【解决方案1】:

根据 Java 语言规范,第 3 版:

6.6.8 Example: private Fields, Methods, and Constructors

A private class member or constructor is accessible only within the body of the top level class (§7.6) that encloses the declaration of the member or constructor. It is not inherited by subclasses.

您可以在 java 中使用reflection 来访问私有字段。理想情况下,您应该使用公共 setter 和 getter 方法从类外部访问此类数据(正如其他人发布的那样)

【讨论】:

  • 那么安全性呢?类概念的主要动机是限制直接访问字段。如果有办法访问私有字段/方法,那么 Java 如何确保安全性?
【解决方案2】:

定义一个公共的get 方法来获取你的类的私有字段。

【讨论】:

    【解决方案3】:

    不,你不能通过任何方式访问 java 中的私有变量。

    您可以提供公共 getter 和 setter 方法来访问或更改私有成员变量的值。

    【讨论】:

    • 我知道这个亲爱的,但那不是我在质疑。所以请正确阅读问题
    【解决方案4】:
    1. 没有私有成员不能在类外使用
    2. 您可以为此目的使用 getter 和 setter 方法

    【讨论】:

    • 我知道,亲爱的,private 并没有在课堂之外使用,但我需要一个使其成为可能的代码。 '类其他{私有字符串str; public void setStr(String value) { str = value; } } class Test { public static void main(String[] args) // 只是为了方便一次性测试。不要 // 正常执行此操作!抛出异常 { 其他 t = new Other(); t.setStr("你好");字段字段 = Other.class.getDeclaredField("str"); field.setAccessible(true);对象值 = field.get(t); System.out.println(值); } }'
    • 我知道这个亲爱的,但那不是我在质疑。所以请正确阅读问题
    • @ArunKumarThakur 是的,亲爱的。你即将发布 java 8 吗?很抱歉回答您已经获得 -3 票的好问题。
    • 对不起,亲爱的,我再次说你不明白我在问什么,所以请不要发表评论。还有一种我们通常不使用但我们可以访问私人数据成员的方法在课堂之外,即通过反射。
    • 我希望你明白我在说什么。
    【解决方案5】:

    有关访问修饰符的更多信息,请查看以下链接

    http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

    这用于通过反射访问 Java 中的私有变量

    Accessing private variables in Java via reflection

    【讨论】:

      【解决方案6】:

      1) 如果 SecurityManager 允许,您可以使用反射来完成

      class B {
          private int x = 2;
      }
      
      public class A {
      
          public static void main(String[] args) throws Exception {
              Field f = B.class.getDeclaredField("x");
              f.setAccessible(true);
              f.get(new B());
          }
      }
      

      2) 在内部类的情况下

      class A {
          private int a = 1;
      
          class B {
              private int b = 2;
      
              private void xxx() {
                  int i = new A().a;
              };
          }
      
          private void aaa() {
              int i = new B().b;
          }
      

      【讨论】:

      • 谢谢亲爱的,这就是我想要的......
      • 为此,两个类都应该在一个包中?
      • @Android Killer 用于反射没关系,f.setAccessible(true) 破坏了安全性。
      • 感谢分享您的知识。
      • 那么安全性呢?类概念的主要动机是限制直接访问字段。如果有办法访问私有字段/方法,那么 Java 如何确保安全性?
      【解决方案7】:

      您可以使用返回/设置私有字段值的公共方法来做到这一点。

      public Class A{
      
         private String myData;
      
         public String getMyData(){
              return myData;
         }
      
         public void setMyData(String data){
              this.myData=data;
         }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-05-30
        • 2015-01-26
        • 2021-08-16
        • 2011-08-11
        • 2020-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        相关资源
        最近更新 更多