编写接口
/*
* 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不能兼容。
分享到:
相关推荐
1. 类加载器的层次结构:在Java中,类加载器形成了一个树形结构,通常由Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和App ClassLoader(应用程序类加载器)组成。Bootstrap加载...
1. **启动类加载器(Bootstrap ClassLoader)**:负责加载存放在`<JAVA_HOME>\lib`目录中的,或者被`-Xbootclasspath`参数所指定的路径中的,并且能够被虚拟机识别的类库。 2. **扩展类加载器(Extension ...
1. Java引用和对象:题目中,var1和var2都引用了Integer对象1,但在doSomething方法中,var2的引用被改变指向了新的Integer对象2,但var1未变。因此,最后输出为1true,对应选项A。 2. 内部类:内部类的声明应该...
子类/派生类,是指在一个继承关系中继承其他类的类。子类继承了父类的特征,并可以扩展或重写父类的行为。 #### override 重写,是指子类中重新定义父类的方法,以实现不同的功能或行为。重写方法需要与父类的方法...
- 组合是一种结构化设计模式,它允许将对象组合在一起形成树形结构来表示整体/部分层次结构。 - 组合使客户端能够一致地使用单个对象和组合对象。 26. **聚合与组合的不同之处:** - **组合:** 表示“整体拥有...
- **类加载器的层次结构:** Java 中存在多种类加载器,如`Bootstrap ClassLoader`、`Extension ClassLoader`和`Application ClassLoader`,它们形成了一个层次结构,用于加载不同类型的类。 #### 7. 堆内存与栈...
2. 异常类层次结构: Java的异常都是从`java.lang.Throwable`类派生的,分为两种主要类型:`Error`和`Exception`。`Error`通常表示系统级的错误,如虚拟机错误,一般程序员无法恢复。`Exception`则代表程序运行时的...
- 可以在一个`.java`文件中定义多个类,但是只能有一个公共类,并且该文件名必须与公共类的名字完全一致。 - 非公共类的数量则不受限制。 **3. Java有没有goto?** - Java中没有传统意义上的`goto`语句,但在某些...
- Java的ClassLoader有层次结构,用于加载类。 - `Class.forName()`可以动态加载类,不同ClassLoader加载同一类会产生不同的类对象。 14. **构造方法**: - 构造方法的名字必须与类名相同,无返回类型声明,可以...
- 类加载器:Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader负责加载不同层次的类。 8. **设计模式** - 创建型模式:单例、工厂、抽象工厂、建造者、原型。 - 结构型模式:适配器、装饰器、...
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,...
- **导航操作**:如Ctrl + K 快速定位到某一行,Ctrl + T 查看类层次结构。 - **编辑操作**:例如Ctrl + C 复制选中的代码段,Ctrl + V 粘贴代码等。 #### JUnit 测试框架 **3.1 JUnit 简介** JUnit 是一个用于...
- **异常类层次结构:** `Throwable` 是所有异常类的父类,包括 `Error` 和 `Exception`。 - **自定义异常:** 如何定义自己的异常类。 #### 4. Java中的访问修饰符(public, private, protected, 默认) **知识点...