我正在开发一个java API。在我的开发过程中,我一直面临以下问题:
我在两个不同的包中有两个类。包x中的A类,包y中的B类。我需要类A来访问类B中定义的方法M.因此,应该用于方法M的修饰符是public
。但是,我不想允许在他/她的java应用程序中使用我的API的开发人员访问方法M.问题是方法M有一个public
修饰符,正如我所提到的,因此任何人都可以在API内或从API外部访问它。同时,如果我将方法M的修饰符级别降低到protected
或private
,则类A将无法访问方法M,因为它属于不同的包。我怎么解决这个问题?我唯一的解决方案是将A和B放在同一个包中吗?
答案 0 :(得分:1)
创建一个界面并仅向公众公开,隐藏您的实现。例如:
我的实现(例如,application.jar):
public class Test implements TestInterface {
public void somePrivateStuff() { }
public void somePublicStuff() { }
}
亲爱的世界,这是我的API(比方说,例如,publicAPI.jar):
public interface TestInterface {
public void somePublicStuff();
}
其他开发人员会针对您的publicAPI.jar进行编译。运行时实现将来自您的application.jar。
答案 1 :(得分:0)
限制对特定类的访问的唯一方法是使方法受保护或包私有。两者都只允许在包内访问。我建议重新格式化你的包结构。
答案 2 :(得分:0)
在方法中,您可以插入:
Throwable th = new Throwable().fillInStackTrace();
StackTraceElement element = th.getStackTrace()[TEST BETWEEN 3 AND 5];
if (element.getClassName().startsWith("your.package")) {
// CONTINUE YOUR METHOD.
}
else {
// USER ACCESSING FROM AN APPLICATION.
// THROW EXCEPTIONS, SHUTDOWN THE SYSTEM... DO WHAT YOU WANT.
}
在第二行,在3,4和5之间进行测试,看看哪一个返回正确的element.getClassName()
。
答案 3 :(得分:0)
您可以将项目拆分为2:公共API及其实现。 为B类定义2个接口:
用户将在编译时依赖于您的API,并将在运行时获得实现。
答案 4 :(得分:0)
你可以使用反射。这是一个例子。
package b;
public class B {
private void m() {
System.out.println("Called m()");
}
}
和
package a;
import b.B;
import java.lang.reflect.Method;
public class A {
public static void main(String[] args) throws Exception {
B b = new B();
Method m = B.class.getDeclaredMethod("m");
m.setAccessible(true);
m.invoke(b);
}
}
哪个输出
Called m()