2016-04-18 130 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