.class文件的加载并且调用里面的方法
最近应经理要求,写一个动态加载的功能,根据不同公司的业务调用不同的算法
具体实现如下:1.上传.class(算法)文件
2.启用文件 加载文件
3.传值,调用文件中的方法,获取更加算法得到的返回值
4.将数据放入数据库
此功能需定时执行
第一步 第二步和第四步实现比较简单
如图所示
具体谈谈第三步,如何调用状态为启用的.class文件,并执行其方法获取返回值
1.首先自定义一个加载器MyClassLoader
public class MyClassLoader extends ClassLoader { //类加载器的名称 private String name; public MyClassLoader(String name) { this.name = name; } MyClassLoader(ClassLoader parent, String name) { super(parent); this.name = name; } /** * 重写findClass方法 */ @Override public Class<?> findClass(String name) { byte[] data = loadClassData(name); return this.defineClass(name, data, 0, data.length); } public byte[] loadClassData(String name) { try { String path=this.getClass().getResource("/").getPath();//得到e:/tomcat/webapps/工程名WEB-INF/classes/路径 name = name.replace(".", "//"); FileInputStream is = new FileInputStream(new File(path + name + ".class")); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int b = 0; while ((b = is.read()) != -1) { baos.write(b); } return baos.toByteArray(); } catch (Exception e) { e.printStackTrace(); } return null; } }
2.加载.class文件并执行方法
//新建一个类加载器 MyClassLoader cl = new MyClassLoader("myClassLoader"); //加载类,得到Class对象 Class<?> c=cl.loadClass("com.creatsoft.corrosion.water.service.DynamicAlgorithmTest"); Class[] c2 = new Class[3]; c2[0] = Double.class; c2[1] = Double.class; c2[2] = Double.class; Method m = c.getMethod("calculate",c2); Object[] params = new Object[3]; params[0] = new Double(3d); params[1] = new Double(4d); params[2] = new Double(5d); Double aa = (Double)m.invoke(c.newInstance(),params); System.out.println("返回值======"+aa);
最后看一下我的.class文件的内容
package com.creatsoft.corrosion.water.service; import java.io.PrintStream; public class DynamicAlgorithmTest { public Double calculate(Double voltage, Double instrumentvalue, Double samplevalue) { System.out.println("voltage=====" + voltage); System.out.println("instrumentvalue=====" + instrumentvalue); System.out.println("samplevalue=====" + samplevalue); System.out.println("有参数============================有参数"); return Double.valueOf(5.0D); } }
其中要注意的是 package com.creatsoft.corrosion.water.service;文件存放的位置不要弄错了
很简单,当然在定时执行的时候,还需要深一步的考虑,比如启动另一个算法的时候,你得去确保该方法以及执行完成,
如果未完成,需等待完成后再调用另外一个算法。。。。。。。
题外话:个人觉得算法应该不会经常变,如果经常变,那原来的数据怎么办,如果需改算法重新发布一下就好了,
经理也没说清楚为什么加这个功能,如遇大神,请提点一二,解开小弟心中谜团、、、、、、、
浙公网安备 33010602011771号