繁体   English   中英

我需要一个java方法,可以从我的API中的任何地方访问,但无法使用API​​从应用程序访问

[英]I need to have a java method that can be accessed from anywhere within my API but cannot be accessed from the application using the API

我正在开发一个java API。 在我的开发过程中,我一直面临以下问题:

我在两个不同的包中有两个类。 包x中的A类,包y中的B类。 我需要类A来访问类B中定义的方法M.因此,应该用于方法M的修饰符是public 但是,我不希望允许在他/她的java应用程序中使用我的API的开发人员访问方法M.问题是方法M有一个我提到的public修饰符,因此任何人都可以在API或来自API之外。 同时,如果我将方法M的修饰符级别降低到protectedprivate ,则类A将无法访问方法M,因为它属于不同的包。 我怎么解决这个问题? 我唯一的解决方案是在同一个包中有A和B吗?

创建一个界面并仅向公众公开,隐藏您的实现。 例如:

我的实现(例如,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。

限制对特定类的访问的唯一方法是使方法受保护或包私有。 两者都只允许在包内访问。 我建议重新格式化你的包结构。

在方法内部,您可以插入:

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()

您可以将项目拆分为2:公共API及其实现。 为B类定义2个接口:

  1. 库用户的公共接口(在API项目中)。
  2. 扩展公共接口的内部接口并添加方法M.

用户将在编译时依赖于您的API,并将在运行时获得实现。

你可以使用反射。 这是一个例子。

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM