2015-04-16 9 views
8
class test { 
    public static void main(String[] args) { 
     new test(); 
    } 
    void method() { 
     class inside { 
       int a; 
       void methodinside() {} 
     } 
    } 
} 

я объявлял класс с помощью отражения, как:Получение класса внутри метода с помощью отражения

Class c = Class.forName("test"); 
Class[] cls = c.getDeclaredClasses(); 
for(Class cl : cls) 
    System.out.println(cl.getName()); 

но моя программа не может найти class inside.

+1

Интересно, поскольку мы можем сделать обратное с помощью 'getEnclosingClass'. http://ideone.com/nA3Zua – Radiodef

+0

Как получить доступ в основном, в то время как класс внутри другого метода или другого класса ??? – newbie

+0

Если вы хотите получить доступ к классу из 'main', вы должны объявить его где-нибудь, где' main' может его увидеть. Точка этих локальных классов не должна быть видна вне метода объявления. – Thilo

ответ

1

В getDeclaredClasses() метод возвращает значение (от javadoc) -

массив объектов класса, отражающих все классы и интерфейсы , объявленные в качестве членов класса, представленного этим объектом класса. Это включает общедоступный, защищенный, доступ по умолчанию (пакетный) и приватные классы и интерфейсы класса , объявленные классом, но не включает унаследованные классы и интерфейсы .

Так что, похоже, он не возвращает никакого внутреннего класса, который вы заявили. Вот почему вы ничего не получаете в массиве Classcls.

+1

так, как я могу получить этот класс ??? – newbie

2

Я не думаю, что существует метод поиска локальных классов (классов, определенных внутри метода).

Вы можете использовать try to enumerate all classes in the package, а затем использовать getEnclosingClass (напротив того, что вы ищете), чтобы отфильтровать их.

+0

Я не верю, что есть способ перечислить все классы в пакете. – Radiodef

+0

@Radiodef: Нет хорошего способа, нет ... – Thilo

+0

попробуйте посмотреть в файлах классов. есть файл file test $ 1inside.class – newbie

2

Это способ получить класс Inner в методе.

public class Main { 
    public static void main(String[] args) throws ClassNotFoundException { 
     Class<?> clazz = Class.forName("Outer$1InnerMethodClass"); 
     System.out.println(clazz.getName()); 

     clazz = Class.forName("Outer$2InnerMethodClass"); 
     System.out.println(clazz.getName()); 

     clazz = Class.forName("Outer$2InnerMethodClass$1InnerMethodInnetMethod"); 
     System.out.println(clazz.getName()); 
    } 

} 

class Outer{ 
    void outerMethod1() { 
     class InnerMethodClass { 
      int a; 
      void innerMethod() {} 
     } 
    } 

    void outerMethod2() { 
     class InnerMethodClass { 
      int a; 
      void innerMethod() { 
       class InnerMethodInnetMethod{ 

       } 
      } 
     } 
    } 
} 
+1

Это не может быть безопасно обобщено, хотя. Точное имя локального класса не специфицировано спецификацией, а только его формат. – Radiodef

+0

так, что я должен делать ??? – newbie

2

В Java нет общих методов для перечисления классов по дизайну. Это связано с тем, что классы могут загружаться из любого места или динамически создаваться. Хранение файлов классов в JAR или каталоге - это всего лишь один из возможных загрузчиков классов.

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

Если вы принимаете общий случай URLClassLoader, вы можете обрабатывать базовые URL-адреса как файловые системы и перечислять их содержимое. Это может быть целесообразно, если вы создаете инструмент для чего-то с существующим сторонним кодом, и он даже принят для многих стандартов Java EE (по ошибке, я чувствую).

Если вы создаете подключаемый механизм, то providing metadata in a well-known location более эффективен, надежен и работает с любым допустимым загрузчиком классов.

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

  • Нет связанных вопросов^_^