1

如何使用反射获取 .java 文件的所有类名。

当我运行以下代码时,它只会打印出 Boat。我尝试过制作一系列类,例如:

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();
    }
  }
}

船.java

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

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

4 回答 4

3

即使您在单个 .java 文件中编写多个类(只有一个公共类),您也会得到多个 .class 文件。因此,您无法从 .java 文件中获取类列表。

您确实可以选择编写自定义解析器来解析 .java 文件并检索类名。不知道那有什么用?

于 2013-04-12T07:15:13.640 回答
0

您可以Boat通过调用对象getSuperclass()来获取类的超类Class

Class<?> c = Boat.class;

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

查看java.lang.Class的 API 文档。

于 2013-04-12T07:17:44.103 回答
0

它是我们在not.class中提供的文件。文件。所以没有规定使用方法从 .java 文件中获取所有类。Class.forName("");javaClass.forName()

于 2013-04-12T07:17:51.643 回答
0

如果您愿意使用其他库,则可以使用 Reflections Project,它允许您搜索包中列出的类。

 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 文件做,但你可以在所有类中搜索包名。

于 2013-04-12T07:18:10.280 回答