类层次结构中的引用关系必须在同一ClassLoader下

编写接口
/*
 * Copyright (c) 2008 Skyon Technology Ltd.
 * All rights reserved.
 *
 * project: ims
 * create: 2013-6-7
 * cvs: $Id: $
 */
package com.skyon.cl.test;

/**
 * TODO (2013-6-7 上午10:27:23) 请添加 A 类的注释。
 * @author dylan0514 
 * @version $Revision: 1.1 $
 */
public interface A {

}

实现类
/*
 * Copyright (c) 2008 Skyon Technology Ltd.
 * All rights reserved.
 *
 * project: ims
 * create: 2013-6-7
 * cvs: $Id: $
 */
package com.skyon.cl.test;

/**
 * TODO (2013-6-7 上午10:28:26) 请添加 AImpl 类的注释。
 * @author dylan0514 
 * @version $Revision: 1.1 $
 */
public class AImpl implements A {

}

将AImpl打成JAR包,放置于c:/下
测试类
/*
 * Copyright (c) 2008 Skyon Technology Ltd.
 * All rights reserved.
 *
 * project: ims
 * create: 2013-6-7
 * cvs: $Id: $
 */
package com.skyon.cl.test;

import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

/**
 * TODO (2013-6-7 上午10:27:06) 请添加 ClassloaderTest 类的注释。
 * @author dylan0514 
 * @version $Revision: 1.1 $
 */
public class ClassloaderTest {

	/**
	 * @param args
	 * @throws MalformedURLException 
	 * @throws ClassNotFoundException 
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	public static void main(String[] args) throws MalformedURLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
		// TODO (2013-6-7 上午10:27:06) 自动生成方法存根
		
		URLClassLoader url = new URLClassLoader(new URL[]{new URL("file:///c:/test.jar")},null);
	    Class azz = (Class) url.loadClass("com.skyon.cl.test.AImpl");
	    System.out.println(A.class.isAssignableFrom(AImpl.class));
	    System.out.println(A.class.isAssignableFrom(azz));
	    System.out.println(azz == AImpl.class);
	    A a = (A) azz.newInstance();
	    System.out.println("azz:"+azz.getClassLoader()+" A:" + A.class.getClassLoader() +" AImpl:"+AImpl.class.getClassLoader());
	}

}

运行结果:
true
false
false
Exception in thread "main" java.lang.ClassCastException: com.skyon.cl.test.AImpl cannot be cast to com.skyon.cl.test.A
at com.skyon.cl.test.ClassloaderTest.main(ClassloaderTest.java:37)

结果可证明接口引用与实现类处于不同ClassLoader不能兼容

猜你喜欢

转载自tmmh.iteye.com/blog/1883621