利用java类加载以及反射-动态加载jar包实现热部署
业务背景:
1.a.jar中的test方法依赖两个其他的jar包分别为b.jar和c.jar,类路径com.Product
2.a.jar中的test方法调用b.jar的test方法,使a产品加工成b产品,再调用c.jar中的test方法使b产品加工成c产品。由于线上环境活动频繁变动,所以使用类加载以及反射实现更新应用而不重启应用的热部署。
代码实现如下:
`
/**
-
This is the entrance of the test program. please do not modify the modifiers
-
of this class and methods. Please do not modify the input and output
-
parameters.
-
@author tom
*/
public class Test {public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, MalformedURLException, ClassNotFoundException {
new Test().test(new File(“b.jar”),new File(“b.jar”),“helloWorld!”);
}
/**-
By calling this function. Call the functions in the three jar packages and
-
return data.
-
@param jarFileB
-
@param jarFileC
-
@param text original string
-
@return final decrypted string
*/
public String test( File jarFileB, File jarFileC, String text) throws MalformedURLException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
URL urlB = new URL(“file:”+jarFileB.getPath());
URLClassLoader classLoaderA = new URLClassLoader(new URL[]{urlB}, Thread.currentThread()
.getContextClassLoader());
Class<?> product = classLoaderA.loadClass(“com.Product”);
//获取实例
Object obj = product.newInstance();
//获取方法
Method method=product.getDeclaredMethod(“test”,String.class);
//执行方法
Object result1 = method.invoke(obj, text);Object result2 = execute(jarFileC, result1.toString());
execute(new File(“a.jar”),result2.toString());// TODO According to the requirements , write the implementation code.
return null;
}
private Object execute(File file,String text) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException, InstantiationException, ClassNotFoundException, MalformedURLException {
URL url1 = new URL(“file:”+file.getPath());
URLClassLoader classLoaderA = new URLClassLoader(new URL[]{url1}, Thread.currentThread()
.getContextClassLoader());
Class<?> product = classLoaderA.loadClass(“com.Product”);
//获取实例
Object obj = product.newInstance();
//获取方法
Method method=product.getDeclaredMethod(“test”,String.class);
//执行方法
Object result = method.invoke(obj, text);
return result;
} -
}`)