从其他位置加载类
public static void main(String[] args) throws MalformedURLException, ClassNotFoundException, IllegalAccessException, InstantiationException {URL url = new URL("file:///D:\\work\\audit\\ccchains\\Clas\\");ClassLoader cls = new URLClassLoader(new URL[]{url});Class c = cls.loadClass("org.exps.Calc");c.newInstance();}
报错了
要去掉包名
成功运行了
如果有包名要有对应目录
http
package org.Tutor;import .MalformedURLException;import .URL;import .URLClassLoader;public class ClsHttp {public static void main(String[] args) throws MalformedURLException, ClassNotFoundException, IllegalAccessException, InstantiationException {URL url = new URL("http://localhost:8088/");ClassLoader cls = new URLClassLoader(new URL[]{url});Class c = cls.loadClass("Calcd");c.newInstance();}}
jar
URL url = new URL("jar:http://localhost:8088/H.jar!/");ClassLoader cls = new URLClassLoader(new URL[]{url});Class c = cls.loadClass("Calcd");c.newInstance();
URLclassloader 支持 file/http/jar…
从byte code加载
ClassLoader cls = ClassLoader.getSystemClassLoader();Method md = ClassLoader.class.getDeclaredMethod("defineClass", String.class,byte[].class, int.class, int.class);md.setAccessible(true);byte[] code = Files.readAllBytes(Paths.get("D:\\work\\audit\\ccchains\\Clas\\Calcdc.class"));Class c = (Class) md.invoke(cls,"Calcdc",code,0,code.length);c.newInstance();
unsafe使用
ClassLoader cls = ClassLoader.getSystemClassLoader();Class c = Unsafe.class;Field field = c.getDeclaredField("theUnsafe");field.setAccessible(true);Unsafe unsafe = (Unsafe) field.get(null);byte[] code = Files.readAllBytes(Paths.get("D:\\work\\audit\\ccchains\\Clas\\Calcdc.class"));Class c2 = unsafe.defineClass("Calcdc",code,0,code.length,cls,null);c2.newInstance();
spring里面可以直接用