有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java扫描动态加载类中的组件

我正在寻找扫描注册所有组件,在运行时使用URLClassLoader加载jar文件后,jar文件只包含用@Component等注释的类。。。 我试过了

GenericBeanDefinition bd = new GenericBeanDefinition();
        bd.setBeanClass(MyClass.class);
beanFactory.registerSingleton("myBean", bd);

ConfigurableListableBeanFactory beanFactory = ((ConfigurableApplicationContext) ctx).getBeanFactory();
    beanFactory.createBean(MyClass.class);

但是没有成功,有没有办法实现呢


共 (1) 个答案

  1. # 1 楼答案

    经过搜索和尝试,这个方法奏效了

    public Class<?> loadAllJarClasses(String pathToJar, String mainClassName) {
    
            Class<?> clazz = null;
            Class c;
    
            try {
    
                JarFile jarFile = new JarFile(pathToJar);
                Enumeration<JarEntry> e = jarFile.entries();
    
                URL[] urls = { new URL("jar:file:" + pathToJar + "!/") };
                URLClassLoader cl = URLClassLoader.newInstance(urls);
    
                while (e.hasMoreElements()) {
                    JarEntry je = e.nextElement();
                    if (je.isDirectory() || !je.getName().endsWith(".class")) {
                        continue;
                    }
                    // -6 because of .class
                    String className = je.getName().substring(0, je.getName().length() - 6);
                    className = className.replace('/', '.');
                    logger.info("loading " + className);
                    c = cl.loadClass(className);
                    resgisterBean(c);
                    logger.info("loaded " + className);
                    if (className.equalsIgnoreCase(mainClassName))
                        clazz = c;
    
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return clazz;
        }
    
        public void resgisterBean(Class<?> clazz) {
    
             beanFactory = (BeanDefinitionRegistry) ((ConfigurableApplicationContext) ctx)
                    .getBeanFactory();
    
            beanFactory.registerBeanDefinition(clazz.getName(),
                    BeanDefinitionBuilder.genericBeanDefinition(clazz).getBeanDefinition());
        }