Java反射以获得多个类

  • 本文关键字:反射 Java java reflection
  • 更新时间 :
  • 英文 :


如何使用反射获得.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();
    }
  }
}

Boat.java

package boat;
public class Boat extends Vehicle {
     public Boat() {}
}
class Vehicle {
     public Vehicle() {
         name = "";
     }
     private name;
}

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

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

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

如果您愿意使用其他库,您可以使用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文件中这样做但是你可以在所有类中搜索包名

可以通过在Class对象上调用getSuperclass()来获得Boat类的超类:

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

查看java.lang.Class的API文档

相关内容

  • 没有找到相关文章