谁动了他的jar包 (一)
哈,你想改变jar包某个类的运行方式?
或是因为业务需要,或是因为这个jar暂时不能满足你你欲望...
或者只是for Fun!
但是你无法改变这个jar包,可能因为是公用的,可能因为产品的生成依赖于标准仓库,或者仅仅是你不想用 "编译一下你的java类,然后把你的.class替换进去" 这么...这么..这么...的方法,那你要怎么做?
例如:
有类 Feature
public class Feature { private String content; public void show() { System.out.println(this.content); }}
public class Function { private Feature f; public void show() { this.f.show(); } }
public class Test { /** * @param args */ public static void main(String[] args) { Function function = new Function(); function.show(); }}
public class Feature { private String content; public Feature(){ this.content = "hello kitty"; } public void show() { System.out.println(this.content); }}
public class HoneyLoader extends URLClassLoader { public HoneyLoader(URL[] urls, ClassLoader parent){ super(urls, parent); } public synchronized Class<?> loadClass(String name) throws ClassNotFoundException { Class<?> c = findLoadedClass(name); if (c != null) { return c; }//先自己在指定位置(通过urls指定)找,找不到交给父类 try { c = this.findClass(name); } catch (Exception e) { c = super.loadClass(name); } return c; }}
public class Test { public static void main(String[] args) throws Exception { // 根据jar包名称,获取我们需要的jar包的名称的url String jarName = "feature2.jar"; URL url = null; ClassLoader loader = Thread.currentThread().getContextClassLoader(); Enumeration<URL> urls = loader.getResources("Feature.class"); int i = 0; while (urls.hasMoreElements()) { url = urls.nextElement(); i = url.getPath().indexOf(jarName); if (i > -1) { break; } } // 用honeyLoader启动我们的运行环境 ClassLoader myLoader = new HoneyLoader(new URL[] { new URL(url.getPath().substring(0, i) + jarName) }, loader); Object object = myLoader.loadClass("Feature").newInstance(); object.getClass().getMethod("show").invoke(object); }
hello kitty