java – 如何从文件夹加载所有编译的类?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 如何从文件夹加载所有编译的类?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2485字,纯文字阅读大概需要4分钟。
内容图文
![java – 如何从文件夹加载所有编译的类?](/upload/InfoBanner/zyjiaocheng/766/e4054a5caf6346a6b987a52b0e5aec72.jpg)
我有一个文件夹操作符.在这个文件夹中我有编译文件(一个接口操作符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("Minus"),operatorsLoader.loadClass("Multiply") , 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的所有类.我没有执行它 – 所以你可能必须解决代码的一些问题.
内容总结
以上是互联网集市为您收集整理的java – 如何从文件夹加载所有编译的类?全部内容,希望文章能够帮你解决java – 如何从文件夹加载所有编译的类?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。