动态加载class文件

1.参考老外:

public class ClassPathUpdater {

/** Used to find the method signature. */

private static final Class[] PARAMETERS = new Class[] { URL.class };


/** Class containing the private addURL method. */

private static final Class CLASS_LOADER = URLClassLoader.class;


/**

* Adds a new path to the classloader. If the given string points to a file,

* then that file's parent file (i.e., directory) is used as the directory

* to add to the classpath. If the given string represents a directory, then

* the directory is directly added to the classpath.

*

* @param s

* The directory to add to the classpath (or a file, which will

* relegate to its directory).

*/

public static void add(String s) throws IOException, NoSuchMethodException,

IllegalAcces***ception, InvocationTargetException {

add(new File(s));

}


/**

* Adds a new path to the classloader. If the given file object is a file,

* then its parent file (i.e., directory) is used as the directory to add to

* the classpath. If the given string represents a directory, then the

* directory it represents is added.

*

* @param f

* The directory (or enclosing directory if a file) to add to the

* classpath.

*/

public static void add(File f) throws IOException, NoSuchMethodException,

IllegalAcces***ception, InvocationTargetException {

f = f.isDirectory() ? f : f.getParentFile();

add(f.toURI().toURL());

}


/**

* Adds a new path to the classloader. The class must point to a directory,

* not a file.

*

* @param url

* The path to include when searching the classpath.

*/

public static void add(URL url) throws IOException, NoSuchMethodException,

IllegalAcces***ception, InvocationTargetException {

Method method = CLASS_LOADER.getDeclaredMethod("addURL", PARAMETERS);

method.setAccessible(true);

method.invoke(getClassLoader(), new Object[] { url });

}


private static URLClassLoader getClassLoader() {

return (URLClassLoader) ClassLoader.getSystemClassLoader();

}

}


ClassPathUpdater.add("E:\\workspaces\\MyDemos\\MyClass.class");
String path = "E:\\workspaces\\MyDemos\\";
URL url = new URL("file", null, path);
URLClassLoader loader = new URLClassLoader(new URL[] {url});
Class clazz = loader.loadClass("MyClass");
2.rewrite ClassLoader

static class MyClassLoader extends ClassLoader {

@Override

public Class<?> findClass(String name) {

try {

FileInputStream in = new FileInputStream(name);

ArrayList<Byte> l = new ArrayList<Byte>();

int c;

while ((c = in.read()) != -1) {

l.add(new Byte((byte)c));

}

byte[] b = new byte[l.size()];

for (int i = 0; i < l.size(); i++) {

b[i] = l.get(i).byteValue();

}



return defineClass(b, 0, b.length);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return null;

}

}


MyClassLoader mcl = new MyClassLoader();
clazz = mcl.loadClass("E:\\workspaces\\MyDemos\\MyClass.class");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值