如何使用反射获得.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文档