簡體   English   中英

從另一個訪問私有靜態方法

[英]accesing private static method from another

我有一個帶有私有靜態方法的主類。 我想從另一個 java 類訪問這個方法。 我嘗試了一些方法,但它們不起作用。 如何訪問該方法?

在這樣的主類下面;

public class RandomGenerate {

    public static void main(String[] args) throws Exception {
        System.out.print.ln("main method");
    }

    private static synchronized void createRandom(PersonObj person, int number, List s) {
        System.out.println("deneme");
    }
}

我想從這樣的另一個 java 類調用createRandom

public class Deneme {
    RandomGenerate rg = new RandomGenerate();
    RandomGenerate.createRandom(person, number, sList);
}

然后,netbeans 顯示方法具有私有訪問權限。

您不應該從該類之外訪問private函數/變量。 如果您需要訪問某個類的private變量,您可以為該變量創建一個伴隨的getter ,並在該類上調用getter函數。

對於函數,如果您嘗試從中訪問函數的類在同一個包中,或者是具有該函數的類的子類,請將private更改為protected protected允許同一包或子類中的成員訪問該項目,但不允許包外的任何成員訪問。

關於Java可見性的一個很好的讀物是: http : //docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

這顯示了一個表:

                  Access Levels

Modifier    Class   Package Subclass    World

public      Y       Y       Y           Y

protected   Y       Y       Y           N

no modifier Y       Y       N           N

private     Y       N       N           N

主要是

如果您需要在類之外使用它,請將其設為public (或者如果您只在子類中需要它,則將其設為protected ,或者如果您只在包中需要它,則使用默認 [無關鍵字])。 如果您需要在課堂外使用它並且它是private並且您不能使它不是private ,那么這是一個您應該解決的設計問題。

但...

...您可以使用反射(教程文檔)來解決它,它允許您獲取方法並調用它,即使它是私有的。 一旦有了Method對象,就必須在調用它之前將setAccessible調用為true

但同樣,這是一種解決方法。 使用正確的訪問修飾符。

根據定義, private方法不能從另一個類訪問。 如果您需要調用它,您可以創建另一個內部調用私有方法的公共方法或將訪問修飾符更改為 public/protected/default。例如:

private static String secretMethod() { return "secret"; }
public static String knownMethod() { return secretMethod(); }

您需要為該方法選擇適當的訪問修飾符,選項是: publicprotecteddefault (通過不提供修飾符表示)和private

一個很好的解釋在這里: http : //docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

正如評論中提到的,您可以使用public來打開它,但是如果您不想要如此廣泛的訪問權限,您可以從default開始(如果您在同一個包中,它允許您訪問該方法),或protected (這與默認值相同,但也允許子類訪問該方法,如果您想擴展該類)。

作為一般規則,堅持使用最嚴格的許可。 以后打開權限更容易,但很難刪除它們。

只需將可見性從private更改為public以便其他實例可以訪問它們。 私有意味着它僅適用於自己的可用類。

您不能訪問定義此方法的類之外的私有方法。 您應該將其設為 Public 以提供對任何類的完全訪問權限,或者設為 protected 以提供對同一包中所有類的訪問權限。

單擊 [此處] http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html以獲取更多參考。

如果您真的希望訪問私有方法,則必須使用 Java 反射。 請參閱此示例代碼。

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Workspace {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        ClassWithPrivateMethod cwpm = new ClassWithPrivateMethod();
        Method m = cwpm.getClass().getDeclaredMethod("privateMethod", String.class);
        m.setAccessible(true); //This is a key statement for accessing private methods
        m.invoke(cwpm, "test");
    }
}

class ClassWithPrivateMethod {
    private void privateMethod(String someParam){
        System.out.println("I am private!!!");
        System.out.println("Parameter: " + someParam);
    }
}

此代碼將打印以下輸出:

I am private!!!
Parameter: test

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM