黑马程序员技术交流社区
标题:
类加载器相关问题,求大神赐教
[打印本页]
作者:
兜兜转转
时间:
2013-9-10 21:35
标题:
类加载器相关问题,求大神赐教
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class MyClassLoader2 extends ClassLoader
{
private String name ;
private String path= "d:\\";
public MyClassLoader2(String name)
{
super();
this.name = name;
}
public MyClassLoader2(ClassLoader parent , String name)
{
super(parent);
this.name = name;
}
public String getName()
{
return name;
}
public String getPath()
{
return path;
}
public void setPath(String path)
{
this.path = path;
}
public String toString()
{
return this.name;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException
{
byte[] date = this.loadClassDate(name);
return this.defineClass(name , date , 0 ,date.length);
}
public byte[] loadClassDate(String name)
{
InputStream is = null;
ByteArrayOutputStream baos = null;
byte[] date = null;
try
{
baos = new ByteArrayOutputStream();
is = new FileInputStream(new File(this.path + name+ ".class"));
int b = 0;
while( (b = is.read()) != -1)
{
baos.write(b);
}
date = baos.toByteArray();
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
is.close();
baos.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
return date;
}
}
复制代码
以上代码我只知道写,但是不知道具体的执行流程和细节?loadClass()这个方法到底是执行那些代码?
作者:
Yuan先生
时间:
2013-9-10 21:51
为沙发而来。
作者:
code_geass
时间:
2013-9-11 19:28
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// First, check if the class has already been loaded
Class c = findLoadedClass(name);
if (c == null) {
long t0 = System.nanoTime();
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// ClassNotFoundException thrown if class not found
// from the non-null parent class loader
}
if (c == null) {
// If still not found, then invoke findClass in order
// to find the class.
long t1 = System.nanoTime();
c = findClass(name);
// this is the defining class loader; record the stats
sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
sun.misc.PerfCounter.getFindClasses().increment();
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
复制代码
这是loadClass的源码。首先用findLoadClass查找是否加载过这个字节码。如果有就直接返回。如果没有先利用委托加载器查找。没有委托加载器。调用findBootstrapClassOrNull(name)查找。这方法就是委托给BootStrap进行查找。这个调用是调用本地方法。具体的代码为我也没查。希望后面大神补充
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2