2016-01-29 5 views
0

Java 7Вызов метода анонимного класса

Прежде всего, я собираюсь упростить пример, чтобы избежать отправки ненужного кода. Мой конкретный конкретный пример немного сложный, но я стараюсь сохранить смысл.

public class Test { 

    public static void main(String[] args){ 
     Test t = new Test(){ //<--------------------------------------------------------- 
      public void m(){ //               | 
       Test t = new Test(){//             | 
        public void m(){//             | 
         //Here I need to invoke the most inclosing class's m() method 
        } 
        //other actions 
       }; 
      } 

      public void someMethod(){ 
       //action 
      } 
     }; 
    } 

    public void m(){ 

    } 
} 

Можно ли это сделать на Java? Я имею в виду, чтобы вызвать метод анонимного класса таким образом?

+2

Какой метод вы хотите назвать точно? – sp00m

+0

@ sp00m 'm()' анонимного класса. –

ответ

3

No невозможно, потому что нет ссылки на анонимные классы.

Это единственный возможный способ для вызова метода экземпляра m():

new Test(){             
    public void m(){             

    } 
}.m(); 

По определению в соответствии с документацией оракула here:

Анонимных классы позволят вам сделать ваш код более кратким. Они позволяют объявлять и создавать экземпляр класса одновременно. Они похожи на локальные классы, за исключением того, что у них нет имени. Используйте их , если вам нужно использовать локальный класс только один раз

Так что, если вы должны использовать один из методов вашего класса вы должны создать локальную один.

+0

Итак, получилось, это печально ... –

+1

'm()' возвращает 'void', поэтому вы не можете назначить его' t'. –

1

Вы не можете получить доступ к методам анонимного класса, используя обычный Java, но Вы можете с помощью отражения:

Test t = new Test{ 
    public void m() { 
     System.out.println("Welcome to my class"); 
    } 
}; 
Class<?> c = t.getClass(); 
Method m = c.getDeclaredMethod("m"); 
// m.setaccessible(true); // if private 
m.invoke(t); 
1

Вот способ сделать это:

public class Test 
{ 
    public static void main(String[] args) 
    { 
     Test t = new Test() 
     { 
      public void m() // this one will be called 
      { 
       Runnable r = new Runnable() 
       { 
        @Override 
        public void run() 
        { 
         m(); 
        } 
       }; 

       Test t = new Test() 
       { 
        public void m() 
        { 
         r.run(); 
        } 
       }; 
      } 
     }; 
    } 

    public void m() 
    { 

    } 
} 

Если метод возвращает значение, используйте вместо этого Callable<V>.

+0

Это не вызов окружающего класса ... Это то же самое, что и 'this.m()' из '' m() '. – Codebender

+0

Это вызов метода экземпляра самого вмещающего класса. –

+0

Можете ли вы отметить, какой метод 'm()' будет вызываться в коде? Я говорю, что он просто вызовет метод 'm()', который имеет в нем оператор 'r.run()'. Этого можно добиться, просто поставив 'this.m()' вместо 'r.run() '. – Codebender

Смежные вопросы