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
相关产品推荐
相关产品推荐

