JVM类加载器的urlclassloader和appclassloader

本文探讨了Java中自定义类加载器OneURLClassLoader的工作原理,重点分析了它如何加载类以及与默认类加载器之间的交互。通过实例演示了特定情况下类的加载过程及类型转换的限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package kite.jvm;

import java.net.URL;

/**
 * 首先为什么(1)可以,因为OneURLClassLoader在加载Constant的时候发现需要加载
 * OneInterface(因为他是其接口),因为OneURLClassLoader找不到OneInterface,所以最终委其父也就是appclassloader加载了OneInterface.
 * 而(2)不可以,因为外部的Constant instance2
 * 是appclassloader加载的,而内部的即C是OneURLClassLoader加载的,当然不能转换.
 * 
 * @author admin
 *
 */
public class Run {
	public static void main(String[] args) throws Exception {
		// class字节码所在的位置.
		String dir = "file:/E:\\datacloudWorkspace8\\JbossWebTest\\build\\classes\\";
		URL url = new URL(dir);
		OneURLClassLoader oucl = new OneURLClassLoader(new URL[] { url });
		// 用类加载器加载kite.jvm.Constant并返回它的class对象.
		Class c = oucl.findClass("kite.jvm.Constant");// 直接加载,不依靠父委托机制
		/**
		 * kite.jvm.OneURLClassLoader@6d06d69c:sun.misc.Launcher$AppClassLoader@73d16e93
		 * sun.misc.Launcher$AppClassLoader@73d16e93
		 * sun.misc.Launcher$AppClassLoader@73d16e93
		 */
		/*
		 * Class c = oucl.loadClass("kite.jvm.Constant"); // 结果:
		 * 依赖父委托机制sun.misc.Launcher$AppClassLoader@73d16e93:sun.misc.
		 * Launcher$ExtClassLoader@6d06d69c sun.misc.Launcher$AppClassLoader@73d16e93
		 * sun.misc.Launcher$AppClassLoader@73d16e93
		 */ System.out.println(c.getClassLoader() + ":" + c.getClassLoader().getParent());
		System.out.println(OneInterface.class.getClassLoader());
		System.out.println(Constant.class.getClassLoader());

		// 根据class对象c实例化一个对象,用它的接口类型(OneInterface)做类型转换.
		OneInterface instance1 = (OneInterface) c.newInstance();
		// 根据class对象c实例化一个对象,用它的实际类型(Constant)做类型转换.
		Constant instance2 = (Constant) c.newInstance();
		System.out.println(instance1);// (1)
		System.out.println(instance2);// (2)
	}
}

interface OneInterface {
	void say();
}

class Constant implements OneInterface {

	@Override
	public void say() {
		// TODO Auto-generated method stub
		System.out.println("aaaaaaaa");
	}
}
http://www.iteye.com/problems/77669
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值