簡體   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