加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何从文件夹加载所有编译的类?

发布时间:2020-12-15 02:09:08 所属栏目:Java 来源:网络整理
导读:我有一个文件夹操作符.在这个文件夹中我有编译文件(一个接口操作符AND 4类实现操作符).目的是从该文件夹加载所有.class文件并在主程序中使用.我用这个语句: File operatorFile = new File("D:operators"); URL operatorFilePath = operatorFile.toURL();
我有一个文件夹操作符.在这个文件夹中我有编译文件(一个接口操作符AND 4类实现操作符).目的是从该文件夹加载所有.class文件并在主程序中使用.我用这个语句:

File operatorFile = new File("D:operators");
    URL operatorFilePath = operatorFile.toURL();          
    URL[] operatorFilePaths = new URL[]{operatorFilePath};
    ClassLoader operatorsLoader = new URLClassLoader(operatorFilePaths);

 //Plus,Minus,Multiply,Divide are classes that implement operator interface
   Class[] operatorClass = new Class[]{ operatorsLoader.loadClass("Plus"),operatorsLoader.loadClass("Minus"),operatorsLoader.loadClass("Multiply"),operatorsLoader.loadClass("Divide") };

然后我使用这个语句来调用.class文件方法:

Method methodsInOperator;
Object instance;
String operatorSign;

for(Class operatorCls : operatorClass)
{
   instance = operatorCls.newInstance();
    methodsInOperator = operatorCls.getMethod("getSign",null); 
    operatorSign = (String)methodsInOperator.invoke(instance,null);
                    if(operatorSign.equals(elementInExpression[2]))
                    {
    methodsInOperator = operatorCls.getMethod("calculate",new Class[] { double.class,double.class } ); 
                        output =(double)methodsInOperator.invoke(instance,firstNumber,secondNumber);  
                    }
                }

但是下面的语句不能动态地工作,如果我们把另一个.class文件放到operator文件夹程序停止工作.

Class[] operatorClass = new Class[]{ operatorsLoader.loadClass("Plus"),operatorsLoader.loadClass("Divide") };

我的目的是动态加载所有类并检查它们是否实现运算符,并根据getSing()方法选择最佳类.任何人都可以帮助我吗?

解决方法

这有两个部分:

>首先列出给定文件夹中的文件.
>然后加载类,如果它是给定的接口/类型.

我写了一个小方法来做到这一点 – 你可以根据自己的逻辑.

public Class[] getOperators(File operatorFile) throws MalformedURLException,ClassNotFoundException {
    ClassLoader operatorsLoader = new URLClassLoader(new URL[] { operatorFile.toURI().toURL() });

    File[] files = operatorFile.listFiles(new FilenameFilter() {
        @Override public boolean accept(File dir,String name) {
            return name.endsWith(".class");
        }
    });
    ArrayList<Class> operators = new ArrayList<>();
    for (File file : files) {
        String className = file.getName().substring(0,file.getName().length() - 6);
        Class<?> clazz = operatorsLoader.loadClass(className);
        if(OperatorInterface.class.isAssignableFrom(clazz)) {
            operators.add(clazz);
        }
    }
    return operators.toArray(new Class[operators.size()]);
}

如果一切顺利,使用该文件夹调用此方法应返回该文件夹中实现OpeartorInterface的所有类.我没有执行它 – 所以你可能必须解决代码的一些问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读