モジュール java.base

クラスClassPrinter

java.lang.Object
java.lang.classfile.components.ClassPrinter

public final class ClassPrinter extends Object
ClassPrinterは、JavaプラットフォームのプレビューAPIです。
プレビュー機能が有効な場合のみ、プログラムでClassPrinterを使用できます。
プレビュー機能は、今後のリリースで削除するか、Javaプラットフォームの永続機能にアップグレードすることができます。
クラス・ファイルとその要素のプリンタ。

ClassModelPREVIEWFieldModelPREVIEWMethodModelPREVIEWまたはCodeModelPREVIEWは、JSON、XMLまたはYAML形式の人間が読める構造化テキストに出力できます。 または、トラバース可能なノードと印刷可能なノードのツリーに、より正確にClassPrinter.MapNodePREVIEWClassPrinter.ListNodePREVIEWおよびClassPrinter.LeafNodePREVIEWインスタンスのツリーにエクスポートできます。

印刷またはエクスポートする詳細のレベルは、ClassPrinter.VerbosityPREVIEWオプションによって決まります。

印刷はデバッグのみを目的としています。 印刷されたテキスト・スキーマ、ツリー・コンテンツおよび構造は保証されません。 これは将来いつでも変更される可能性があります。

最も頻繁なユース・ケースは、単にクラスを出力することです。

ClassPrinter.toJson(classModel, ClassPrinter.Verbosity.TRACE_ALL, System.out::print);

ClassPrinterPREVIEWを使用すると、単純な印刷可能ノードのツリーを横断してカスタム・プリンタをフックできます:

void customPrint(ClassModel classModel) {
    print(ClassPrinter.toTree(classModel, ClassPrinter.Verbosity.TRACE_ALL));
}

void print(ClassPrinter.Node node) {
    switch (node) {
        case ClassPrinter.MapNode mn -> {
            // print map header
            mn.values().forEach(this::print);
        }
        case ClassPrinter.ListNode ln -> {
            // print list header
            ln.forEach(this::print);
        }
        case ClassPrinter.LeafNode n -> {
            // print leaf node
        }
    }
}

ClassPrinterPREVIEWのもう1つのユースケースは、自動テストの記述を簡略化することです:

@Test
void printNodesInTest(ClassModel classModel) {
    var classNode = ClassPrinter.toTree(classModel, ClassPrinter.Verbosity.TRACE_ALL);
    assertContains(classNode, "method name", "myFooMethod");
    assertContains(classNode, "field name", "myBarField");
    assertContains(classNode, "inner class", "MyInnerFooClass");
}

void assertContains(ClassPrinter.Node node, ConstantDesc key, ConstantDesc value) {
    if (!node.walk().anyMatch(n -> n instanceof ClassPrinter.LeafNode ln
                           && ln.name().equals(key)
                           && ln.value().equals(value))) {
        node.toYaml(System.out::print);
        throw new AssertionError("expected %s: %s".formatted(key, value));
    }
}

導入されたバージョン:
22