java JVM-自定义类加载器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java JVM-自定义类加载器相关的知识,希望对你有一定的参考价值。
自定义文件系统类加载器public class Loader extends ClassLoader
private String rootDir;
public Loader(String rootDir)
this.rootDir=rootDir;
//重写父类方法
protected Class<?> findClass(String name) throws ClassNotFoundException
Class<?> c=findLoadedClass(name); //查找已经被加载的类,返回Class类的实例
//不为空则返回已经加载过的类
if(null!=c)
return c;
else //如果没有类,让父类去加载
ClassLoader parent =this.getParent();
try
c=parent.loadClass(name); //委派父类加载
catch(Exception e)
e.printStackTrace();
if(c!=null)
return c;
else //如果还没获取,则读取d:/myjava/cn/sxt/in/User.class下的文件,转换成字节数组
byte[] classData=getClassData(name);
if(classData==null)
throw new ClassNotFoundException(); //如果没加载到,手动抛出异常
else
c=defineClass(name,classData,0,classData.length);
return c;
private byte[] getClassData(String classname)
String path=rootDir+"/"+classname.replace(‘.‘, ‘/‘)+".class";
ByteArrayOutputStream bos=null;
InputStream is=null;
try
is=new FileInputStream(path);
bos=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int len=-1;
while((len=is.read(buffer))!=-1)
bos.write(buffer,0,len);
bos.flush();
return bos.toByteArray();
catch(Exception e)
e.printStackTrace();
finally
try if(null!=is)
is.close();
catch(IOException e)
e.printStackTrace();
try
if(null!=bos)
bos.close();
catch(IOException e)
e.printStackTrace();
return null;
加载:
public class Tt
public static void main(String[] args) throws Exception
Loader loader=new Loader("d:myjva");
Loader loader2=new Loader("d:myjva");
Class<?> c=loader.loadClass("cn.sxt.in.HelloWorld");
Class<?> c2=loader.loadClass("cn.sxt.in.HelloWorld");
Class<?> c3=loader2.loadClass("cn.sxt.in.HelloWorld");
Class<?> c4=loader2.loadClass("java.lang.String");
Class<?> c5=loader2.loadClass("cn.sxt.in.helloworld"); //调用项目下的文件
//加载器不一样加载相同类会被JVM认为是不同类
System.out.println(c.hashCode());
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());
System.out.println(c4.hashCode());
System.out.println(c3.getClassLoader()); //返回自定义的加载器
System.out.println(c4.getClassLoader()); //用的引导类加载器,返回null
System.out.println(c5.getClassLoader()); //返回的是应用类加载器
以上是关于java JVM-自定义类加载器的主要内容,如果未能解决你的问题,请参考以下文章