ClassLoader 类

定义

类加载程序是负责加载类的对象。

[Android.Runtime.Register("java/lang/ClassLoader", DoNotGenerateAcw=true)]
public abstract class ClassLoader : Java.Lang.Object
[<Android.Runtime.Register("java/lang/ClassLoader", DoNotGenerateAcw=true)>]
type ClassLoader = class
    inherit Object
继承
ClassLoader
派生
属性

注解

类加载程序是负责加载类的对象。 该类 ClassLoader 是一个抽象类。 给定类的二进制名称,类加载程序应尝试查找或生成构成类定义的数据。 典型的策略是将名称转换为文件名,然后从文件系统中读取该名称的“类文件”。

每个java.lang.Class Class对象都包含一个Class#getClassLoader() referenceClassLoader定义它的对象。

Class数组类的对象不是由类加载程序创建的,而是按照Java运行时的要求自动创建的。 数组类的类加载程序,如其 Class#getClassLoader() 元素类型返回的类加载程序相同;如果元素类型为基元类型,则数组类没有类加载程序。

应用程序实现子类ClassLoader,以便扩展Java虚拟机动态加载类的方式。

类加载程序通常可由安全管理器用来指示安全域。

除了加载类,类加载程序还负责查找资源。 资源是一些数据(例如,“”.class文件、配置数据或图像),它使用抽象的“/”分隔路径名称进行标识。 资源通常打包为应用程序或库,以便可以通过应用程序或库中的代码来定位资源。 在某些情况下,将包含这些资源,以便它们可由其他库找到。

ClassLoader 类使用委派模型搜索类和资源。 每个实例 ClassLoader 都有一个关联的父类加载程序。 当请求查找类或资源时, ClassLoader 实例通常会在尝试查找类或资源本身之前将类或资源的搜索委托给其父类加载程序。

支持类并发加载的类加载程序称为 <em><#isRegisteredAsParallelCapable() parallel capable/em> 类加载程序,需要通过调用#registerAsParallelCapable ClassLoader.registerAsParallelCapable该方法在类初始化时自行注册。 请注意,默认情况下,该 ClassLoader 类注册为支持并行的类。 但是,如果子类支持并行,则仍需要自行注册。 在委托模型不是严格分层的环境中,类加载程序需要并行支持,否则类加载可能会导致死锁,因为加载程序锁在类加载过程的持续时间(请参阅 #loadClass loadClass 方法)。

<h2> “builtinLoaders”>运行时内置类加载程序</h2>

Java运行时具有以下内置类加载程序:

<ul><li>

Bootstrap 类加载程序。 它是虚拟机的内置类加载程序,通常表示为null,并且没有父级。</li li><>

#getSystemClassLoader() 系统类加载程序。 它也称为 <em>应用程序类加载程序</em> ,不同于平台类加载程序。 系统类加载程序通常用于在应用程序类路径、模块路径和特定于 JDK 的工具上定义类。 平台类加载程序是系统类加载程序的父级或上级,因此系统类加载程序可以通过委派给其父类来加载平台类。</li></ul>

通常,Java虚拟机以依赖于平台的方式从本地文件系统加载类。 但是,某些类可能不是源自文件;它们可能源自其他源,例如网络,也可以由应用程序构造。 该方法 #defineClass(String, byte[], int, int) defineClass 将字节数组转换为类 Class的实例。 可以使用此新定义的类的实例创建 Class#newInstance Class.newInstance

类加载程序创建的对象的方法和构造函数可以引用其他类。 若要确定所引用的类(es),Java虚拟机调用#loadClass loadClass最初创建类的类加载程序的方法。

例如,应用程序可以创建网络类加载程序,以便从服务器下载类文件。 示例代码可能如下所示:

<blockquote>

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

</blockquote>

网络类加载程序子类必须定义方法和#findClass findClassloadClassData从网络加载类。 下载构成类的字节后,应使用该方法 #defineClass defineClass 创建类实例。 示例实现为:

<blockquote>

class NetworkClassLoader extends ClassLoader {
                    String host;
                    int port;

                    public Class findClass(String name) {
                        byte[] b = loadClassData(name);
                        return defineClass(name, b, 0, b.length);
                    }

                    private byte[] loadClassData(String name) {
                        // load the class data from the connection
                        &nbsp;.&nbsp;.&nbsp;.
                    }
                }

</blockquote>

<h3> “binary-name”>Binary names</h3>

作为String方法ClassLoader参数提供的任何类名都必须是引用>< Java 语言规范</引用>定义的二进制名称。

有效类名的示例包括: <blockquote>

"java.lang.String"
              "javax.swing.JSpinner$DefaultEditor"
              "java.security.KeyStore$Builder$FileBuilder$1"
              "java.net.URLClassLoader$3$1"

</blockquote>

作为String方法ClassLoader参数提供的任何包名称都必须为空字符串(表示未命名的包)或引用><Java语言规范</引用>定义的完全限定名称。

在 1.0 中添加。

适用于 . 的 java.lang.ClassLoaderJava 文档

本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。

构造函数

名称 说明
ClassLoader()

使用 ClassLoader 方法 #getSystemClassLoader() getSystemClassLoader() 返回作为父类加载程序的新类加载程序创建一个新的类加载程序。

ClassLoader(ClassLoader)

使用指定的父类加载程序创建一个新的类加载程序进行委派。

ClassLoader(IntPtr, JniHandleOwnership)

创建 JNI 对象的托管表示形式时使用的构造函数;由运行时调用。

属性

名称 说明
Class

返回此 Object的运行时类。

(继承自 Object)
Handle

基础 Android 实例的句柄。

(继承自 Object)
JniIdentityHashCode

类加载程序是负责加载类的对象。

(继承自 Object)
JniPeerMembers

类加载程序是负责加载类的对象。

Parent

返回委托的父类加载程序。

PeerReference

类加载程序是负责加载类的对象。

(继承自 Object)
SystemClassLoader

返回系统类加载程序。

ThresholdClass

此 API 支持 Mono for Android 基础结构,不打算直接从代码使用。

ThresholdType

此 API 支持 Mono for Android 基础结构,不打算直接从代码使用。

方法

名称 说明
ClearAssertionStatus()

将此类加载程序的默认断言状态设置为 false 并放弃与类加载程序关联的任何包默认值或类断言状态设置。

Clone()

创建并返回此对象的副本。

(继承自 Object)
DefineClass(Byte[], Int32, Int32)
已过时.

将字节数组转换为类 Class的实例。

DefineClass(String, Byte[], Int32, Int32, ProtectionDomain)

将字节数组转换为具有给定ProtectionDomain的类Class实例。

DefineClass(String, Byte[], Int32, Int32)

将字节数组转换为类 Class的实例。

DefineClass(String, ByteBuffer, ProtectionDomain)

将 a java.nio.ByteBuffer ByteBuffer 转换为具有给定ProtectionDomain的类Class的实例。

DefinePackage(String, String, String, String, String, String, String, URL)

在此 ClassLoader中按名称定义包。

Dispose()

类加载程序是负责加载类的对象。

(继承自 Object)
Dispose(Boolean)

类加载程序是负责加载类的对象。

(继承自 Object)
Equals(Object)

指示其他对象是否“等于”此对象。

(继承自 Object)
FindClass(String)

查找具有指定二进制名称的类。

FindLibrary(String)

返回本机库的绝对路径名称。

FindLoadedClass(String)

如果Java虚拟机将此加载程序记录为具有该二进制名称的类的启动加载程序,则返回具有给定二进制名称的类。

FindResource(String)

查找具有给定名称的资源。

FindResources(String)

返回表示具有给定名称的所有资源的对象的枚举 java.net.URL URL

FindSystemClass(String)

查找具有指定二进制名称的类,并在必要时加载它。

GetHashCode()

返回对象的哈希代码值。

(继承自 Object)
GetPackage(String)

在此类加载程序及其上级中按名称查找包。

GetPackages()

返回已由此类加载程序及其祖先定义的所有 Packages。

GetResource(String)

查找具有给定名称的资源。

GetResourceAsStream(String)

返回用于读取指定资源的输入流。

GetResources(String)

查找具有给定名称的所有资源。

GetSystemResource(String)

从用于加载类的搜索路径中查找指定名称的资源。

GetSystemResourceAsStream(String)

打开以供读取,这是用于加载类的搜索路径中指定名称的资源。

GetSystemResources(String)

从用于加载类的搜索路径中查找指定名称的所有资源。

JavaFinalize()

当垃圾回收确定不再引用该对象时,由对象上的垃圾回收器调用。

(继承自 Object)
LoadClass(String, Boolean)

加载具有指定二进制名称的类。

LoadClass(String)

加载具有指定二进制名称的类。

LoadClassAsync(String, Boolean)

类加载程序是负责加载类的对象。

LoadClassAsync(String)

类加载程序是负责加载类的对象。

Notify()

唤醒正在等待此对象的监视器的单个线程。

(继承自 Object)
NotifyAll()

唤醒正在等待此对象的监视器的所有线程。

(继承自 Object)
RegisterAsParallelCapable()

将调用方注册为 #isRegisteredAsParallelCapable() parallel capable.

ResolveClass(Class)

链接指定类。

SetClassAssertionStatus(String, Boolean)

设置此类加载程序中命名顶级类的所需断言状态及其包含的任何嵌套类。

SetDefaultAssertionStatus(Boolean)

设置此类加载程序的默认断言状态。

SetHandle(IntPtr, JniHandleOwnership)

设置 Handle 属性。

(继承自 Object)
SetPackageAssertionStatus(String, Boolean)

设置命名包的包默认断言状态。

SetSigners(Class, Object[])

设置类的签名者。

ToArray<T>()

类加载程序是负责加载类的对象。

(继承自 Object)
ToString()

返回对象的字符串表示形式。

(继承自 Object)
UnregisterFromRuntime()

类加载程序是负责加载类的对象。

(继承自 Object)
Wait()

使当前线程等待,直到唤醒它,通常是通过 em 通知/em< 或 >em<interrupted>/em<。><>

(继承自 Object)
Wait(Int64, Int32)

使当前线程等待直到唤醒,通常是通过 <em>通知</em> 或 <em interrupted>/em<>,或直到经过一定数量的实时。

(继承自 Object)
Wait(Int64)

使当前线程等待直到唤醒,通常是通过 <em>通知</em> 或 <em interrupted>/em<>,或直到经过一定数量的实时。

(继承自 Object)

显式接口实现

名称 说明
IJavaPeerable.Disposed()

类加载程序是负责加载类的对象。

(继承自 Object)
IJavaPeerable.DisposeUnlessReferenced()

类加载程序是负责加载类的对象。

(继承自 Object)
IJavaPeerable.Finalized()

类加载程序是负责加载类的对象。

(继承自 Object)
IJavaPeerable.JniManagedPeerState

类加载程序是负责加载类的对象。

(继承自 Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

类加载程序是负责加载类的对象。

(继承自 Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

类加载程序是负责加载类的对象。

(继承自 Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

类加载程序是负责加载类的对象。

(继承自 Object)

扩展方法

名称 说明
GetJniTypeName(IJavaPeerable)

获取实例 self类型的 JNI 名称。

JavaAs<TResult>(IJavaPeerable)

尝试强制self键入TResult,检查强制是否在Java端有效。

JavaCast<TResult>(IJavaObject)

执行 Android 运行时检查的类型转换。

JavaCast<TResult>(IJavaObject)

类加载程序是负责加载类的对象。

TryJavaCast<TResult>(IJavaPeerable, TResult)

尝试强制self键入TResult,检查强制是否在Java端有效。

适用于