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的所有类.我没有执行它 – 所以你可能必须解决代码的一些问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |