匿名类方法访问

时间:2012-01-02 06:17:03

标签: java

是否可以通过任何方式访问anonySubClassMethod方法? 如果没有为什么Java编译器允许创建此方法?

abstract interface AnonyIfc {
   public abstract void methodIfc ();
}

public class AnonyImplementation {
   public static void main (String... a) {
      AnonyIfc obj = new AnonyIfc(){
         public void methodIfc() {
            System.out.println("methodIfc");
         }
         public void anonySubClassMethod() {
            System.out.println("anonySubClassMethod");
         }
      };
      //obj.anonySubClassMethod()  won't be visible since refering sub class
      //                           method with super class reference
   }
 }

更新
来自Francis Upton我明白anonySubClassMethod可以在匿名类中使用。那么我可以期望java编译器将访问说明符限制为anonySubClassMethod的私有吗?希望这个公共说明人也有理由。只是好奇。

4 个答案:

答案 0 :(得分:9)

正如其他人所说,可以从类中调用该方法。从课外调用它的唯一方法(除了使用反射)将如下所示:

new Object() {
    void doSomething() {
        //code
    }
}.doSomething();

答案 1 :(得分:5)

您可以使用反射来访问它,但是否则无法从匿名类之外的任何代码中获取它。但这并不意味着您无法从类中访问它。 methodIfc()可以调用它,这就是为什么编译器不能轻易地将它声明为死代码。

答案 2 :(得分:2)

可以从匿名类中调用该方法。此构造的更典型用法是您正在实现接口(例如,对于GUI侦听器)的情况,因此该方法将是已知的,因为它是调用者期望的接口的实现。

答案 3 :(得分:2)

编译器不限制anonySubClassMethod对private的可见性的原因是可以通过反射访问此方法:     obj.getClass().getMethod("anonySubClassMethod").invoke(obj)

如果您不想使用反射,则无法调用此方法。