动态加载jar
-
新建一个抽象类AbstractAction,代码如下:
package com.java.main.service; public abstract class AbstractAction { public abstract String action(); }
-
新建一个类TestAction继承抽象类AbstractAction,代码如下:
package com.java.main.impl; import com.java.main.service.AbstractAction; public class TestAction extends AbstractAction{ @Override public String action() { System.out.println("My first blog"); return "result is success"; } }
-
把对应类的package导出为main.jar,并删除main包
-
核心代码,动态加载jar包,并调用jar中的方法
package com.java.test; import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.MethodDescriptor; import java.net.URL; import java.net.URLClassLoader; public class TestMain { @SuppressWarnings("resource") public static void main(String[] args) { try { URL url = new URL("file:E:/loader/main.jar"); URLClassLoader myClassLoader = new URLClassLoader(new URL[] { url }, Thread.currentThread() .getContextClassLoader()); Class<?> myClass = myClassLoader.loadClass("com.java.main.impl.TestAction"); Object obj = myClass.newInstance(); BeanInfo beanInfo = Introspector.getBeanInfo(myClass); MethodDescriptor[] methods = beanInfo.getMethodDescriptors(); for (MethodDescriptor method : methods) { if("action".equals(method.getName())){ System.out.println(method.getMethod().invoke(obj)); } } } catch (Exception e) { e.printStackTrace(); } } }
-
运行,输出结果如下
My first blog result is success