温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何访问 java private

发布时间:2026-09-13 21:30:14 来源:亿速云 阅读:101 作者:小樊 栏目:编程语言

在 Java 中,private 成员(字段、方法、构造器)只能在定义它的类内部访问。但如果你“想从外部访问 private 成员”,常见有以下几种方式(按合规程度从正常到特殊):


一、正常且推荐的方式(设计层面)

1. 提供 public getter / setter

class User {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

✅ 这是最推荐的方式,符合封装原则。


2. 在类内部提供 public 方法

class Secret {
    private int code = 123;

    public int getCode() {
        return code;
    }
}

二、通过构造器 / 内部类访问

3. 内部类访问外部类 private 成员

class Outer {
    private int x = 10;

    class Inner {
        void show() {
            System.out.println(x); // ✅ 合法
        }
    }
}

三、特殊手段(不推荐,仅用于框架 / 测试 / 研究)

4. 反射(Reflection)访问 private 成员

import java.lang.reflect.Field;

class Demo {
    private String secret = "hidden";
}

public class Test {
    public static void main(String[] args) throws Exception {
        Demo d = new Demo();
        Field f = Demo.class.getDeclaredField("secret");
        f.setAccessible(true); // 关键
        System.out.println(f.get(d));
    }
}

⚠️ 注意:

  • 破坏封装
  • 可能被 SecurityManager 或模块系统(JPMS)限制
  • Java 9+ 模块下访问受限

5. 通过反射调用 private 方法

Method m = Demo.class.getDeclaredMethod("privateMethod");
m.setAccessible(true);
m.invoke(d);

四、测试场景(合理)

6. 使用测试框架(如 JUnit + 反射工具)

  • org.springframework.test.util.ReflectionTestUtils
ReflectionTestUtils.setField(obj, "fieldName", value);

五、不推荐 / 禁止方式

❌ 直接改源码去掉 private
❌ 依赖编译器 hack
❌ 在生产代码中滥用反射


总结

方式 是否推荐
getter / setter ✅ 强烈推荐
公共方法 ✅ 推荐
内部类 ✅ 可用
反射 ⚠️ 特殊场景
直接改访问权限 ❌ 不推荐

如果你能说明使用场景(测试?框架?调试?学习?),我可以给你更合适的方案。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手