2016-04-18 129 views
0

我做了一個例子來訪問內部類的私有方法,我每次都沒有發現類異常。私人內部類訪問方法

class Test { 
     public static void main(String[] args) throws Exception { 
      Class<?> clazz = Class.forName("Inner.Private"); 
      Method m = clazz.getDeclaredMethod("foo"); 
      m.setAccessible(true); 
      m.invoke(new Inner()); 
     } 
    } 

class Inner { 
    private class Private { 
     private void foo() { 
      System.out.println("foo called"); 
     } 
    } 
}// end of Inner 

我得到如下異常:在線程

異常 「主要」 拋出java.lang.ClassNotFoundException: 在java.net.URLClassLoader的$ 1.run(來源不明)Inner.Private

任何幫助將非常感激。讓我知道爲什麼它忽略了一個內部類或任何見解。

+1

Make Test a public class。 – theVoid

+4

它是'Inner $ Private'。 – Savior

+1

除了@Pillar之外,'m.invoke(new Inner());'將不起作用,因爲你正在給Inner.Private的一個方法提供Inner實例。 – Tunaki

回答

0

內部類必須去裏面其外部類。

public class Test { 

    private class Inner { 

     private void foo() { 
      System.out.println("foo called"); 
     } 
    } 

    public void test() 
      throws ClassNotFoundException, 
      NoSuchMethodException, 
      IllegalAccessException, 
      IllegalArgumentException, 
      InvocationTargetException { 
     Inner inner = new Inner(); 
     Class<?> clazz = Class.forName("com.oldcurmudgeon.test.Test$Inner"); 
     Method m = clazz.getDeclaredMethod("foo"); 
     m.setAccessible(true); 
     m.invoke(inner); 
    } 
+0

@Pillar他們怎麼沒有解決這個問題?請給出反饋時解釋,以便人們可以改善答案。 – Popeye

+0

@Pillar這更好,解釋總是更好。這個網站的全部目的是互相幫助。如果你有答案,那麼你應該在它關閉之前離開它。不要僅僅關注某些知道你評論的意思。你對「It's Inner $ Private」的評論讓我感到困惑了一分鐘,因爲我不知道你在說什麼,只是認爲你是一個酸性的用戶,隨意把詞彙放下 – Popeye

+0

@Pillar等人 - 謝謝你的反饋 - 我已經測試了新的代碼,現在它似乎做了預期的工作。 – OldCurmudgeon