【问题标题】:java anonymous inner class unreachable codejava匿名内部类不可达代码
【发布时间】:2011-01-21 08:04:24
【问题描述】:

当您编写无法访问的代码时,Java 编译器会报错。例如

public void go()
{
    return;
    System.out.println("unreachable");
}

但是,当您在无法从任何地方访问的匿名类中定义新方法时,编译器不会抱怨。它允许你这样做,为什么? 例如,

class A
{
   public void go()
   {
     System.out.println("reachable - A");
   }
}
class B
{
   public static void main(String [] args)
   {
     A a = new A() {
              public void go()
              {
                System.out.println("reachable - B");
              }
              public void foo()
              {
                System.out.println("unreachable - B");
              }
           };
     a.go(); // valid
     a.foo(); // invalid, compiler error
  }
}

【问题讨论】:

  • 你在new A之后缺少括号()和一个括号};来结束匿名内部类的声明。
  • 您的示例代码根本无法编译。请更正。
  • 我只是将它复制到 B.java 文件并注释了 a.foo() 行,然后编译并运行它。抱歉,除了 a.foo() 部分,我在代码中看不到任何错误,我已经提到它会导致编译错误。
  • 另一种尚未提及的调用该方法的方式是,它可以使用提供foo 方法的A 的更新版本运行。

标签: java inner-classes unreachable-code


【解决方案1】:

首先:Eclipse 确实通知我foo() 从未在本地使用。然而,由于其他答案指出的原因,这是一个警告而不是错误。

请注意,有一种方法可以联系到foo()

new A() {
      public void go()
      {
        System.out.println("reachable - B");
      }
      public void foo()
      {
        System.out.println("unreachable - B");
      }
}.foo();

这是可行的,因为表达式new A() {} 的类型不是A,而是A 的匿名子类。并且该子类有一个公共的foo 方法。

由于不能有相同类型的变量,所以不能通过这种方式从变量访问foo()

【讨论】:

  • 谢谢。调用该方法的一种非常好的方式。内部类有非常有趣的属性ç
【解决方案2】:

这仅相当于允许您创建在类中的任何位置都不会调用的私有方法,真的。它不是完全相同意义上的不可访问代码 - 它可以通过反射访问。

这种东西可能会合理地发出警告(特别是在允许对警告进行非常细粒度调整的 IDE 上),但我认为这不应该是错误。

【讨论】:

  • 谢谢,你说的也对。可以在内部类的另一个方法中访问该方法。我现在明白了。
【解决方案3】:

原则上您可以通过反射在a 上调用foo() 方法,因此它并不总是无法访问。

a.go();之后试试这个:

Method m = a.getClass().getDeclaredMethod("foo");
m.invoke(a);

【讨论】:

  • 以及 JSP/Facelets 中的 EL 语言。
  • 谢谢。你说的对。但是我认为通过反射达到匿名内部类的方法是没有意义的。但是,正如其他答案中所述,还有其他方法可以达到它。
  • @kioto,它是否有意义并不重要,重要的是它可能。 Joachim 的回答确实不错。
【解决方案4】:
public void go()
{
   foo();
   System.out.println("reachable - B");
}

public void foo()
{
   System.out.println("unreachable - B");
}

只是另一种方式来达到 foo 方法它使用它的另一个类的方法。在问之前我应该​​明白这一点。对不起。

【讨论】: