2013-04-12 3 views
0

Как получить все имена классов для .java-файла с использованием отражения.Отражение Java для получения нескольких классов

Когда я запускаю следующий код, он распечатывает только лодку. Я попытался сделать массив классов, таких как:

Class c[] = Class.forName("boat.Boat") 

, но это приводит к синтаксической ошибке

public class Reflection { 
public static void main(String[] args) { 
    try {   
     Class c = Class.forName("boat.Boat"); 
     System.out.println(c.getSimpleName()); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 

Boat.java

package boat; 
public class Boat extends Vehicle { 
    public Boat() {} 
} 

class Vehicle { 
    public Vehicle() { 
     name = ""; 
    } 
    private name; 
} 
+0

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

ответ

2

Даже если вы пишете несколько классов в одном .java (только с одним открытым классом), вы получите несколько файлов .class. Следовательно, вы не можете получить список классов из .java-файла.

У вас есть возможность написать собственный парсер для анализа файла .java и получения имен классов. Не знаете, что будет использовать это?

0

Вы можете получить суперкласс класса Boat по телефону getSuperclass() на Class объекта:

Class<?> c = Boat.class; 

Class<?> superClass = c.getSuperclass(); 
System.out.println(superClass.getSimpleName()); // will print: Vehicle 

Посмотрите на документацию API для java.lang.Class.

0

Это файл .class, который мы предоставляем в Class.forName(""); нет. java файл. Таким образом, нет никаких условий для получения всех классов из .java-файла с использованием метода Class.forName().

0

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

Reflections reflections = new Reflections("my.package.prefix"); 
//or 
Reflections reflections = new Reflections(ClasspathHelper.forPackage("my.package.prefix"), 
     new SubTypesScanner(), new TypesAnnotationScanner(), new FilterBuilder().includePackage(...), ...); 

//or using the ConfigurationBuilder 
new Reflections(new ConfigurationBuilder() 
     .filterInputsBy(new FilterBuilder().includePackage("my.project.prefix")) 
     .setUrls(ClasspathHelper.forPackage("my.project.prefix")) 
     .setScanners(new SubTypesScanner(), new TypeAnnotationsScanner().filterResultsBy(optionalFilter), ...)); 

//then query, for example: 
Set<Class<? extends Module>> modules = reflections.getSubTypesOf(com.google.inject.Module.class); 
Set<Class<?>> singletons =    reflections.getTypesAnnotatedWith(javax.inject.Singleton.class); 

Set<String> properties =  reflections.getResources(Pattern.compile(".*\\.properties")); 
Set<Constructor> injectables = reflections.getConstructorsAnnotatedWith(javax.inject.Inject.class); 
Set<Method> deprecateds =  reflections.getMethodsAnnotatedWith(javax.ws.rs.Path.class); 
Set<Field> ids =    reflections.getFieldsAnnotatedWith(javax.persistence.Id.class); 

Set<Method> someMethods =  reflections.getMethodsMatchParams(long.class, int.class); 
Set<Method> voidMethods =  reflections.getMethodsReturn(void.class); 
Set<Method> pathParamMethods = reflections.getMethodsWithAnyParamAnnotated(PathParam.class); 
Set<Method> floatToString = reflections.getConverters(Float.class, String.class); 

Как вы можете видеть, вы можете искать различные фильтры. Я не думаю, что вы не можете сделать для java-файла, но вы можете искать все классы для имени пакета.

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