java 类加载器学习

[quote]1.自定义类加载器[/quote]

public interface InterfaceTest {
public void test();
}



public class IntefaceImpl implements InterfaceTest {
@Override
public void test() {
// TODO Auto-generated method stub
System.out.println("------------");
}
}



public class MyClassLoader extends ClassLoader{

private String path = "/home/kevin/";
/**
* 加载本地class
*/
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
String namePath = name.replace(".", "/");
String classPath = path + namePath + ".class";
InputStream is = null;
ByteArrayOutputStream os = null;
try {
is = new FileInputStream(new File(classPath));
os = new ByteArrayOutputStream();
int b = 0;
while ((b = is.read()) != -1) {
os.write(b);
}
byte[] bytes = os.toByteArray();
os.flush();
return defineClass(name, bytes, 0, bytes.length);
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(os!=null)
os.close();
if(is!=null)
is.close();
} catch (IOException e1) {
os=null;
is = null;
}
}
return null;
}
/**
* 此种方式加载的两个jar中的类无法相互访问,因为new URLClassLoader出来的类加载器是兄弟关系
* 调用URLClassloader的protected方法addURL即可实现在需要时加载jar到loader中。
* @throws Exception
*/
public void test()throws Exception{
//加载jar包
File file = new File("/home/kevin/workspace/eclipsespace/JavaTest/bin/com/a.jar");
URL uri = file.toURI().toURL();
System.out.println(uri);

//或者加载网络jar包
uri = new URL("http://xxx.xxx.com/resources/ebook/a.zip");

URLClassLoader load = new URLClassLoader(new URL[]{uri});
System.out.println(load.loadClass("IntefaceImpl"));

((InterfaceTest)(load.loadClass("IntefaceImpl").newInstance())).test();
}
public static void main(String[] args) {
MyClassLoader myLoader = new MyClassLoader();
try {
Class myClass = myLoader.loadClass("IntefaceImpl");
Object obj = myClass.newInstance();
((InterfaceTest)obj).test();
// Method method = myClass.getMethod("say", null);
// method.invoke(obj, null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值