在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)应该非常合理。