在Java中使用来自另一个类的私有方法

在Java中使用来自另一个类的私有方法,java,Java,我有两门课: public class Class1{} public class Class2{ private void simpleMethod(){ /*...*/ } } 在Class2中,我有一个私有方法simpleMethod(),我想在同一个项目的Class1中使用它。我不想将此方法重命名为public,因为我不想在API中显示它。我可以创建public方法而不在API中显示它吗?或者,还有什么?如果两个类都在同一个包中,那么您可以将simpleMethod保留为默认可

我有两门课:

public class Class1{}
public class Class2{
    private void simpleMethod(){ /*...*/ }
}

Class2
中,我有一个私有方法
simpleMethod()
,我想在同一个项目的
Class1
中使用它。我不想将此方法重命名为
public
,因为我不想在API中显示它。我可以创建
public
方法而不在API中显示它吗?或者,还有什么?

如果两个类都在同一个包中,那么您可以将
simpleMethod
保留为默认可见性,因此它只能由类和同一个包中的类使用

package org.foo;
public class Class1 {
    //visibility for classes in the same package
    void simpleMethod() { }
}

package org.foo;
public class Class2 {
    public void anotherMethod() {
        Class1 class1 = new Class();
        class1.simpleMethod(); //compiles and works
    }
}

package org.bar;
import org.foo.Class1;
public class Class3 {
    public void yetAnotherMethod() {
        Class1 class1 = new Class1();
        class1.simpleMethod(); //compiler error thrown
    }
}

如果
Class1
Class2
都在同一个包中,您只需删除
private
修饰符,就可以使用该方法。这样它就不会在API中公开,您可以从
Class1
访问它

之前:

public class Class2 {
    // method is private
    private void simpleMethod() { ... }
}
之后:

public class Class2 {
    // method is package-private: can be accessed by other classes in the same package
    void simpleMethod() { ... }
}

使用
protected
或完全省略访问修饰符


除了上述场景,您还可以使用反射API访问私有方法,如下所示:

Class a = Class.forName("");
Method method = a.getDeclaredMethods()[0];//retrieve your method here
method.setAccessible(true);

另一种方法是使用两个不同的接口。一个用于您的公共API,一个用于您的内部API,您的
Class2
对象将实现这两者。与API打交道的每个人都会通过您公开的公共接口与它交谈

public class Class2 implements PublicApi2 {
    public void somePrivateMethod() {
        ...
    }

    @Override
    public void somePublicMethod() {
        ...
    }

}
(这里没有实现两个接口,事实上不需要“私有接口”,因为您的库/框架/任何对象都可以处理具体的类,但这取决于您)

客户端总是将您的对象引用为“PublicApi2”类型,并且从不处理具体实现(Class2),而您的内部类则会这样做。

使用反射#setAccessible(true)应该非常合理。