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

时间:2015-04-15 20:22:24

标签: java

我有两个班级:

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

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

5 个答案:

答案 0 :(得分:13)

如果Class1Class2都在同一个套餐中,您只需删除private修饰符,即可生成方法package-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() { ... }
}

答案 1 :(得分:8)

如果两个类都在同一个包中,那么您可以将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
    }
}

答案 2 :(得分:3)

那么,另一种方法是拥有两个不同的界面。一个用于您的公共API,另一个用于您的内部API,您的Class2对象将实现这两​​者。处理API的每个人都会通过您公开的公共界面与之交谈

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

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

}

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

客户端将始终将您的对象引用为“PublicApi2”类型,并且在您的内部clases将永远不会处理具体实现(Class2)。

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

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