You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何在私有方法中访问其他类对象?附调用示例

Java私有方法相关问题解答

一、在私有方法中访问另一个类的对象

其实私有方法的访问限制是外部类无法直接调用该方法,但方法内部的执行逻辑和普通方法完全一致——只要你能合法获取到另一个类的实例(比如通过参数传入、public构造创建、工厂方法获取等),就可以正常访问它的成员:

  • 如果是另一个类的public成员,直接调用即可;
  • 如果要访问非public成员,同样可以借助反射机制实现。

举个简单示例:

// 另一个类B
public class B {
    public void sayHello() {
        System.out.println("Hello from Class B");
    }
}

// 包含私有方法的类A
public class A {
    // 私有方法中接收B的实例并访问它的public方法
    private void accessAnotherClass(B bObj) {
        bObj.sayHello();
    }

    // 提供一个public方法触发私有方法执行
    public void start() {
        accessAnotherClass(new B());
    }
}

二、从另一个类调用私有方法(反射实现)

Java的封装性可以通过反射机制绕过,从而调用其他类的私有方法。你提供的示例就是标准的实现方式,我来拆解每一步的作用:

首先定义包含私有方法的类A.java:

public class A { 
    private void message(){
        System.out.println("hello java"); 
    } 
}

然后是调用私有方法的类MethodCall.java:

import java.lang.reflect.Method; 

public class MethodCall{ 
    public static void main(String[] args)throws Exception{ 
        // 1. 获取A类的Class对象
        Class<?> c = Class.forName("A"); 
        // 2. 创建A类的实例(若A有私有构造,需用反射获取构造方法后实例化)
        Object o = c.newInstance(); 
        // 3. 获取指定的私有方法:参数为方法名 + 方法的参数类型列表(无参数则传null)
        Method m = c.getDeclaredMethod("message", null); 
        // 4. 关闭访问检查,允许调用私有方法
        m.setAccessible(true); 
        // 5. 执行方法:第一个参数是实例对象,后续是方法的入参(无参数传null)
        m.invoke(o, null); 
    } 
}

关键注意点:

  • 反射会破坏Java的封装原则,仅建议在框架开发、工具类等特殊场景使用,常规业务代码尽量避免;
  • Java 9及以上版本的模块系统可能会限制反射访问,需要额外配置模块权限;
  • newInstance()方法在Java 9中已过时,推荐使用c.getConstructor().newInstance()来创建实例。

内容的提问来源于stack exchange,提问作者Aja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:55:48