JDK1.8源码解读之 Package

761 阅读4分钟

概述

Package 对象包含有关Java包的实现和规范的版本信息。加载该类的 ClassLoader 实例将检索此版本信息并使其可用。通常,它存储在与类一起分发的清单中。 组成程序包的一组类可以实现特定的规范.规范标题,版本号和供应商字符串可以标识该规范。应用程序可以询问该软件包是否与特定版本兼容,有关详细信息,可以查看 isCompatibleWith 方法。

规范版本号使用的语法由以句点“.”分隔的非负十进制整数组成,例如“ 2.0”或“ 1.2.3.4.5.6.7”。这允许使用可扩展的数字来表示主要版本,次要版本,微型版本等。

实现标题,版本和供应商字符串可标识实现,并且可以方便地使用它们,以便在出现问题时准确报告所涉及的软件包。这三个实现字符串的内容都是特定于供应商的。实现版本字符串没有指定的语法,应仅与期望的版本标识符进行比较以进行相等性比较。在每个 ClassLoader 实例中,来自同一java包的所有类都具有相同的Package对象。静态方法允许按名称查找包,或者查找当前类加载器已知的所有包的集合。

继承关系

public class Package implements java.lang.reflect.AnnotatedElement 实现了 java.lang.reflect.AnnotatedElement 接口

成员属性

包括包名和一些属性 private final String pkgName; private final String specTitle; private final String specVersion; private final String specVendor; private final String implTitle; private final String implVersion; private final String implVendor; private final URL sealBase; private transient final ClassLoader loader;

构造器

Package(String name,
        String spectitle, String specversion, String specvendor,
        String impltitle, String implversion, String implvendor,
        URL sealbase, ClassLoader loader)
{
    pkgName = name;
    implTitle = impltitle;
    implVersion = implversion;
    implVendor = implvendor;
    specTitle = spectitle;
    specVersion = specversion;
    specVendor = specvendor;
    sealBase = sealbase;
    this.loader = loader;
}

关键方法

获取包的名称

public String getName() {
    return pkgName;
}
getSpecificationTitle()

获取规范的title

public String getSpecificationTitle() {
    return specTitle;
}
getSpecificationVersion()

返回规范的版本

public String getSpecificationVersion() {
    return specVersion;
}
getSpecificationVendor()

返回组织,供应商,或者所属公司的名称

public String getSpecificationVendor() {
    return specVendor;
}
getImplementationTitle()

返回包的title

public String getImplementationTitle() {
    return implTitle;
}
getImplementationVersion()

返回此实现的版本

public String getImplementationVersion() {
    return implVersion;
}
getImplementationVendor()

返回提供该实现的 组织、供应商 或者 公司

public String getImplementationVendor() {
    return implVendor;
}
isSealed()

判断包是否密封的

public boolean isSealed() {
    return sealBase != null;
}

public boolean isSealed(URL url) { return url.equals(sealBase); }

isCompatibleWith()

对和目标版本对比 规范版本,如果当前package的版本比目标版本大,返回true,否则返回false

public boolean isCompatibleWith(String desired) throws NumberFormatException
getPackage()

在调用者 ClassLoader 实例中按名称查找包。调用者 ClassLoader 实例用于查找与命名类相对应的包实例。 在调用者 ClassLoader 实例中按名称查找包。调用者 ClassLoader 实例用于查找与命名类相对应的包实例。 仅当类加载器使用适当的属性创建软件包实例时,软件包才具有版本和规范的属性。通常,这些属性是在与类一起出现的清单中定义的。

@CallerSensitive public static Package getPackage(String name)
getPackages()

获取调用方的 ClassLoader 实例当前已知的所有软件包。这些软件包对应于通过该 ClassLoader 实例加载或可通过名称访问的类。如果调用方的 ClassLoader 实例是引导 ClassLoader 实例,在某些实现中可以用 null 表示,则只有与引导 ClassLoader 实例加载的类相对应的软件包才是回到。

@CallerSensitive public static Package[] getPackages()
getAnnotation()

获取指定类的包。该类的类加载器用于查找与指定类相对应的包实例。如果类加载器是引导类加载器,在某些实现中可以用 null 表示,则搜索由引导类加载器加载的软件包集合以找到该软件包。仅当类加载器使用适当的属性创建软件包实例时,软件包才具有版本和规范的属性。通常,这些属性是在与类一起出现的清单中定义的。

public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
isAnnotationPresent()

判断是否使用了某个注解

public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {
    return AnnotatedElement.super.isAnnotationPresent(annotationClass);
}
getAnnotationsByType()

此方法返回指定注解类型的注释数组。

@Override
public  <A extends Annotation> A[] getAnnotationsByType(Class<A> annotationClass) {
    return getPackageInfo().getAnnotationsByType(annotationClass);
}
getAnnotations()

返回所有注解数组。

public Annotation[] getAnnotations() {
    return getPackageInfo().getAnnotations();
}
getDeclaredAnnotation()

通过类型,返回直接修饰在当前包上的注解。

@Override
public <A extends Annotation> A getDeclaredAnnotation(Class<A> annotationClass) {
    return getPackageInfo().getDeclaredAnnotation(annotationClass);
}
getDeclaredAnnotationsByType()

通过指定类型,直接修饰在某个元素上的注解

@Override
public <A extends Annotation> A[] getDeclaredAnnotationsByType(Class<A> annotationClass) {
    return getPackageInfo().getDeclaredAnnotationsByType(annotationClass);
}
getDeclaredAnnotations()

返回直接修饰在当前元素上的所有注解

public Annotation[] getDeclaredAnnotations()  {
    return getPackageInfo().getDeclaredAnnotations();
}

希望和大家多多交流


我16年毕业以后,做的是前端,目前打算深入学习java开发。内容有任何问题,欢迎各位小伙伴们指正,也希望小伙伴们给我点赞和关注,给我留言,一起交流讨论,共同进步。