代码之家  ›  专栏  ›  技术社区  ›  Abder KRIMA

为什么当我将类调用到javabean中时,java反射不起作用?

  •  0
  • Abder KRIMA  · 技术社区  · 10 年前

    我尝试用java反射显示所有包的名称,当我使用主方法进行测试时,它工作得很好:

    获取whitch的所有包名的方法位于名为test1.java的类中:

     public Set<String> findAllPackages(String packagebase) {
        List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>();
        classLoadersList.add(ClasspathHelper.contextClassLoader());
        classLoadersList.add(ClasspathHelper.staticClassLoader());
        Reflections reflections = new Reflections(
                new ConfigurationBuilder()
                        .setScanners(new SubTypesScanner(false),
                                new ResourcesScanner())
                        .setUrls(
                                ClasspathHelper.forClassLoader(classLoadersList
                                        .toArray(new ClassLoader[0])))
                        .filterInputsBy(
                                new FilterBuilder().include(FilterBuilder
                                        .prefix(packagebase))));
        Set<Class<? extends Object>> classes = reflections
                .getSubTypesOf(Object.class);
        Set<String> packageNameSet = new TreeSet<String>();
        for (Class classInstance : classes) {
            packageNameSet.add(classInstance.getPackage().getName());
        }
        return packageNameSet;
    }
    

    我在同一类中的主要方法:

        public static void main(String[] args) throws ClassNotFoundException,
            IOException {
        for (String pack : new test1().findAllPackages("org.basepackage")) {
            System.out.println(pack);
        }
    }
    

    当我尝试将我的方法放入我的managedbean或只是将我的test1.java类安装到我的menagedbean中时,它不起作用,当我调试时,我发现它没有进入findAllPackages的循环。

    我的豆子看起来像:

     @Named
    @ViewScoped
    public class mymanagedbean implements Serializable {
    private List<SelectItem> packageNameItems;
     @PostConstruct
    public void init() {        
        try {
            packageNameItems=new ArrayList<SelectItem>();
            packageNameItems=(new test1().loadpackageName("org.basepackage"));
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    

    我有吸气器&managedbean中packageNameItems的setters

    我的jsf看起来像:

     <h:form>
                    <h:selectOneMenu value="#{mymanagedbean.packageName}">
                        <f:selectItems value="#{mymanagedbean.classNameItems}"/>
                    </h:selectOneMenu>
                </h:form>
    

    你知道吗?

    1 回复  |  直到 10 年前
        1
  •  0
  •   Abder KRIMA    10 年前

    我解决了这个问题:

    public Set<String> findAllPackages(String packagebase) {
    List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>();
    classLoadersList.add(ClasspathHelper.contextClassLoader());
    classLoadersList.add(ClasspathHelper.staticClassLoader());
    Reflections reflections = new Reflections(
            new ConfigurationBuilder()
                    .setScanners(new SubTypesScanner(false),
                            new ResourcesScanner())
                    .setUrls(
                            ClasspathHelper.forClassLoader(classLoadersList)))
                    .filterInputsBy(
                            new FilterBuilder().include(FilterBuilder
                                    .prefix(packagebase))));
    Set<Class<? extends Object>> classes = reflections
            .getSubTypesOf(Object.class);
    Set<String> packageNameSet = new TreeSet<String>();
    for (Class classInstance : classes) {
        packageNameSet.add(classInstance.getPackage().getName());
    }
    return packageNameSet;}