加载包中的每个类

时间:2013-10-25 11:14:57

标签: java dynamic reflection

我目前正在使用反射从classes中的ClassLoader字段中获取所有已加载的类,然后检查getPackage是否等于我正在搜索的包。我遇到的一个问题是,ClassLoader没有加载类,但我无法使用Class.forName自行加载它们,因为我不知道类的名称因为它们是动态加载的并且总是在变化。所有类的共同点是它们扩展Module。我如何从包中加载所有类?

提前致谢。

1 个答案:

答案 0 :(得分:1)

使用reflections API肯定有效。如果不是,你可能会以错误的方式设置它。我刚刚编写了这个例子,它独立于任何类加载器打印包中的所有类。

package com.test;

import java.util.Arrays;
import java.util.Iterator;
import java.util.Set;

import org.reflections.Reflections;
import org.reflections.scanners.FieldAnnotationsScanner;
import org.reflections.scanners.MemberUsageScanner;
import org.reflections.scanners.MethodAnnotationsScanner;
import org.reflections.scanners.MethodParameterNamesScanner;
import org.reflections.scanners.MethodParameterScanner;
import org.reflections.scanners.SubTypesScanner;
import org.reflections.scanners.TypeAnnotationsScanner;
import org.reflections.util.ClasspathHelper;
import org.reflections.util.ConfigurationBuilder;
import org.reflections.util.FilterBuilder;

public class Runner {

    public static void main(String[] args) {
        Reflections reflections = new Reflections();
        FilterBuilder TestModelFilter = new FilterBuilder().include("com.test.*");

        reflections = new Reflections(new ConfigurationBuilder()
                .setUrls(Arrays.asList(ClasspathHelper.forClass(Runner.class))).filterInputsBy(TestModelFilter)
                .setScanners(new SubTypesScanner(false), new TypeAnnotationsScanner(), new FieldAnnotationsScanner(),
                        new MethodAnnotationsScanner(), new MethodParameterScanner(), new MethodParameterNamesScanner(),
                        new MemberUsageScanner()));

        Set<Class<? extends Object>> allClasses = reflections.getSubTypesOf(Object.class);
        System.out.println(allClasses);
        for (Iterator it = allClasses.iterator(); it.hasNext();) {
            Class<? extends Object> clazz = (Class<? extends Object>) it.next();
            System.out.println(clazz.getCanonicalName());
        }
    }

}

我按意图添加了所有导入,因此您可以查看它使用的API。这对你有用吗?