自定义ClassLoader
定义外部类
这里定义啦一个普通的类,里面一个累加的方法
javac com.du.lo.myclassloader.TestClassLoader.java 编译出class文件,复制出来放到 e:\\目录下
这里就可以吧当前文件给删除啦,保证加载到的是 外部文件
package com.du.lo.myclassloader
public class TestClassLoader {
public int sum(int a, int b) {
return a + b;
}
}
自定义 ClassLoader
其中 file 里面存放的是 文件目录
super.defineClass("com.du.lo.myclassloader."+name, bs, 0, bs.length); 这里定义的第一个参数为 包名 + 类名,否则会报错 wrong name: com/du/lo/myclassloader/TestClassLoader
public class MyClassLoader extends ClassLoader {
@Override
protected Class> findClass(String name) throws ClassNotFoundException {
File file = new File("e:/"+name.replaceAll("\\.", "/")+".class");
try {
FileInputStream inputStream = new FileInputStream(file);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b ;
while ((b = inputStream.read()) != -1){
baos.write(b);
}
baos.close();
inputStream.close();
byte [] bs = baos.toByteArray();
return super.defineClass("com.du.lo.myclassloader."+name, bs, 0, bs.length);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
ClassLoader classLoader = new MyClassLoader();
Class> c = classLoader.loadClass("TestClassLoader");
System.out.println(c.newInstance());
System.out.println(c.getClassLoader());
System.out.println(TestClassLoader11.class.getClassLoader());
System.out.println(MyClassLoader.class.getClassLoader());
Object obj = c.newInstance();
Method m = c.getMethod("sum", int.class, int.class);
System.out.println(m.invoke(obj, 1, 1));;
}
// com.du.lo.myclassloader.TestClassLoader@1d44bcfa
// com.du.lo.myclassloader.MyClassLoader@60e53b93
// sun.misc.Launcher$AppClassLoader@18b4aac2
// sun.misc.Launcher$AppClassLoader@18b4aac2
// 2
}
面向接口的方式加载外部文件
把下面的文件编译成 class 文件,复制出来放到 e:\\目录下
这里就可以吧实现文件 TestClassLoader 给删除啦,保证加载到的是 外部文件
package com.du.lo.myclassloader;
public interface TestClassLoaderI {
int sum(int a, int b);
}
package com.du.lo.myclassloader;
public class TestClassLoader implements TestClassLoaderI{
public int sum(int a, int b) {
return a + b;
}
}
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
ClassLoader classLoader = new MyClassLoader();
Class> c = classLoader.loadClass("TestClassLoader");
TestClassLoaderI tcl = (TestClassLoaderI) c.newInstance();
System.out.println(tcl.sum(1,1));
}