java外部库class,java 自定义classloader 加载外部文件

自定义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));

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值