为什么要双亲委派?答案:安全。
public static void main(String[] args) throws ClassNotFoundException {
//加载指定路径下的类
Class clazz = Demo.class.getClassLoader().loadClass("");
//加载资源
InputStream is = Demo.class.getClassLoader().getResourceAsStream("");
}
双亲委派下,加载自己的类(重写findClass)。若不想要双亲委派机制(如热加载),则重写loadClass方法
package com.chinaoly.frm;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Demo {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException,
InstantiationException, InvocationTargetException {
Class clazz = new MyClassLoader().loadClass("pack.Hello");
Object obj = clazz.newInstance();
Method[] methods =clazz.getDeclaredMethods();
for (Method m : methods){
m.invoke(obj);
}
}
}
class MyClassLoader extends ClassLoader{
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
String path = "D:/"+name.replace(".","/")+".class";
File file = new File(path);
try {
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b = 0;
while ((b = fis.read()) != 0){
baos.write(b);
}
byte[] bytes = baos.toByteArray();
baos.close();
fis.close();
return defineClass(name,bytes,0,bytes.length);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return super.findClass(name);
}
}