需要加载的测试类:
package JVM;
public class TestClass {
// private static TestClass tc=new TestClass();
public static int i = 23;
public static int j = 1;
// 次序不同也会影响初始化的结果,类加载时初始化是自上而下初始化的,所以初始化后i,j的值不同
private static TestClass tc=new TestClass();
//若再初始化一次,i,j都会再次+1
private static TestClass tc2=new TestClass();
public TestClass(){
i++;
j++;
}
public static TestClass getInstance(){
return tc;
}
@Override
public String toString() {
return "i="+i+";j="+j;
}
}
自己编写的类加载器:
package JVM;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
public class ClassLoaderTest extends ClassLoader{
public ClassLoaderTest(ClassLoader cl) {
super(cl);
}
public ClassLoaderTest() {
super();
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
byte[] b = loadClassData(name);
String nameClasss[]=name.split("[/\\.]");
// bin目录下面的相对路径
String nameClass="JVM."+nameClasss[nameClasss.length-2];
return defineClass(nameClass, b, 0, b.length);
}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
return super.loadClass(name);
}
private byte[] loadClassData(String name) {
byte[] b=null;
try {
InputStream in=new FileInputStream(name);
ByteArrayOutputStream bos=new ByteArrayOutputStream();
byte[] bs=new byte[1024];
int len;
while((len=in.read(bs))!=-1)
{
bos.write(bs, 0, len);
}
b=bos.toByteArray();
in.close();
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
return b;
}
}
外部加载TestClass.class文件:
package JVM;
public class MyMain {
/**
* @param args
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static void main(String[] args) throws Exception {
/**
* 初始化TestClass对象 结果为 i=24;j=2
*/
// TestClass tc=TestClass.getInstance();
// System.out.println(tc);
/**
* 用系统加载器加载TestClass 结果为 i=25;j=3
* 第一个初始化 TestClass tc=new TestClass()
* 第二次 通过类加载器初始化 TestClass
*/
ClassLoaderTest clt=new ClassLoaderTest(ClassLoader.getSystemClassLoader());
// ClassLoaderTest clt=new ClassLoaderTest(null);
// ClassLoaderTest clt=new ClassLoaderTest(ClassLoader.getSystemClassLoader());
// Class clazz=clt.loadClass("JVM.TestClass");
//获取当前java的路径
System.out.println(MyMain.class.getResource("").toString().substring(6));
Class clazz=clt.loadClass(MyMain.class.getResource("").toString().substring(6)+"TestClass.class");
ClassLoader cl=clt;
System.out.println("TestClass的加载器为"+clt);
System.out.println("当前加载器为"+ClassLoader.getSystemClassLoader());
while(cl!=null)
{
System.out.println(cl);
cl=cl.getParent();
}
/** 加载器不同,不能强制转换 **/
// TestClass tc=(TestClass) clazz.newInstance();
// System.out.println(tc.i);
/** 通过反射获取class中的值 **/
Object obj= clazz.newInstance();
System.out.println(clazz.getField("i").getInt(obj));
System.out.println(clazz.getField("j").getLong(obj));
}
}