类 java.lang.ClassLoader

类 java.lang.ClassLoader

java.lang.Object
   |
   +----java.lang.ClassLoader

public abstract class ClassLoader extends Object

ClassLoader 是一个抽象类。为了扩充 Java 虚拟机动态装载类的方法,应用程序可实现 ClassLoader 的继承类。

通常,Java 虚拟机以与平台有关的方式,从局部文件系统中装载类。例如,在 UNIX 系统,虚拟机从 CLASSPATH 环境变量中定义的路径中装载类。

但是,某些类可能不是来自文件,而是来自其它资源,诸如网络,或者它们可能是由应用程序创建的。 defineClass 方法将一字节数组转换为 Class 类的实例。采用 Class 类中的 newInstance 方法创建新定义的类的实例。

类装载器创建的方法和构造子可以引用其它类。为确定引用类,Java 虚拟机调用初始创建该类的类装载器的 loadClass 方法。如果 Java 虚拟机仅需确定此类是否存在,和如果存在则如何获知它的父类,那么将 resolve 标记设为 false。但是,如果该类的实例已创建,或它的方法已被调用,则必须解析该类。这种情况,resolve 标记设为 true,调用 resolveClass 方法。

例如,一个应用程序能够创建一网络类装载器,从某一个服务器上下载类文件。代码可能如下:

  • ClassLoader loader = new NetworkClassLoader(host, port);
    Object main = loader.loadClass("Main", true).newInstance();
     . . .

网络类装载器的子类必须定义 loadClass 方法,实现从网上下载类。一旦已下载完该类,就应使用 defineClass方法,创建它的一个实例。实现示例如下:


     class NetworkClassLoader {
         String host;
         int port;
         Hashtable cache = new Hashtable();
         private byte loadClassData(String name)[] {
         // load the class data from the connection
          . . .
         }
         public synchronized Class loadClass(String name,
                                             boolean resolve) {
             Class c = cache.get(name);
             if (c == null) {
                 byte data[] = loadClassData(name);
                 c = defineClass(data, 0, data.length);
                 cache.put(name, c);
             }
             if (resolve)
                 resolveClass(c);
             return c;
         }
     }
 

来自:
JDK1.0
参见:
Class, newInstance, defineClass, loadClass, resolveClass

构造子索引
ClassLoader()
构造一个新的类装载器并初始化它。

方法索引
defineClass(byte[], int, int)
将一字节数组转换为 Class 类的一个实例。 不推荐使用该方法。
defineClass(String, byte[], int, int)
将一字节数组转换为 Class 类的一个实例。
findLoadedClass(String)
findSystemClass(String)
用指定名查找系统类,如果必要装载之。
getResource(String)
用给定名查找资源。
getResourceAsStream(String)
获取给定资源的一 InputStream 类。
getSystemResource(String)
用给定名查找资源。
getSystemResourceAsStream(String)
获取给定资源的一 InputStream 类。
loadClass(String)
申请类装载器,装载并解析给定名类。
loadClass(String, boolean)
将指定名解析为一 Class 对象。
resolveClass(Class)
为了创建类的实例,或调用它的方法,解析相应类。
setSigners(Class, Object[])
设置类标记。

构造子
ClassLoader
 protected ClassLoader()
构造一个新的类装载器并初始化它。

如果有一安全管理器,则调用它的 checkCreateClassLoader 方法。可能返回安全性异常。

抛出: SecurityException
如果当前线程不允许创建一新类装载器。
参见:
SecurityException, checkCreateClassLoader

方法
loadClass
 public Class loadClass(String name) throws ClassNotFoundException
申请类装载器,装载并解析给定名类。 当类装载器装入的类首次引用另一类时, Java 虚拟机调用 loadClass 方法。 ClassLoader 的每个继承类都必须定义此方法。

类装载器应使用一个哈希表(hashtable)或其它的缓冲器,以避免多次定义同名类。

参数:
name - 期望的 Class 对象名。
返回值:
结果 Class 对象,若没有找到则为 null
抛出: ClassNotFoundException
如果类装载器不能找到该类的定义。
loadClass
 protected abstract Class loadClass(String name,
                                    boolean resolve) throws ClassNotFoundException
将指定名解析为一 Class 对象。 虚拟机调用 loadClass() 方法。

如果 resolve 标记为 true,应对结果类调用 resolveClass 方法。

作为一抽象方法,ClassLoader 的继承类必须定义 loadClass() 方法。使用一哈希表(Hashtable), 能避免多次装载相同类。

参数:
name - 期望的 Class 对象名。
resolve - 如果不需要解析该 Class 则为 true.
返回值:
结果 Class 对象,若没有找到则为 null
抛出: ClassNotFoundException
如果类装载器不能找到该类定义。
参见:
Hashtable
defineClass
 protected final Class defineClass(byte data[],
                                   int offset,
                                   int length)
注释:不推荐使用 defineClass() 方法。 用 defineClass(java.lang.String, byte[], int, int) 方法替换。

将一字节数组转换为 Class 类的一个实例。 类必须解析之后才能使用。在以 "name" 作为第一个参数的版本中,不推荐使用此方法,此方法较安全。

参数:
data - 组成 Class 对象的字节数据。
offset - Class 数据的起始位移。
length - Class 数据的长度。
返回值:
以 data 创建的 Class 对象。
抛出: ClassFormatError
如果数据不包括合法类。
参见:
loadClass, resolveClass
defineClass
 protected final Class defineClass(String name,
                                   byte data[],
                                   int offset,
                                   int length)
将一字节数组转换为 Class 类的一个实例。 类必须解析之后才能使用。

参数:
name - 期望的类名;若未知则为 null;使用 '.' 而不是 '/' 作为分隔符,结尾没有 ".class" 后缀。
data - 组成 Class 对象的字节数据。
offset - Class 数据的起始位移。
length - Class 数据的长度。
返回值:
以 data 创建的 Class 对象。
抛出: ClassFormatError
如果数据不包括合法类。
参见:
loadClass, resolveClass
resolveClass
 protected final void resolveClass(Class c)
为了创建类的实例,或调用它的方法,解析相应类。 如果解析标志为 true,则该方法应被 loadClass 方法调用。

参数:
c - 解析的 Class 实例。
参见:
defineClass
findSystemClass
 protected final Class findSystemClass(String name) throws ClassNotFoundException
用指定名查找系统类,如果必要装载之。

系统类是以与平台有关的方式从局部文件系统中装载的类。它没有类装载器。

参数:
name - 系统 class 名。
返回值:
给定名的系统类。
抛出: ClassNotFoundException
如果不能找到该类定义。
抛出: NoClassDefFoundError
如果不能找到此类。
setSigners
 protected final void setSigners(Class cl,
                                 Object signers[])
设置类标记。 通过已知的类装载代码,定义一个类后再调用该方法。

findLoadedClass
 protected final Class findLoadedClass(String name)
getSystemResourceAsStream
 public static final InputStream getSystemResourceAsStream(String name)
获取给定资源的一 InputStream 类。 若没有相应的资源,则返回 null。

资源名可能是任一系统资源(例如:跟随 CLASSPATH 号)。

参数:
name - 资源名,作为将被使用的。
返回值:
一资源的 InputStream 对象,如果不能找到则为 null。
getSystemResource
 public static final URL getSystemResource(String name)
用给定名查找资源。 返回值是一资源的 URL,使用它调用 getContent() 方法,可能返回一个图象、一段音频剪辑(AudioClip)或一个 InputStream 对象。

资源名可能是任一系统资源(例如:跟随 CLASSPATH 号)。

参数:
name - 资源名,作为将被使用的。
返回值:
资源的 URL 值,如果不能找到对应资源则为 null。
getResourceAsStream
 public InputStream getResourceAsStream(String name)
获取给定资源的一个 InputStream。若没有相应的资源,则返回 null。

类装载器能选择定位此资源。

参数:
name - 资源名,作为将被使用的。
返回值:
一资源的 InputStream 对象,如果不能找到则为 null。
getResource
 public URL getResource(String name)
用给定名查找资源。 返回一资源的 URL 值。使用它调用 getContent() 方法,可能返回一个图象、一段音频剪辑(AudioClip)或一个 InputStream 对象。

类装载器能选择定位此资源。

参数:
name - 资源名,作为将被使用的。
返回值:
一资源的 InputStream 对象,如果不能找到则为 null。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值