java -- JVM笔记

需要加载的测试类:

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));
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值