客户端日志打印规范

16 篇文章 0 订阅
14 篇文章 1 订阅

日志的作用

还原故障发生的现场

由于终端设备的碎片化问题,以及用户行为的不可预知性,产品功能上线前的测试阶段通常无法覆盖所有的意外情况。

当线上问题发生时,日志是否能提供足够多的信息来还原用户当时的场景和行为,以快速定位问题的原因,减少无谓的争执和甩锅,就显得尤为重要了。

怎样打印日志

日志级别

  • Verbose: 最详尽的log,任何内容都会输出。

  • DEBUG(调试):仅在开发期间有用的调试信息。

    主要集中在开发/测试阶段使用,输出的日志内容及形式可以根据开发人员的实际调试需要来调整,灵活度较大,一般会包含参数信息/流程信息/返回值信息等内容。

    特别要注意的是,该级别的日志不能被带到生产环境,建议在封装的日志工具类API中加上当前是否是调试模式的判断。

  • INFO(信息):常规使用情况的预期日志信息。

        用于记录具体的业务行为信息,需要有选择地使用,只输出对结果有实际意义的内容,避免          日志输出量过大,造成设备存储空间不足。一般作为默认的输出级别。

  • WARN(警告):尚未引发严重错误的潜在问题信息。

        涉及的通常是可提前预知并且影响范围可控的问题,一般不影响业务流程的正常执行,包括          但不限于参数缺失/参数错误/任务超时等情况。对该级别的日志,要求对于问题发生时的上下          文信息要尽可能详尽地记录下来,以便事后的日志分析。

  • ERROR(错误):已经引发严重错误的问题信息。

        涉及的通常是不可预知的并且影响范围较广的异常或错误,可能会导致应用崩溃,或者严重          阻塞业务流程正常执行,需要人工及时干预。对该级别的日志,除了要记录问题发生时的上          下文信息,还要包括完整的异常堆栈信息,以便快速定位问题发生的地方并及时修复。

日志级别示例——登录流程

  1. 首先假设我们的登录模块包含三种登录方式,分别是验证码登录、密码登录以及第三方平台登录,我们可以为不同的登录方式定义不同的TAG:
    // 父模块-登录
    public static final String TAG_LOGIN = "login";
    // 子模块-验证码登录
    public static final String TAG_LOGIN_IDENTIFYING_CODE = "login_identifying_code";
    // 子模块-密码登录
    public static final String TAG_LOGIN_PASSWORD = "login_password";
    // 子模块-第三方平台登录
    public static final String TAG_LOGIN_THIRD_PARTY = "login_third_party";
  2. 假设用户选择了验证码登录,输入了手机号码之后点击「获取验证码」按钮,此时需要请求获取验证码接口,并将按钮置为不可用,然后开始计时,超过一分钟后才将按钮恢复为可用,允许重新获取验证码。在开始计时之前不允许用户重复点击按钮,以免重复发起请求。

  3. 为了验证防止重复获取验证码和计时按钮恢复可用的代码逻辑是否生效,我们可以使用验证码登录的TAG,分别打印以下DEBUG级别的日志,验证流程是否如预期执行:
     

    LogUtil.d(TAG_LOGIN_IDENTIFYING_CODE, "处于重复点击判断时间区间,返回不处理")
    ...
    LogUtil.d(TAG_LOGIN_IDENTIFYING_CODE, "开始计时,按钮不可用");
    ...
    LogUtil.d(TAG_LOGIN_IDENTIFYING_CODE, "当前剩余秒数:" + second);
    ...
    LogUtil.d(TAG_LOGIN_IDENTIFYING_CODE, "计时结束,按钮恢复可用");
  4. 假设用户正常收到了验证码短信,并且输入了验证码后成功登陆,我们需要将过程中的具体的业务行为用INFO级别打印出来,以便后期日志分析时可以还原用户的行为轨迹以及有故障发生时的现场信息:
    LogUtil.i(TAG_LOGIN_IDENTIFYING_CODE, "请求获取验证码接口, phone:" + phone);
    ...
    LogUtil.i(TAG_LOGIN_IDENTIFYING_CODE, "请求获取验证码接口成功, response: " + response.toString());
    ...
    LogUtil.i(TAG_LOGIN_IDENTIFYING_CODE, "请求验证码登录接口, phone:" + phone + ", identifyingCode: " + identifyingCode);
    ...
    LogUtil.i(TAG_LOGIN_IDENTIFYING_CODE, "请求验证码登录接口成功, response: " + response.toString());
    ...
    LogUtil.i(TAG_LOGIN, "开始同步用户配置...");
    ...
    LogUtil.i(TAG_LOGIN, "开始同步消息通知...");
    ...
  5. 当偶现获取验证码超时的情况,虽然用户可以通过再次点击「获取验证码」按钮来重新获取,但是仍要将该情况记录到WARN级别的日志,并提供当时的上下文信息,以便后期统计出现此情况的频率,从而寻找可以优化的空间。
        String msg = new StringBuilder("获取验证码接口超时:")
                .append("countryCode").append(countryCode)
                .append("phone:").append(phone)
                .append("time:").append(DateUtil.format(System.currentTimeMillis()))
                .append("networkAvailable:").append(NetworkUtil.isNetworkAvailable(getContext()))
                .append("networkType:").append(NetworkUtil.getNetworkType(getContext()));
        LogUtil.w(TAG_LOGIN_IDENTIFYING_CODE, msg);

而当「获取验证码」接口不可用,用户登录流程受阻时,我们则要在接口请求失败回调方法中用ERROR级别打印出接口返回的错误码和错误信息,或者抛出的异常堆栈,以协助快速定位问题的原因并及时修复:

    @Override
    public void onFailure(Response response, IOException e) {
        if(response != null) {
            LogUtil.e(TAG_LOGIN_IDENTIFYING_CODE, "获取验证码接口请求失败,code: " + response.getCode() + ", msg: " + response.getMsg());
        } else {
            LogUtil.e(TAG_LOGIN_IDENTIFYING_CODE, "获取验证码接口请求失败", e);
        }
    }

日志规范

1.把控日志级别,严禁出现日志信息与日志级别不符的情况

不同的日志级别代表不同的日志重要程度,乱用日志级别将对排查的重要日志信息产生严重干扰。

// 反例:仅仅出于红色更显眼的原因,用ERROR级别打印调试信息
LogUtil.e(TAG, "Send a Msg")

2.合理使用TAG,以便分析时能快速过滤出指定日志

这里建议的TAG命名方式是按不同模块粒度划分、根据从属关系从大到小进行排列、模块名间以下划线分隔来命名,这样做的结果是可以更细致地查看不同粒度下的模块功能是否正常执行。

但要注意Android旧版本系统对logcat的TAG长度支持最长只有23个字符长度,建议使用合理且易懂的单词缩写,且尽量不超过三个模块层级。
 

比如以下两个TAG分别代表的是:

  • msgserv_ws_keepalive——消息接入服务/WebSocket模块/心跳保活功能
  • msgserv_ws_msgqueue——消息接入服务/WebSocket模块/消息队列功能

如果我只想关注心跳保活功能,我可以筛选完整的msgserv_ws_keepalive。而如果我想关注整个WebSocket模块的各项功能是否都运行正常,我可以筛选msgserv_ws。

// 正例:合理的TAG命名与使用
public static final String TAG = "msgserv_ws_keepalive";
...
LogUtil.i(TAG, "Received a pong frame, do nothing")

// 反例:以开发者名字为TAG的无意义命名
LogUtil.i("zhangsan", "onResume()")

// 反例:出于方便省略TAG
LogUtil.i("onPause()")

3.确保重要信息的完整,避免打印无效的日志

大量无效的日志不仅占用了设备的存储空间,更为获取真正有效的日志增加了干扰度,不利于快速定位和解决问题。为此,在打印日志之前请先思考:打印该日志的目的是什么?该日志是否真的有助于解决问题?

// 正例:抛出异常时打印异常堆栈信息
LogUtil.e(TAG, "Websocket connection was closed", e)

// 正例:问题发生时输出相关上下文信息
LogUtil.w(TAG, "Request failed with code: " + code);

// 反例:冗余日志——频繁下载进度回调打印干扰正常的日志打印
LogUtil.d(TAG, "Current download progress: " + progress)

// 反例:无效日志——缺少描述失败原因的返回码及描述
LogUtil.w("Download failed")

// 反例:意义不明的日志—为了验证流程而输出无意义的数字
LogUtil.d(TAG, "1")
LogUtil.d(TAG, "2")
LogUtil.d(TAG, "3")

4.力求日志内容描述简洁、清晰,又不影响可读性

// 正例:只取出关心的字段,描述其代表含义
String msg = new StringBuilder()
                .append("Request method:").append(request.method()).append("\n")
                .append("Request url:").append(request.url()).append("\n")
                .append("Request headers:").append(request.headers()).append("\n")
                .append("Request body:").append(request.body()).append("\n")
                .toString();
LogUtil.d(TAG, msg);

// 反例:直接打印请求实体,没有任何描述
LogUtil.i(TAG, request.toString())

5.用StringBuilder替代字符串拼接以处理参数较多的情形

采用Java语言开发时,使用字符串拼接会产生大量的String对象。当参数较多时,建议使用StringBuilder替代字符串拼接。

// 反例:以用字符串拼接输出日志
LogUtil.d(TAG, "Request method:" + request.method() + "\n"
        + "Request url:" + request.url() + "\n"
        + "Request headers:" + request.headers() + "\n"
        + "Request body:" + request.body());

6.包含敏感信息的日志内容需要脱敏,进行加密或不输出

平时打印的日志信息就要注意避免敏感信息的泄漏,如果有持久化到本地的操作要注意对日志内容进行加密。

7.打印Java语言定义的实体类必须重写toString()方法

// 正例:重写toString()方法,将实体类转换为JSON字符串
 @Override
 public String toString() {
    return JSONUtil.toJSON(this);
 }

8.避免因日志系统的引入,为应用增加不稳定性及额外的性能损耗

前面说过,日志本身并不能为功能带来增益,但日志打印毕竟也是编码的一部分,是编码就会有隐藏的稳定性风险和性能损耗,需要开发人员特别注意。最好能支持线上的降级手段,当出现了因日志造成的不良影响时,能停止打印某个级别的日志或直接不再打印日志。

// 反例:调用对象方法没有先进行非空判断,有隐藏的空指针异常风险
LogUtil.d(TAG, "Insert a new message:" + message.getId())

9.为日志文件制定合理的缓存时间,定时清理过期日志

建议以FIFO的清除策略,按日期顺序移除过期的日志文件,日志文件的最长缓存时间可根据产品的业务特性(比如是否有定期的周活动/月活动)来制定,可以选择在每次进行读写操作时才去检查日志文件是否过期,也可以专门建立一个后台任务定期检查过期日志文件并删除。
 

10.禁止直接使用第三方日志框架API,避免产生方案碎片化问题

规范建立之后,具体的日志相关处理可以交由第三方日志框架来实现,但为了保证方案的统一性和可替换性,需要基于外观模式,将打印日志的行为统一封装到作为外观角色的Log工具类,项目中统一使用Log工具类来打印日志。

什么时候该打日志?

1.产品核心业务的执行流程

这个自不必多说,产品核心业务的正常执行与否,决定着产品的最终质量,影响着公司在业界的口碑,并与实际收益挂钩。一方面需要全面的日志系统协助排查隐藏的技术漏洞,另一方面页需要在用户反馈问题时能用日志及时定位并快速给予答复。

2.跨端/跨应用/跨模块等的通信过程

常见的如外部接口请求与响应过程,内容主要包含影响接口请求成功率及数据展示的请求方法/请求头/请求参数/响应码/响应内容等,同理还有不同应用间的数据分享过程以及同一应用不同业务模块间的路由跳转过程等。

3.重要组件的初始启动配置

重要组件的初始启动配置会直接影响到应用的整体表现,我们可以通过打印组件的初始启动配置参数,验证是否存在由参数配置错误导致的异常。

4.长时间运行组件的行为/状态切换

长时间运行的组件受设备内存/电量/网络及用户操作等的影响比较大,需要通过日志实时关注其运行状态,确保其运行正常。

5.多个分支逻辑的判断

典型的情况就是代码中出现了多个条件分支,或者存在多个可供选择的策略类,需要确定是进入了哪个分支或策略,从而验证流程有没有按预期的情况执行。

6.对结果有影响的用户交互

比较有代表意义的就是搜索模块,用户通过输入框搜索/历史搜索词/热门搜索词/热搜榜单/联想词等模块都可以触发搜索行为,为了定位是由哪个模块触发的搜索,就有必要记录具体的用户交互行为。

7.调用大概率可能失败的方法时

当功能的实现依赖于外部条件的成立与否时,调用该功能的实现方法就有大概率可能失败,比如持久化数据需要有足够的存储空间,访问外部接口需要当前网络可用等。调用此类方法时我们通常需要验证外部条件是否成立,并提供条件不成立时的相应处理方式,适当的日志打印可以帮助我们验证流程是否合理且可行。

8.第三方SDK的调用过程

由于对第三方SDK提供方技术的不可把控,我们无法保证引入第三方SDK会不会对应用的稳定性造成影响。

为了避免这种情况,我们需要在对第三方SDK的API调用过程中,打印出第三方SDK提供给我们的信息,以便出现问题时能和第三方SDK提供方及时有效地沟通。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
开发工具在软件开发生命周期中扮演着至关重要的角色,它们旨在简化和加速从概念设计到产品部署的各个环节。以下是开发工具的主要作用: 代码编写与编辑: 提供集成开发环境(IDE),如Visual Studio、Eclipse、Android Studio和Sublime Text等,这些工具集成了文本编辑器,支持语法高亮、自动补全、代码片段管理和版本控制等功能,有助于开发者高效编写和维护代码。 项目管理: 支持项目创建、组织、构建自动化以及依赖管理,确保不同模块和组件之间的协调一致。 编译与构建: 包括编译器、构建工具(如Make、Gradle、Maven)等,用于将源代码转换为可执行文件或库,并进行资源打包、优化等处理。 调试与测试: 集成调试器允许开发者逐行执行代码,设置断点、查看变量值、跟踪调用堆栈等,帮助定位并修复代码中的错误。 测试框架和工具则协助开发者编写和运行单元测试、集成测试及性能测试,确保软件质量。 版本控制与协作: 通过集成Git、SVN等版本控制系统,支持团队成员间的代码共享、分支管理、合并请求和冲突解决。 可视化设计与原型制作: 对于UI/UX设计,有界面设计工具,如Sketch、Adobe XD,可以帮助设计师快速构建应用程序界面模型,并生成规范的设计稿供开发人员参考实现。 跨平台支持: 跨平台开发工具如Xamarin、React Native和Flutter,让开发者使用一种语言或框架编写可以在多个操作系统上运行的应用程序。 文档编写与API管理: 文档生成工具可以自动生成代码注释文档,便于团队内外理解和使用项目代码。 API管理工具则方便开发者创建、测试、发布和维护API接口。 持续集成与持续部署(CI/CD): Jenkins、Travis CI、GitHub Actions等工具负责自动化构建、测试和部署流程,提高交付效率和可靠性。 数据库管理与ORM工具: 数据库客户端工具用于连接、查询、更新数据库,ORM(对象关系映射)工具简化了数据操作和持久化层的开发工作。 总之,开发工具极大地提升了软件工程师的工作效率,保证了开发过程中的准确性与一致性,同时也促进了团队合作,使得软件开发更系统化、规范化和工业化。
本文档是 JavaTM Platform Standard Edition 6 的 API 规范Java SE Platform 软件包 java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含用于创建用户界面和绘制图形图像的所有类。 java.awt.color 提供用于颜色空间的类。 java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的各类事件的接口和类。 java.awt.font 提供与字体相关的类和接口。 java.awt.geom 提供用于在与二维几何形状相关的对象上定义和执行操作的 Java 2D 类。 java.awt.im 提供输入方法框架所需的类和接口。 java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt.print 为通用的打印 API 提供类和接口。 java.beans 包含与开发 beans 有关的类,即基于 JavaBeansTM 架构的组件。 java.beans.beancontext 提供与 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的选择器。 java.nio.channels.spi 用于 java.nio.channels 包的服务提供者类。 java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供者类。 java.rmi 提供 RMI 包。 java.rmi.activation 为 RMI 对象激活提供支持。 java.rmi.dgc 为 RMI 分布式垃圾回收提供了类和接口。 java.rmi.registry 提供 RMI 注册表的一个类和两个接口。 java.rmi.server 提供支持服务器端 RMI 的类和接口。 java.security 为安全框架提供类和接口。 java.security.acl 此包中的类和接口已经被 java.security 包中的类取代。 java.security.cert 提供用于解析和管理证书、证书撤消列表 (CRL) 和证书路径的类和接口。 java.security.interfaces 提供的接口用于生成 RSA Laboratory Technical Note PKCS#1 中定义的 RSA(Rivest、Shamir 和 Adleman AsymmetricCipher 算法)密钥,以及 NIST 的 FIPS-186 中定义的 DSA(数字签名算法)密钥。 java.security.spec 提供密钥规范和算法参数规范的类和接口。 java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text 包中类的服务提供者类。 java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供用于读写标准 ZIP 和 GZIP 文件格式的类。 javax.accessibility 定义了用户界面组件与提供对这些组件进行访问的辅助技术之间的协定。 javax.crypto 为加密操作提供类和接口。 javax.crypto.interfaces 根据 RSA Laboratories' PKCS #3 的定义,提供 Diffie-Hellman 密钥接口。 javax.crypto.spec 为密钥规范和算法参数规范提供类和接口。 javax.imageio Java Image I/O API 的主要包。 javax.imageio.event Java Image I/O API 的一个包,用于在读取和写入图像期间处理事件的同步通知。 javax.imageio.metadata 用于处理读写元数据的 Java Image I/O API 的包。 javax.imageio.plugins.bmp 包含供内置 BMP 插件使用的公共类的包。 javax.imageio.plugins.jpeg 支持内置 JPEG 插件的类。 javax.imageio.spi 包含用于 reader、writer、transcoder 和流的插件接口以及一个运行时注册表的 Java Image I/O API 包。 javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/O。 javax.management 提供 Java Management Extensions 的核心类。 javax.management.loading 提供实现高级动态加载的类。 javax.management.modelmbean 提供了 ModelMBean 类的定义。 javax.management.monitor 提供 monitor 类的定义。 javax.management.openmbean 提供开放数据类型和 Open MBean 描述符类。 javax.management.relation 提供 Relation Service 的定义。 javax.management.remote 对 JMX MBean 服务器进行远程访问使用的接口。 javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax.naming 为访问命名服务提供类和接口。 javax.naming.directory 扩展 javax.naming 包以提供访问目录服务的功能。 javax.naming.event 在访问命名和目录服务时提供对事件通知的支持。 javax.naming.ldap 提供对 LDAPv3 扩展操作和控件的支持。 javax.naming.spi 提供一些方法来动态地插入对通过 javax.naming 和相关包访问命名和目录服务的支持。 javax.net 提供用于网络应用程序的类。 javax.net.ssl 提供用于安全套接字包的类。 javax.print 为 JavaTM Print Service API 提供了主要类和接口。 javax.print.attribute 提供了描述 JavaTM Print Service 属性的类型以及如何分类这些属性的类和接口。 javax.print.attribute.standard 包 javax.print.attribute.standard 包括特定打印属性的类。 javax.print.event 包 javax.print.event 包含事件类和侦听器接口。 javax.rmi 包含 RMI-IIOP 的用户 API。 javax.rmi.CORBA 包含用于 RMI-IIOP 的可移植性 API。 javax.rmi.ssl 通过安全套接字层 (SSL) 或传输层安全 (TLS) 协议提供 RMIClientSocketFactory 和 RMIServerSocketFactory 的实现。 javax.security.auth 此包提供用于进行验证和授权的框架。 javax.security.auth.callback 此包提供与应用程序进行交互所必需的类,以便检索信息(例如,包括用户名和密码的验证数据)或显示信息(例如,错误和警告消息)。 javax.security.auth.kerberos 此包包含与 Kerberos 网络验证协议相关的实用工具类。 javax.security.auth.login 此包提供可插入的验证框架。 javax.security.auth.spi 此包提供用于实现可插入验证模块的接口。 javax.security.auth.x500 此包包含应该用来在 Subject 中存储 X500 Principal 和 X500 Private Crendentials 的类。 javax.security.cert 为公钥证书提供类。 javax.security.sasl 包含用于支持 SASL 的类和接口。 javax.sound.midi 提供用于 MIDI(音乐乐器数字接口)数据的 I/O、序列化和合成的接口和类。 javax.sound.midi.spi 在提供新的 MIDI 设备、MIDI 文件 reader 和 writer、或音库 reader 时提供服务提供者要实现的接口。 javax.sound.sampled 提供用于捕获、处理和回放取样的音频数据的接口和类。 javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类的服务提供者的抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API。 javax.sql.rowset JDBC RowSet 实现的标准接口和基类。 javax.sql.rowset.serial 提供实用工具类,允许 SQL 类型与 Java 编程语言数据类型之间的可序列化映射关系。 javax.sql.rowset.spi 第三方供应商在其同步提供者的实现中必须使用的标准类和接口。 javax.swing 提供一组“轻量级”(全部是 Java 语言)组件,尽量让这些组件在所有平台上的工作方式都相同。 javax.swing.border 提供围绕 Swing 组件绘制特殊边框的类和接口。 javax.swing.colorchooser 包含供 JColorChooser 组件使用的类和接口。 javax.swing.event 供 Swing 组件触发的事件使用javax.swing.filechooser 包含 JFileChooser 组件使用的类和接口。 javax.swing.plaf 提供一个接口和许多抽象类,Swing 用它们来提供自己的可插入外观功能。 javax.swing.plaf.basic 提供了根据基本外观构建的用户界面对象。 javax.swing.plaf.metal 提供根据 Java 外观(曾经代称为 Metal)构建的用户界面对象,Java 外观是默认外观。 javax.swing.plaf.multi 提供了组合两个或多个外观的用户界面对象。 javax.swing.plaf.synth Synth 是一个可更换皮肤 (skinnable) 的外观,在其中可委托所有绘制。 javax.swing.table 提供用于处理 javax.swing.JTable 的类和接口。 javax.swing.text 提供类 HTMLEditorKit 和创建 HTML 文本编辑器的支持类。 javax.swing.text.html 提供类 HTMLEditorKit 和创建 HTML 文本编辑器的支持类。 javax.swing.text.html.parser 提供默认的 HTML 解析器以及支持类。 javax.swing.text.rtf 提供一个类 (RTFEditorKit),用于创建富文本格式(Rich-Text-Format)的文本编辑器。 javax.swing.tree 提供处理 javax.swing.JTree 的类和接口。 javax.swing.undo 允许开发人员为应用程序(例如文本编辑器)中的撤消/恢复提供支持。 javax.transaction 包含解组期间通过 ORB 机制抛出的三个异常。 javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 javax.xml.bind 为包含解组、编组和验证功能的客户端应用程序提供运行时绑定框架。 javax.xml.bind.annotation 定义将 Java 程序元素定制成 XML 模式映射的注释。 javax.xml.bind.annotation.adapters XmlAdapter 及其规范定义的子类允许任意 Java 类与 JAXB 一起使用javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的已优化的二进制数据。 javax.xml.bind.helpers 仅由 JAXB 提供者用于: 提供某些 javax.xml.bind 接口的部分默认实现。 javax.xml.bind.util 有用的客户端实用工具类。 javax.xml.crypto 用于 XML 加密的通用类。 javax.xml.crypto.dom javax.xml.crypto 包的特定于 DOM 的类。 javax.xml.crypto.dsig 用于生成和验证 XML 数字签名的类。 javax.xml.crypto.dsig.dom javax.xml.crypto.dsig 包特定于 DOM 的类。 javax.xml.crypto.dsig.keyinfo 用来解析和处理 KeyInfo 元素和结构的类。 javax.xml.crypto.dsig.spec XML 数字签名的参数类。 javax.xml.datatype XML/Java 类型映射关系。 javax.xml.namespace XML 名称空间处理。 javax.xml.parsers 提供允许处理 XML 文档的类。 javax.xml.soap 提供用于创建和构建 SOAP 消息的 API。 javax.xml.stream javax.xml.stream.events javax.xml.stream.util javax.xml.transform 此包定义了用于处理转换指令,以及执行从源到结果的转换的一般 API。 javax.xml.transform.dom 此包实现特定于 DOM 的转换 API。 javax.xml.transform.sax 此包实现特定于 SAX2 的转换 API。 javax.xml.transform.stax 提供特定于 StAX 的转换 API。 javax.xml.transform.stream 此包实现特定于流和 URI 的转换 API。 javax.xml.validation 此包提供了用于 XML 文档验证的 API。 javax.xml.ws 此包包含核心 JAX-WS API。 javax.xml.ws.handler 该包定义用于消息处理程序的 API。 javax.xml.ws.handler.soap 该包定义用于 SOAP 消息处理程序的 API。 javax.xml.ws.http 该包定义特定于 HTTP 绑定的 API。 javax.xml.ws.soap 该包定义特定于 SOAP 绑定的 API。 javax.xml.ws.spi 该包定义用于 JAX-WS 2.0 的 SPI。 javax.xml.xpath 此包提供了用于 XPath 表达式的计算和访问计算环境的 object-model neutral API。 org.ietf.jgss 此包提供一个框架,该框架允许应用程序开发人员通过利用统一的 API 使用一些来自各种基础安全机制(如 Kerberos)的安全服务,如验证、数据完整性和和数据机密性。 org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对 Java[tm] Standard Edition 6 中现有 CORBA 接口所进行的添加。 org.omg.CORBA_2_3.portable 提供输入和输出值类型的各种方法,并包含 org/omg/CORBA/portable 包的其他更新。 org.omg.CORBA.DynAnyPackage 提供与 DynAny 接口一起使用的异常(InvalidValue、Invalid、InvalidSeq 和 TypeMismatch)。 org.omg.CORBA.ORBPackage 提供由 ORB.resolve_initial_references 方法抛出的异常 InvalidName,以及由 ORB 类中的动态 Any 创建方法抛出的异常 InconsistentTypeCode。 org.omg.CORBA.portable 提供可移植性层,即可以使一个供应商生成的代码运行在另一个供应商 ORB 上的 ORB API 集合。 org.omg.CORBA.TypeCodePackage 提供用户定义的异常 BadKind 和 Bounds,它们将由 TypeCode 类中的方法抛出。 org.omg.CosNaming 为 Java IDL 提供命名服务。 org.omg.CosNaming.NamingContextExtPackage 此包包含以下在 org.omg.CosNaming.NamingContextExt 中使用的类: AddressHelper StringNameHelper URLStringHelper InvalidAddress 包规范 有关 Java[tm] Platform, Standard Edition 6 ORB 遵守的官方规范的受支持部分的明确列表,请参阅 Official Specifications for CORBA support in Java[tm] SE 6。 org.omg.CosNaming.NamingContextPackage 此包包含 org.omg.CosNaming 包的 Exception 类。 org.omg.Dynamic 此包包含 OMG Portable Interceptor 规范 http://cgi.omg.org/cgi-bin/doc?ptc/2000-08-06 的第 21.9 小节中指定的 Dynamic 模块。 org.omg.DynamicAny 提供一些类和接口使得在运行时能够遍历与 any 有关联的数据值,并提取数据值的基本成分。 org.omg.DynamicAny.DynAnyFactoryPackage 此包包含 DynamicAny 模块的 DynAnyFactory 接口中的类和异常,该模块在 OMG The Common Object Request Broker: Architecture and Specification http://cgi.omg.org/cgi-bin/doc?formal/99-10-07 的第 9.2.2 小节中指定。 org.omg.DynamicAny.DynAnyPackage 此包包含 DynAny 模块的 DynAnyFactory 接口中的类和异常,该模块在 OMG The Common Object Request Broker: Architecture and Specification http://cgi.omg.org/cgi-bin/doc?formal/99-10-07 的第 9.2 小节中指定。 org.omg.IOP 此包包含在 OMG 文档 The Common Object Request Broker: Architecture and Specification http://cgi.omg.org/cgi-bin/doc?formal/99-10-07 的 13.6.小节中指定的 IOP 模块。 org.omg.IOP.CodecFactoryPackage 此包包含 IOP::CodeFactory 接口中指定的异常(作为 Portable Interceptor 规范的一部分)。 org.omg.IOP.CodecPackage 此包根据 IOP::Codec IDL 接口定义生成。 org.omg.Messaging 此包包含 OMG Messaging Interceptor 规范 http://cgi.omg.org/cgi-bin/doc?formal/99-10-07 中指定的 Messaging 模块。 org.omg.PortableInterceptor 提供一个注册 ORB 钩子 (hook) 的机制,通过这些钩子 ORB 服务可以截取执行 ORB 的正常流。 org.omg.PortableInterceptor.ORBInitInfoPackage 此包包含 OMG Portable Interceptor 规范 http://cgi.omg.org/cgi-bin/doc?ptc/2000-08-06 的第 21.7.2 小节中指定的 PortableInterceptor 模块的 ORBInitInfo 本地接口中的异常和 typedef。 org.omg.PortableServer 提供一些类和接口,用来生成跨多个供应商 ORB 的可移植应用程序的服务器端。 org.omg.PortableServer.CurrentPackage 提供各种方法实现,这些实现能够访问调用方法的对象的身份。 org.omg.PortableServer.POAManagerPackage 封装 POA 关联的处理状态。 org.omg.PortableServer.POAPackage 允许程序员构造可在不同 ORB 产品间移植的对象实现。 org.omg.PortableServer.portable 提供一些类和接口,用来生成跨多个供应商 ORB 的可移植应用程序的服务器端。 org.omg.PortableServer.ServantLocatorPackage 提供定位 servant 的类和接口。 org.omg.SendingContext 为值类型的编组提供支持。 org.omg.stub.java.rmi 包含用于 java.rmi 包中出现的 Remote 类型的 RMI-IIOP Stub。 org.w3c.dom 为文档对象模型 (DOM) 提供接口,该模型是 Java API for XML Processing 的组件 API。 org.w3c.dom.bootstrap org.w3c.dom.events org.w3c.dom.ls org.xml.sax 此包提供了核心 SAX API。 org.xml.sax.ext 此包包含适合的 SAX 驱动程序不一定支持的 SAX2 设施的接口。 org.xml.sax.helpers 此包包含“帮助器”类,其中包括对引导基于 SAX 的应用程序的支持。 其他软件包 javax.activation javax.activity 包含解组期间通过 ORB 机制抛出的与 Activity 服务有关的异常。 javax.annotation javax.annotation.processing 用来声明注释处理器并允许注释处理器与注释处理工具环境通信的工具。 javax.jws javax.jws.soap javax.lang.model 用来为 Java 编程语言建立模型的包的类和层次结构。 javax.lang.model.element 用于 Java 编程语言的模型元素的接口。 javax.lang.model.type 用来为 Java 编程语言类型建立模型的接口。 javax.lang.model.util 用来帮助处理程序元素和类型的实用工具。 javax.script 脚本 API 由定义 Java TM Scripting Engines 的接口和类组成,并为它们在 Java 应用程序中的使用提供框架。 javax.tools 为能够从程序(例如,编译器)中调用的工具提供接口。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值