动态加载Class文件到代码中执行
我们在给公司写业务代码时,可能调试代码需要反复的重启服务,而且每次重启都需要半个小时,跟踪代码很麻烦,与其如此,不如将写好的代码编译成class文件,放到数据库里,动态加载进来执行,只要把写好的代码编译一下,替换一下就行了。
public static void main( String[] args )
{
//CheckSheetPushARAPServiceForRPCImpl checkSheetPushARAPServiceForRPC = new CheckSheetPushARAPServiceForRPCImpl();
Map<String,Object> params = new HashMap<String,Object>();
params.put("DJBH","SALARY2022081500001");
params.put("FORMTYPE","FSROSALARY");
params.put("summary","摘要");
Map<String,Object> objMap = new HashMap<String,Object>();
objMap.put("contextParam",params);
try{
//类加载
byte[] clazzByte = loadClass();
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
Method method = Class.forName("java.lang.ClassLoader").getDeclaredMethod("defineClass", byte[].class, int.class, int.class);
method.setAccessible(true);
Class clazz = (Class) method.invoke(classLoader, clazzByte, 0, clazzByte.length);
//类链接
method = Class.forName("java.lang.ClassLoader")
.getDeclaredMethod("resolveClass", Class.class);
method.setAccessible(true);
method.invoke(classLoader,clazz);
Class[] cArg = new Class[1];
cArg[0] = Map.class;
Method testM = clazz.getDeclaredMethod("checkSheetPushARAP",cArg);
testM.setAccessible(true);
ResultRet ss =(ResultRet) testM.invoke(clazz.newInstance(),objMap);
System.out.println(ss);
}catch(Exception e) {
e.printStackTrace();
}
}
public static byte[] loadClass() throws Exception {
String path = "D:\\TestService.class";
FileInputStream in = new FileInputStream(path);
long fileSize = new File(path).length();
byte[] clazzSize = new byte[(int) fileSize];
in.read(clazzSize);
return clazzSize;
}