🎇

Java デバッグの仕組み を悪用して 電卓計算をしよう!

に公開

はじめに

Java の デバッガって、JVM上でメソッド呼び出しを実行できるんですよー

→ じゃあ JVM の計算資源を勝手に使って計算ができるのでは?????

この記事はそんなノリで作った電卓コマンド、jcalc の紹介です。
https://github.com/Snowman-s/jcalc

コマンド概要

コマンドを実行する前に、JVM を以下のコマンドで実行します。
ただし、mainを含むソースファイルの名前は 必ず Main.java としてください。

$ javac Main.java
$ java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 Main

その後、以下のように電卓が使えます

$ jcalc
jcalc> 10 + 20
=30
jcalc> (10 + 30) * 3 / 5
= 24

...うわぁ、地味!

いや、今から裏側の説明をするので聞いてください。
これは JVM によって正当に保証された計算結果なんですよ!

動作原理

以下では動作原理を説明します。とはいえ大分込み入った話でもあるので、3段階の詳細度での説明を行います。分かりやすいと感じる詳細度を選んでお読みください。

動作原理 (詳細度: あっさり)

あっさり

Java のデバッガは、JVM に好きなメソッドを実行してもらうようにお願いできます。

例として、10+20を計算することを考えましょう。
jcalc は10+20 を受け取ると、以下相当の計算を行うようにJVMにお願いします。

import java.math.BigInteger;

BigInteger a = BigInteger.valueOf(10);
BigInteger b = BigInteger.valueOf(20);
BigInteger sum = a.add(b);

String answer = sum.toString(); // 結果

JVMはお願いした結果を返してくれるので、jcalc はそれを表示しているだけです。

重要なことに、jcalcは電卓の計算は全く行いません。

(直接計算したほうが早い? その計算結果はだれが保証するんですか? ってことです。JVMの計算結果の方が信用できるでしょ?)

動作原理 (詳細度: そこそこ)

そこそこ

JVM には デバッグのためのプロトコル (Java-Debugging-Wire-Protocol, JDWP) が整備されています。デバッガは、JDWP を使用することで、JVM上の任意のメソッドを呼び出すことが可能 になります。

JDWP 仕様
https://docs.oracle.com/en/java/javase/25/docs/specs/jdwp/jdwp-spec.html

例として、10+20を計算することを考えましょう。
jcalc は10+20 を受け取ると、JDWPを使用することで、以下相当の計算を行うようにJVMに要求します。(詳細は『とことん』のセクションで説明しますが、大体の場合 BigInteger は直接使えません。)

Class bigIntClass = Class.forName("java.math.BigInteger");
Method bigIntValueOf = bigIntClass.getMethod("valueOf", new Class[] { Long.TYPE });
Method bigIntAdd = bigIntClass.getMethod("add", new Class[] { bigIntClass });
Method bigIntToString = bigIntClass.getMethod("toString", (Class[]) null);

Object a = bigIntValueOf.invoke(null, new Object[] { Long.valueOf(10) });
Object b = bigIntValueOf.invoke(null, new Object[] { Long.valueOf(20) });

Object sum = bigIntAdd.invoke(a, new Object[] { b });

Object answer = bigIntToString.invoke(sum, (Object[]) null); // 結果

JVMは一切疑うこともなくこれを実行し、answer を返してくれます。

上記はあくまで簡略化されたもので、実際にはすべてバイト列で通信を行います。

重要なことに、jcalcは電卓の計算は全く行いません。

(直接計算したほうが早い? その計算結果はだれが保証するんですか? ってことです。JVMの計算結果の方が信用できるでしょ?)

動作原理 (詳細度: とことん)

とことん

JVM には デバッグのためのプロトコル (Java-Debugging-Wire-Protocol, JDWP) が整備されています。デバッガは、JDWP を使用することで、クラスローダーがロードしているクラスの任意のメソッドを呼び出すことが可能 になります。

JDWP 仕様
https://docs.oracle.com/en/java/javase/25/docs/specs/jdwp/jdwp-spec.html

例として、10+20を計算することを考えましょう。

JDWP では、四則演算などを直接行うことはできないので、BigInteger を利用して、以下相当の処理を要求するのがよさそうに思えます。

import java.math.BigInteger;

BigInteger a = BigInteger.valueOf(10);
BigInteger b = BigInteger.valueOf(20);
BigInteger sum = a.add(b);

String answer = sum.toString(); // 結果

しかし、これには問題があります。JDWPでは、クラスローダーが読み込んだクラスしか参照できないという制約があります。
java.math.BigInteger は、使用する方が稀なので、大体読み込まれていないでしょう。

一方、 java.lang.Class は通常読み込まれます。仕方が無いので代わりにリフレクションを使いましょう。

Class bigIntClass = Class.forName("java.math.BigInteger");
Method bigIntValueOf = bigIntClass.getMethod("valueOf", new Class[] { Long.TYPE });
Method bigIntAdd = bigIntClass.getMethod("add", new Class[] { bigIntClass });
Method bigIntToString = bigIntClass.getMethod("toString", (Class[]) null);

Object a = bigIntValueOf.invoke(null, new Object[] { Long.valueOf(10) });
Object b = bigIntValueOf.invoke(null, new Object[] { Long.valueOf(20) });

Object sum = bigIntAdd.invoke(a, new Object[] { b });

Object answer = bigIntToString.invoke(sum, (Object[]) null); // 結果

さて、JVMは、別にJavaプログラム自体を解するわけではないので、これをJDWP に準じたパケットに置き換えてやる必要があります。

実際に送られるパケットをある種の方法で示したものは以下にたたんでおきます。
物好きな人のみご覧ください。これは再現証明の意図です。

実際に送られるパケット例
VirtualMachineIDSizes -> ({ field_idsize: 8, method_idsize: 8, object_idsize: 8, reference_type_idsize: 8, frame_idsize: 8 })
EventRequestSet({ event_kind: 8, suspend_policy: 2, modifiers: (1, [{ mod_kind: _12({ source_name_pattern: Main.java }) }]) }) -> ({ request_id: 2 })
VirtualMachineResume -> 
VirtualMachineAllThreads -> ({ threads: (7, [{ thread: 1 }, { thread: 3 }, { thread: 4 }, { thread: 5 }, { thread: 6 }, { thread: 7 }, { thread: 8 }]) })
VirtualMachineClassesBySignature({ signature: Ljava/lang/Class; }) -> ({ classes: (1, [{ ref_type_tag: 1, type_id: 9, status: 7 }]) })
ReferenceTypeMethods({ ref_type: 9 }) -> ({ declared: (169, [{ method_id: 1995331702000, name: registerNatives, signature: ()V, mod_bits: 266 }, { method_id: 1995331701984, name: runtimeSetup, signature: ()V, mod_bits: 10 }, { method_id: 1997145124504, name: <init>, signature: (Ljava/lang/ClassLoader;Ljava/lang/Class;CLjava/security/ProtectionDomain;Z)V, mod_bits: 2 }, { method_id: 1995331701904, name: toString, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1995331702784, name: toGenericString, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1995331702048, name: addSealingInfo, signature: (ILjava/lang/StringBuilder;)V, mod_bits: 2 }, { method_id: 1995331702096, name: hasSealedAncestor, signature: (Ljava/lang/Class;)Z, mod_bits: 2 }, { method_id: 1995331702792, name: typeVarBounds, signature: (Ljava/lang/reflect/TypeVariable;)Ljava/lang/String;, mod_bits: 8 }, { method_id: 1995331701872, name: forName, signature: (Ljava/lang/String;)Ljava/lang/Class;, mod_bits: 9 }, { method_id: 1995331701880, name: forName, signature: (Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Class;, mod_bits: 10 }, { method_id: 1995331701888, name: forName, signature: (Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;, mod_bits: 9 }, { method_id: 1995331701896, name: forName0, signature: (Ljava/lang/String;ZLjava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Class;, mod_bits: 266 }, { method_id: 1995331701864, name: forName, signature: (Ljava/lang/Module;Ljava/lang/String;)Ljava/lang/Class;, mod_bits: 9 }, { method_id: 1995331702800, name: forPrimitiveName, signature: (Ljava/lang/String;)Ljava/lang/Class;, mod_bits: 9 }, { method_id: 1995331702144, name: newInstance, signature: ()Ljava/lang/Object;, mod_bits: 1 }, { method_id: 1995331701936, name: isInstance, signature: (Ljava/lang/Object;)Z, mod_bits: 257 }, { method_id: 1995331701928, name: isAssignableFrom, signature: (Ljava/lang/Class;)Z, mod_bits: 257 }, { method_id: 1995331702008, name: isInterface, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702024, name: isArray, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702016, name: isPrimitive, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702056, name: isAnnotation, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702808, name: isSynthetic, signature: ()Z, mod_bits: 1 }, { method_id: 1997145124496, name: getName, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1995331702152, name: initClassName, signature: ()Ljava/lang/String;, mod_bits: 258 }, { method_id: 1995331702120, name: getClassLoader, signature: ()Ljava/lang/ClassLoader;, mod_bits: 1 }, { method_id: 1995331702816, name: getClassLoader0, signature: ()Ljava/lang/ClassLoader;, mod_bits: 0 }, { method_id: 1995331701912, name: getModule, signature: ()Ljava/lang/Module;, mod_bits: 1 }, { method_id: 1995331702824, name: getClassData, signature: ()Ljava/lang/Object;, mod_bits: 0 }, { method_id: 1995331702080, name: getTypeParameters, signature: ()[Ljava/lang/reflect/TypeVariable;, mod_bits: 1 }, { method_id: 1995331701952, name: getSuperclass, signature: ()Ljava/lang/Class;, mod_bits: 257 }, { method_id: 1995331702832, name: getGenericSuperclass, signature: ()Ljava/lang/reflect/Type;, mod_bits: 1 }, { method_id: 1995331702840, name: getPackage, signature: ()Ljava/lang/Package;, mod_bits: 1 }, { method_id: 1995331702536, name: getPackageName, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1995331702112, name: getInterfaces, signature: ()[Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331702104, name: getInterfaces, signature: (Z)[Ljava/lang/Class;, mod_bits: 2 }, { method_id: 1995331702184, name: getInterfaces0, signature: ()[Ljava/lang/Class;, mod_bits: 258 }, { method_id: 1995331702848, name: getGenericInterfaces, signature: ()[Ljava/lang/reflect/Type;, mod_bits: 1 }, { method_id: 1995331702032, name: getComponentType, signature: ()Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331702168, name: elementType, signature: ()Ljava/lang/Class;, mod_bits: 2 }, { method_id: 1995331702040, name: getModifiers, signature: ()I, mod_bits: 1 }, { method_id: 1995331702856, name: accessFlags, signature: ()Ljava/util/Set;, mod_bits: 1 }, { method_id: 1995331702864, name: getSigners, signature: ()[Ljava/lang/Object;, mod_bits: 1 }, { method_id: 1995331702872, name: setSigners, signature: ([Ljava/lang/Object;)V, mod_bits: 0 }, { method_id: 1995331702880, name: getEnclosingMethod, signature: ()Ljava/lang/reflect/Method;, mod_bits: 1 }, { method_id: 1995331702272, name: getEnclosingMethod0, signature: ()[Ljava/lang/Object;, mod_bits: 258 }, { method_id: 1995331702224, name: getEnclosingMethodInfo, signature: ()Ljava/lang/Class$EnclosingMethodInfo;, mod_bits: 2 }, { method_id: 1995331702240, name: toClass, signature: (Ljava/lang/reflect/Type;)Ljava/lang/Class;, mod_bits: 10 }, { method_id: 1995331702888, name: getEnclosingConstructor, signature: ()Ljava/lang/reflect/Constructor;, mod_bits: 1 }, { method_id: 1995331702896, name: getDeclaringClass, signature: ()Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331702304, name: getDeclaringClass0, signature: ()Ljava/lang/Class;, mod_bits: 258 }, { method_id: 1995331702248, name: getEnclosingClass, signature: ()Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331702320, name: getSimpleName, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1995331702312, name: getSimpleName0, signature: ()Ljava/lang/String;, mod_bits: 2 }, { method_id: 1995331702904, name: getTypeName, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1995331702344, name: getCanonicalName, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1995331702336, name: getCanonicalName0, signature: ()Ljava/lang/String;, mod_bits: 2 }, { method_id: 1995331702208, name: isAnonymousClass, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702200, name: isLocalClass, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702192, name: isMemberClass, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702328, name: getSimpleBinaryName, signature: ()Ljava/lang/String;, mod_bits: 2 }, { method_id: 1995331702360, name: getSimpleBinaryName0, signature: ()Ljava/lang/String;, mod_bits: 258 }, { method_id: 1995331702368, name: isTopLevelClass, signature: ()Z, mod_bits: 2 }, { method_id: 1995331702352, name: isLocalOrAnonymousClass, signature: ()Z, mod_bits: 2 }, { method_id: 1995331702376, name: hasEnclosingMethodInfo, signature: ()Z, mod_bits: 2 }, { method_id: 1995331702912, name: getClasses, signature: ()[Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331702920, name: getFields, signature: ()[Ljava/lang/reflect/Field;, mod_bits: 1 }, { method_id: 1995331702928, name: getMethods, signature: ()[Ljava/lang/reflect/Method;, mod_bits: 1 }, { method_id: 1995331702936, name: getConstructors, signature: ()[Ljava/lang/reflect/Constructor;, mod_bits: 1 }, { method_id: 1995331702944, name: getField, signature: (Ljava/lang/String;)Ljava/lang/reflect/Field;, mod_bits: 1 }, { method_id: 1995331702632, name: getMethod, signature: (Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;, mod_bits: 129 }, { method_id: 1995331702952, name: getConstructor, signature: ([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;, mod_bits: 129 }, { method_id: 1995331702384, name: getDeclaredClasses, signature: ()[Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331702960, name: getDeclaredFields, signature: ()[Ljava/lang/reflect/Field;, mod_bits: 1 }, { method_id: 1995331702968, name: getRecordComponents, signature: ()[Ljava/lang/reflect/RecordComponent;, mod_bits: 1 }, { method_id: 1995331702976, name: getDeclaredMethods, signature: ()[Ljava/lang/reflect/Method;, mod_bits: 1 }, { method_id: 1995331702984, name: getDeclaredConstructors, signature: ()[Ljava/lang/reflect/Constructor;, mod_bits: 1 }, { method_id: 1995331702992, name: getDeclaredField, signature: (Ljava/lang/String;)Ljava/lang/reflect/Field;, mod_bits: 1 }, { method_id: 1995331703000, name: getDeclaredMethod, signature: (Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;, mod_bits: 129 }, { method_id: 1995331703008, name: getDeclaredPublicMethods, signature: (Ljava/lang/String;[Ljava/lang/Class;)Ljava/util/List;, mod_bits: 128 }, { method_id: 1995331703016, name: findMethod, signature: (ZLjava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;, mod_bits: 128 }, { method_id: 1995331703024, name: getDeclaredConstructor, signature: ([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;, mod_bits: 129 }, { method_id: 1995331702520, name: getResourceAsStream, signature: (Ljava/lang/String;)Ljava/io/InputStream;, mod_bits: 1 }, { method_id: 1995331702528, name: getResource, signature: (Ljava/lang/String;)Ljava/net/URL;, mod_bits: 1 }, { method_id: 1995331702512, name: isOpenToCaller, signature: (Ljava/lang/String;Ljava/lang/Class;)Z, mod_bits: 2 }, { method_id: 1995331701920, name: getProtectionDomain, signature: ()Ljava/security/ProtectionDomain;, mod_bits: 1 }, { method_id: 1995331703032, name: getPrimitiveClass, signature: (Ljava/lang/String;)Ljava/lang/Class;, mod_bits: 264 }, { method_id: 1995331702504, name: resolveName, signature: (Ljava/lang/String;)Ljava/lang/String;, mod_bits: 2 }, { method_id: 1995331702176, name: reflectionData, signature: ()Ljava/lang/Class$ReflectionData;, mod_bits: 2 }, { method_id: 1995331702544, name: newReflectionData, signature: (Ljava/lang/ref/SoftReference;I)Ljava/lang/Class$ReflectionData;, mod_bits: 2 }, { method_id: 1995331702552, name: getGenericSignature0, signature: ()Ljava/lang/String;, mod_bits: 258 }, { method_id: 1995331702232, name: getFactory, signature: ()Lsun/reflect/generics/factory/GenericsFactory;, mod_bits: 2 }, { method_id: 1995331702160, name: getGenericInfo, signature: ()Lsun/reflect/generics/repository/ClassRepository;, mod_bits: 2 }, { method_id: 1995331702680, name: getRawAnnotations, signature: ()[B, mod_bits: 256 }, { method_id: 1995331702704, name: getRawTypeAnnotations, signature: ()[B, mod_bits: 256 }, { method_id: 1995331702560, name: getExecutableTypeAnnotationBytes, signature: (Ljava/lang/reflect/Executable;)[B, mod_bits: 8 }, { method_id: 1995331702688, name: getConstantPool, signature: ()Ljdk/internal/reflect/ConstantPool;, mod_bits: 256 }, { method_id: 1995331702464, name: privateGetDeclaredFields, signature: (Z)[Ljava/lang/reflect/Field;, mod_bits: 2 }, { method_id: 1995331702392, name: privateGetPublicFields, signature: ()[Ljava/lang/reflect/Field;, mod_bits: 2 }, { method_id: 1995331702576, name: addAll, signature: (Ljava/util/Collection;[Ljava/lang/reflect/Field;)V, mod_bits: 10 }, { method_id: 1995331702296, name: privateGetDeclaredConstructors, signature: (Z)[Ljava/lang/reflect/Constructor;, mod_bits: 2 }, { method_id: 1995331702256, name: privateGetDeclaredMethods, signature: (Z)[Ljava/lang/reflect/Method;, mod_bits: 2 }, { method_id: 1995331702408, name: privateGetPublicMethods, signature: ()[Ljava/lang/reflect/Method;, mod_bits: 2 }, { method_id: 1995331702480, name: searchFields, signature: ([Ljava/lang/reflect/Field;Ljava/lang/String;)Ljava/lang/reflect/Field;, mod_bits: 10 }, { method_id: 1995331702432, name: getField0, signature: (Ljava/lang/String;)Ljava/lang/reflect/Field;, mod_bits: 2 }, { method_id: 1995331702488, name: searchMethods, signature: ([Ljava/lang/reflect/Method;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;, mod_bits: 10 }, { method_id: 1995331702440, name: getMethod0, signature: (Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;, mod_bits: 2 }, { method_id: 1995331702496, name: getMethodsRecursive, signature: (Ljava/lang/String;[Ljava/lang/Class;ZZ)Ljava/lang/PublicMethods$MethodList;, mod_bits: 2 }, { method_id: 1995331702136, name: getConstructor0, signature: ([Ljava/lang/Class;I)Ljava/lang/reflect/Constructor;, mod_bits: 2 }, { method_id: 1995331702264, name: arrayContentsEq, signature: ([Ljava/lang/Object;[Ljava/lang/Object;)Z, mod_bits: 10 }, { method_id: 1995331702400, name: copyFields, signature: ([Ljava/lang/reflect/Field;)[Ljava/lang/reflect/Field;, mod_bits: 10 }, { method_id: 1995331702416, name: copyMethods, signature: ([Ljava/lang/reflect/Method;)[Ljava/lang/reflect/Method;, mod_bits: 10 }, { method_id: 1995331702424, name: copyConstructors, signature: ([Ljava/lang/reflect/Constructor;)[Ljava/lang/reflect/Constructor;, mod_bits: 10 }, { method_id: 1995331702568, name: getDeclaredFields0, signature: (Z)[Ljava/lang/reflect/Field;, mod_bits: 258 }, { method_id: 1995331702592, name: getDeclaredMethods0, signature: (Z)[Ljava/lang/reflect/Method;, mod_bits: 258 }, { method_id: 1995331702584, name: getDeclaredConstructors0, signature: (Z)[Ljava/lang/reflect/Constructor;, mod_bits: 258 }, { method_id: 1995331702456, name: getDeclaredClasses0, signature: ()[Ljava/lang/Class;, mod_bits: 258 }, { method_id: 1995331702472, name: getRecordComponents0, signature: ()[Ljava/lang/reflect/RecordComponent;, mod_bits: 258 }, { method_id: 1995331702616, name: isRecord0, signature: ()Z, mod_bits: 258 }, { method_id: 1995331702448, name: methodToString, signature: (Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/String;, mod_bits: 2 }, { method_id: 1995331702608, name: desiredAssertionStatus, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702600, name: desiredAssertionStatus0, signature: (Ljava/lang/Class;)Z, mod_bits: 266 }, { method_id: 1995331702064, name: isEnum, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702072, name: isRecord, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702128, name: getReflectionFactory, signature: ()Ljdk/internal/reflect/ReflectionFactory;, mod_bits: 10 }, { method_id: 1995331703040, name: resetArchivedStates, signature: ()V, mod_bits: 10 }, { method_id: 1995331703048, name: getEnumConstants, signature: ()[Ljava/lang/Object;, mod_bits: 1 }, { method_id: 1995331702624, name: getEnumConstantsShared, signature: ()[Ljava/lang/Object;, mod_bits: 0 }, { method_id: 1995331702640, name: enumConstantDirectory, signature: ()Ljava/util/Map;, mod_bits: 0 }, { method_id: 1995331701960, name: cast, signature: (Ljava/lang/Object;)Ljava/lang/Object;, mod_bits: 1 }, { method_id: 1995331702648, name: cannotCastMsg, signature: (Ljava/lang/Object;)Ljava/lang/String;, mod_bits: 2 }, { method_id: 1995331703056, name: asSubclass, signature: (Ljava/lang/Class;)Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331703064, name: getAnnotation, signature: (Ljava/lang/Class;)Ljava/lang/annotation/Annotation;, mod_bits: 1 }, { method_id: 1995331702664, name: isAnnotationPresent, signature: (Ljava/lang/Class;)Z, mod_bits: 1 }, { method_id: 1995331703072, name: getAnnotationsByType, signature: (Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;, mod_bits: 1 }, { method_id: 1995331703080, name: getAnnotations, signature: ()[Ljava/lang/annotation/Annotation;, mod_bits: 1 }, { method_id: 1995331703088, name: getDeclaredAnnotation, signature: (Ljava/lang/Class;)Ljava/lang/annotation/Annotation;, mod_bits: 1 }, { method_id: 1995331703096, name: getDeclaredAnnotationsByType, signature: (Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;, mod_bits: 1 }, { method_id: 1995331703104, name: getDeclaredAnnotations, signature: ()[Ljava/lang/annotation/Annotation;, mod_bits: 1 }, { method_id: 1995331702656, name: annotationData, signature: ()Ljava/lang/Class$AnnotationData;, mod_bits: 2 }, { method_id: 1995331702672, name: createAnnotationData, signature: (I)Ljava/lang/Class$AnnotationData;, mod_bits: 2 }, { method_id: 1995331702696, name: casAnnotationType, signature: (Lsun/reflect/annotation/AnnotationType;Lsun/reflect/annotation/AnnotationType;)Z, mod_bits: 0 }, { method_id: 1995331703112, name: getAnnotationType, signature: ()Lsun/reflect/annotation/AnnotationType;, mod_bits: 0 }, { method_id: 1995331703120, name: getDeclaredAnnotationMap, signature: ()Ljava/util/Map;, mod_bits: 0 }, { method_id: 1995331703128, name: getAnnotatedSuperclass, signature: ()Ljava/lang/reflect/AnnotatedType;, mod_bits: 1 }, { method_id: 1995331703136, name: getAnnotatedInterfaces, signature: ()[Ljava/lang/reflect/AnnotatedType;, mod_bits: 1 }, { method_id: 1995331702712, name: getNestHost0, signature: ()Ljava/lang/Class;, mod_bits: 258 }, { method_id: 1995331702720, name: getNestHost, signature: ()Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331703144, name: isNestmateOf, signature: (Ljava/lang/Class;)Z, mod_bits: 1 }, { method_id: 1995331702728, name: getNestMembers0, signature: ()[Ljava/lang/Class;, mod_bits: 258 }, { method_id: 1995331703152, name: getNestMembers, signature: ()[Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331702736, name: descriptorString, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1995331701968, name: componentType, signature: ()Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331702280, name: arrayType, signature: ()Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331701992, name: describeConstable, signature: ()Ljava/util/Optional;, mod_bits: 1 }, { method_id: 1995331701944, name: isHidden, signature: ()Z, mod_bits: 257 }, { method_id: 1995331702752, name: getPermittedSubclasses, signature: ()[Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331702776, name: isDirectSubType, signature: (Ljava/lang/Class;)Z, mod_bits: 2 }, { method_id: 1995331702088, name: isSealed, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702744, name: getPermittedSubclasses0, signature: ()[Ljava/lang/Class;, mod_bits: 258 }, { method_id: 1995331703160, name: getClassFileVersion, signature: ()I, mod_bits: 0 }, { method_id: 1995331702760, name: getClassFileVersion0, signature: ()I, mod_bits: 258 }, { method_id: 1995331702216, name: getClassAccessFlagsRaw, signature: ()I, mod_bits: 2 }, { method_id: 1995331702768, name: getClassAccessFlagsRaw0, signature: ()I, mod_bits: 258 }, { method_id: 1995331702288, name: arrayType, signature: ()Ljava/lang/invoke/TypeDescriptor$OfField;, mod_bits: -268431295 }, { method_id: 1995331701976, name: componentType, signature: ()Ljava/lang/invoke/TypeDescriptor$OfField;, mod_bits: -268431295 }, { method_id: 1995331703168, name: lambda$getPermittedSubclasses$1, signature: (I)[Ljava/lang/Class;, mod_bits: -268431350 }, { method_id: 1995331703176, name: lambda$getPermittedSubclasses$0, signature: (Ljava/lang/Class;)Z, mod_bits: -268431358 }, { method_id: 1995331703184, name: lambda$methodToString$0, signature: (Ljava/lang/Class;)Ljava/lang/String;, mod_bits: -268431350 }, { method_id: 1995331701856, name: <clinit>, signature: ()V, mod_bits: 8 }]) })
ReferenceTypeMethods({ ref_type: 9 }) -> ({ declared: (169, [{ method_id: 1995331702000, name: registerNatives, signature: ()V, mod_bits: 266 }, { method_id: 1995331701984, name: runtimeSetup, signature: ()V, mod_bits: 10 }, { method_id: 1997145124504, name: <init>, signature: (Ljava/lang/ClassLoader;Ljava/lang/Class;CLjava/security/ProtectionDomain;Z)V, mod_bits: 2 }, { method_id: 1995331701904, name: toString, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1995331702784, name: toGenericString, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1995331702048, name: addSealingInfo, signature: (ILjava/lang/StringBuilder;)V, mod_bits: 2 }, { method_id: 1995331702096, name: hasSealedAncestor, signature: (Ljava/lang/Class;)Z, mod_bits: 2 }, { method_id: 1995331702792, name: typeVarBounds, signature: (Ljava/lang/reflect/TypeVariable;)Ljava/lang/String;, mod_bits: 8 }, { method_id: 1995331701872, name: forName, signature: (Ljava/lang/String;)Ljava/lang/Class;, mod_bits: 9 }, { method_id: 1995331701880, name: forName, signature: (Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Class;, mod_bits: 10 }, { method_id: 1995331701888, name: forName, signature: (Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;, mod_bits: 9 }, { method_id: 1995331701896, name: forName0, signature: (Ljava/lang/String;ZLjava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Class;, mod_bits: 266 }, { method_id: 1995331701864, name: forName, signature: (Ljava/lang/Module;Ljava/lang/String;)Ljava/lang/Class;, mod_bits: 9 }, { method_id: 1995331702800, name: forPrimitiveName, signature: (Ljava/lang/String;)Ljava/lang/Class;, mod_bits: 9 }, { method_id: 1995331702144, name: newInstance, signature: ()Ljava/lang/Object;, mod_bits: 1 }, { method_id: 1995331701936, name: isInstance, signature: (Ljava/lang/Object;)Z, mod_bits: 257 }, { method_id: 1995331701928, name: isAssignableFrom, signature: (Ljava/lang/Class;)Z, mod_bits: 257 }, { method_id: 1995331702008, name: isInterface, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702024, name: isArray, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702016, name: isPrimitive, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702056, name: isAnnotation, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702808, name: isSynthetic, signature: ()Z, mod_bits: 1 }, { method_id: 1997145124496, name: getName, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1995331702152, name: initClassName, signature: ()Ljava/lang/String;, mod_bits: 258 }, { method_id: 1995331702120, name: getClassLoader, signature: ()Ljava/lang/ClassLoader;, mod_bits: 1 }, { method_id: 1995331702816, name: getClassLoader0, signature: ()Ljava/lang/ClassLoader;, mod_bits: 0 }, { method_id: 1995331701912, name: getModule, signature: ()Ljava/lang/Module;, mod_bits: 1 }, { method_id: 1995331702824, name: getClassData, signature: ()Ljava/lang/Object;, mod_bits: 0 }, { method_id: 1995331702080, name: getTypeParameters, signature: ()[Ljava/lang/reflect/TypeVariable;, mod_bits: 1 }, { method_id: 1995331701952, name: getSuperclass, signature: ()Ljava/lang/Class;, mod_bits: 257 }, { method_id: 1995331702832, name: getGenericSuperclass, signature: ()Ljava/lang/reflect/Type;, mod_bits: 1 }, { method_id: 1995331702840, name: getPackage, signature: ()Ljava/lang/Package;, mod_bits: 1 }, { method_id: 1995331702536, name: getPackageName, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1995331702112, name: getInterfaces, signature: ()[Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331702104, name: getInterfaces, signature: (Z)[Ljava/lang/Class;, mod_bits: 2 }, { method_id: 1995331702184, name: getInterfaces0, signature: ()[Ljava/lang/Class;, mod_bits: 258 }, { method_id: 1995331702848, name: getGenericInterfaces, signature: ()[Ljava/lang/reflect/Type;, mod_bits: 1 }, { method_id: 1995331702032, name: getComponentType, signature: ()Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331702168, name: elementType, signature: ()Ljava/lang/Class;, mod_bits: 2 }, { method_id: 1995331702040, name: getModifiers, signature: ()I, mod_bits: 1 }, { method_id: 1995331702856, name: accessFlags, signature: ()Ljava/util/Set;, mod_bits: 1 }, { method_id: 1995331702864, name: getSigners, signature: ()[Ljava/lang/Object;, mod_bits: 1 }, { method_id: 1995331702872, name: setSigners, signature: ([Ljava/lang/Object;)V, mod_bits: 0 }, { method_id: 1995331702880, name: getEnclosingMethod, signature: ()Ljava/lang/reflect/Method;, mod_bits: 1 }, { method_id: 1995331702272, name: getEnclosingMethod0, signature: ()[Ljava/lang/Object;, mod_bits: 258 }, { method_id: 1995331702224, name: getEnclosingMethodInfo, signature: ()Ljava/lang/Class$EnclosingMethodInfo;, mod_bits: 2 }, { method_id: 1995331702240, name: toClass, signature: (Ljava/lang/reflect/Type;)Ljava/lang/Class;, mod_bits: 10 }, { method_id: 1995331702888, name: getEnclosingConstructor, signature: ()Ljava/lang/reflect/Constructor;, mod_bits: 1 }, { method_id: 1995331702896, name: getDeclaringClass, signature: ()Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331702304, name: getDeclaringClass0, signature: ()Ljava/lang/Class;, mod_bits: 258 }, { method_id: 1995331702248, name: getEnclosingClass, signature: ()Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331702320, name: getSimpleName, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1995331702312, name: getSimpleName0, signature: ()Ljava/lang/String;, mod_bits: 2 }, { method_id: 1995331702904, name: getTypeName, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1995331702344, name: getCanonicalName, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1995331702336, name: getCanonicalName0, signature: ()Ljava/lang/String;, mod_bits: 2 }, { method_id: 1995331702208, name: isAnonymousClass, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702200, name: isLocalClass, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702192, name: isMemberClass, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702328, name: getSimpleBinaryName, signature: ()Ljava/lang/String;, mod_bits: 2 }, { method_id: 1995331702360, name: getSimpleBinaryName0, signature: ()Ljava/lang/String;, mod_bits: 258 }, { method_id: 1995331702368, name: isTopLevelClass, signature: ()Z, mod_bits: 2 }, { method_id: 1995331702352, name: isLocalOrAnonymousClass, signature: ()Z, mod_bits: 2 }, { method_id: 1995331702376, name: hasEnclosingMethodInfo, signature: ()Z, mod_bits: 2 }, { method_id: 1995331702912, name: getClasses, signature: ()[Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331702920, name: getFields, signature: ()[Ljava/lang/reflect/Field;, mod_bits: 1 }, { method_id: 1995331702928, name: getMethods, signature: ()[Ljava/lang/reflect/Method;, mod_bits: 1 }, { method_id: 1995331702936, name: getConstructors, signature: ()[Ljava/lang/reflect/Constructor;, mod_bits: 1 }, { method_id: 1995331702944, name: getField, signature: (Ljava/lang/String;)Ljava/lang/reflect/Field;, mod_bits: 1 }, { method_id: 1995331702632, name: getMethod, signature: (Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;, mod_bits: 129 }, { method_id: 1995331702952, name: getConstructor, signature: ([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;, mod_bits: 129 }, { method_id: 1995331702384, name: getDeclaredClasses, signature: ()[Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331702960, name: getDeclaredFields, signature: ()[Ljava/lang/reflect/Field;, mod_bits: 1 }, { method_id: 1995331702968, name: getRecordComponents, signature: ()[Ljava/lang/reflect/RecordComponent;, mod_bits: 1 }, { method_id: 1995331702976, name: getDeclaredMethods, signature: ()[Ljava/lang/reflect/Method;, mod_bits: 1 }, { method_id: 1995331702984, name: getDeclaredConstructors, signature: ()[Ljava/lang/reflect/Constructor;, mod_bits: 1 }, { method_id: 1995331702992, name: getDeclaredField, signature: (Ljava/lang/String;)Ljava/lang/reflect/Field;, mod_bits: 1 }, { method_id: 1995331703000, name: getDeclaredMethod, signature: (Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;, mod_bits: 129 }, { method_id: 1995331703008, name: getDeclaredPublicMethods, signature: (Ljava/lang/String;[Ljava/lang/Class;)Ljava/util/List;, mod_bits: 128 }, { method_id: 1995331703016, name: findMethod, signature: (ZLjava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;, mod_bits: 128 }, { method_id: 1995331703024, name: getDeclaredConstructor, signature: ([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;, mod_bits: 129 }, { method_id: 1995331702520, name: getResourceAsStream, signature: (Ljava/lang/String;)Ljava/io/InputStream;, mod_bits: 1 }, { method_id: 1995331702528, name: getResource, signature: (Ljava/lang/String;)Ljava/net/URL;, mod_bits: 1 }, { method_id: 1995331702512, name: isOpenToCaller, signature: (Ljava/lang/String;Ljava/lang/Class;)Z, mod_bits: 2 }, { method_id: 1995331701920, name: getProtectionDomain, signature: ()Ljava/security/ProtectionDomain;, mod_bits: 1 }, { method_id: 1995331703032, name: getPrimitiveClass, signature: (Ljava/lang/String;)Ljava/lang/Class;, mod_bits: 264 }, { method_id: 1995331702504, name: resolveName, signature: (Ljava/lang/String;)Ljava/lang/String;, mod_bits: 2 }, { method_id: 1995331702176, name: reflectionData, signature: ()Ljava/lang/Class$ReflectionData;, mod_bits: 2 }, { method_id: 1995331702544, name: newReflectionData, signature: (Ljava/lang/ref/SoftReference;I)Ljava/lang/Class$ReflectionData;, mod_bits: 2 }, { method_id: 1995331702552, name: getGenericSignature0, signature: ()Ljava/lang/String;, mod_bits: 258 }, { method_id: 1995331702232, name: getFactory, signature: ()Lsun/reflect/generics/factory/GenericsFactory;, mod_bits: 2 }, { method_id: 1995331702160, name: getGenericInfo, signature: ()Lsun/reflect/generics/repository/ClassRepository;, mod_bits: 2 }, { method_id: 1995331702680, name: getRawAnnotations, signature: ()[B, mod_bits: 256 }, { method_id: 1995331702704, name: getRawTypeAnnotations, signature: ()[B, mod_bits: 256 }, { method_id: 1995331702560, name: getExecutableTypeAnnotationBytes, signature: (Ljava/lang/reflect/Executable;)[B, mod_bits: 8 }, { method_id: 1995331702688, name: getConstantPool, signature: ()Ljdk/internal/reflect/ConstantPool;, mod_bits: 256 }, { method_id: 1995331702464, name: privateGetDeclaredFields, signature: (Z)[Ljava/lang/reflect/Field;, mod_bits: 2 }, { method_id: 1995331702392, name: privateGetPublicFields, signature: ()[Ljava/lang/reflect/Field;, mod_bits: 2 }, { method_id: 1995331702576, name: addAll, signature: (Ljava/util/Collection;[Ljava/lang/reflect/Field;)V, mod_bits: 10 }, { method_id: 1995331702296, name: privateGetDeclaredConstructors, signature: (Z)[Ljava/lang/reflect/Constructor;, mod_bits: 2 }, { method_id: 1995331702256, name: privateGetDeclaredMethods, signature: (Z)[Ljava/lang/reflect/Method;, mod_bits: 2 }, { method_id: 1995331702408, name: privateGetPublicMethods, signature: ()[Ljava/lang/reflect/Method;, mod_bits: 2 }, { method_id: 1995331702480, name: searchFields, signature: ([Ljava/lang/reflect/Field;Ljava/lang/String;)Ljava/lang/reflect/Field;, mod_bits: 10 }, { method_id: 1995331702432, name: getField0, signature: (Ljava/lang/String;)Ljava/lang/reflect/Field;, mod_bits: 2 }, { method_id: 1995331702488, name: searchMethods, signature: ([Ljava/lang/reflect/Method;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;, mod_bits: 10 }, { method_id: 1995331702440, name: getMethod0, signature: (Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;, mod_bits: 2 }, { method_id: 1995331702496, name: getMethodsRecursive, signature: (Ljava/lang/String;[Ljava/lang/Class;ZZ)Ljava/lang/PublicMethods$MethodList;, mod_bits: 2 }, { method_id: 1995331702136, name: getConstructor0, signature: ([Ljava/lang/Class;I)Ljava/lang/reflect/Constructor;, mod_bits: 2 }, { method_id: 1995331702264, name: arrayContentsEq, signature: ([Ljava/lang/Object;[Ljava/lang/Object;)Z, mod_bits: 10 }, { method_id: 1995331702400, name: copyFields, signature: ([Ljava/lang/reflect/Field;)[Ljava/lang/reflect/Field;, mod_bits: 10 }, { method_id: 1995331702416, name: copyMethods, signature: ([Ljava/lang/reflect/Method;)[Ljava/lang/reflect/Method;, mod_bits: 10 }, { method_id: 1995331702424, name: copyConstructors, signature: ([Ljava/lang/reflect/Constructor;)[Ljava/lang/reflect/Constructor;, mod_bits: 10 }, { method_id: 1995331702568, name: getDeclaredFields0, signature: (Z)[Ljava/lang/reflect/Field;, mod_bits: 258 }, { method_id: 1995331702592, name: getDeclaredMethods0, signature: (Z)[Ljava/lang/reflect/Method;, mod_bits: 258 }, { method_id: 1995331702584, name: getDeclaredConstructors0, signature: (Z)[Ljava/lang/reflect/Constructor;, mod_bits: 258 }, { method_id: 1995331702456, name: getDeclaredClasses0, signature: ()[Ljava/lang/Class;, mod_bits: 258 }, { method_id: 1995331702472, name: getRecordComponents0, signature: ()[Ljava/lang/reflect/RecordComponent;, mod_bits: 258 }, { method_id: 1995331702616, name: isRecord0, signature: ()Z, mod_bits: 258 }, { method_id: 1995331702448, name: methodToString, signature: (Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/String;, mod_bits: 2 }, { method_id: 1995331702608, name: desiredAssertionStatus, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702600, name: desiredAssertionStatus0, signature: (Ljava/lang/Class;)Z, mod_bits: 266 }, { method_id: 1995331702064, name: isEnum, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702072, name: isRecord, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702128, name: getReflectionFactory, signature: ()Ljdk/internal/reflect/ReflectionFactory;, mod_bits: 10 }, { method_id: 1995331703040, name: resetArchivedStates, signature: ()V, mod_bits: 10 }, { method_id: 1995331703048, name: getEnumConstants, signature: ()[Ljava/lang/Object;, mod_bits: 1 }, { method_id: 1995331702624, name: getEnumConstantsShared, signature: ()[Ljava/lang/Object;, mod_bits: 0 }, { method_id: 1995331702640, name: enumConstantDirectory, signature: ()Ljava/util/Map;, mod_bits: 0 }, { method_id: 1995331701960, name: cast, signature: (Ljava/lang/Object;)Ljava/lang/Object;, mod_bits: 1 }, { method_id: 1995331702648, name: cannotCastMsg, signature: (Ljava/lang/Object;)Ljava/lang/String;, mod_bits: 2 }, { method_id: 1995331703056, name: asSubclass, signature: (Ljava/lang/Class;)Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331703064, name: getAnnotation, signature: (Ljava/lang/Class;)Ljava/lang/annotation/Annotation;, mod_bits: 1 }, { method_id: 1995331702664, name: isAnnotationPresent, signature: (Ljava/lang/Class;)Z, mod_bits: 1 }, { method_id: 1995331703072, name: getAnnotationsByType, signature: (Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;, mod_bits: 1 }, { method_id: 1995331703080, name: getAnnotations, signature: ()[Ljava/lang/annotation/Annotation;, mod_bits: 1 }, { method_id: 1995331703088, name: getDeclaredAnnotation, signature: (Ljava/lang/Class;)Ljava/lang/annotation/Annotation;, mod_bits: 1 }, { method_id: 1995331703096, name: getDeclaredAnnotationsByType, signature: (Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;, mod_bits: 1 }, { method_id: 1995331703104, name: getDeclaredAnnotations, signature: ()[Ljava/lang/annotation/Annotation;, mod_bits: 1 }, { method_id: 1995331702656, name: annotationData, signature: ()Ljava/lang/Class$AnnotationData;, mod_bits: 2 }, { method_id: 1995331702672, name: createAnnotationData, signature: (I)Ljava/lang/Class$AnnotationData;, mod_bits: 2 }, { method_id: 1995331702696, name: casAnnotationType, signature: (Lsun/reflect/annotation/AnnotationType;Lsun/reflect/annotation/AnnotationType;)Z, mod_bits: 0 }, { method_id: 1995331703112, name: getAnnotationType, signature: ()Lsun/reflect/annotation/AnnotationType;, mod_bits: 0 }, { method_id: 1995331703120, name: getDeclaredAnnotationMap, signature: ()Ljava/util/Map;, mod_bits: 0 }, { method_id: 1995331703128, name: getAnnotatedSuperclass, signature: ()Ljava/lang/reflect/AnnotatedType;, mod_bits: 1 }, { method_id: 1995331703136, name: getAnnotatedInterfaces, signature: ()[Ljava/lang/reflect/AnnotatedType;, mod_bits: 1 }, { method_id: 1995331702712, name: getNestHost0, signature: ()Ljava/lang/Class;, mod_bits: 258 }, { method_id: 1995331702720, name: getNestHost, signature: ()Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331703144, name: isNestmateOf, signature: (Ljava/lang/Class;)Z, mod_bits: 1 }, { method_id: 1995331702728, name: getNestMembers0, signature: ()[Ljava/lang/Class;, mod_bits: 258 }, { method_id: 1995331703152, name: getNestMembers, signature: ()[Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331702736, name: descriptorString, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1995331701968, name: componentType, signature: ()Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331702280, name: arrayType, signature: ()Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331701992, name: describeConstable, signature: ()Ljava/util/Optional;, mod_bits: 1 }, { method_id: 1995331701944, name: isHidden, signature: ()Z, mod_bits: 257 }, { method_id: 1995331702752, name: getPermittedSubclasses, signature: ()[Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1995331702776, name: isDirectSubType, signature: (Ljava/lang/Class;)Z, mod_bits: 2 }, { method_id: 1995331702088, name: isSealed, signature: ()Z, mod_bits: 1 }, { method_id: 1995331702744, name: getPermittedSubclasses0, signature: ()[Ljava/lang/Class;, mod_bits: 258 }, { method_id: 1995331703160, name: getClassFileVersion, signature: ()I, mod_bits: 0 }, { method_id: 1995331702760, name: getClassFileVersion0, signature: ()I, mod_bits: 258 }, { method_id: 1995331702216, name: getClassAccessFlagsRaw, signature: ()I, mod_bits: 2 }, { method_id: 1995331702768, name: getClassAccessFlagsRaw0, signature: ()I, mod_bits: 258 }, { method_id: 1995331702288, name: arrayType, signature: ()Ljava/lang/invoke/TypeDescriptor$OfField;, mod_bits: -268431295 }, { method_id: 1995331701976, name: componentType, signature: ()Ljava/lang/invoke/TypeDescriptor$OfField;, mod_bits: -268431295 }, { method_id: 1995331703168, name: lambda$getPermittedSubclasses$1, signature: (I)[Ljava/lang/Class;, mod_bits: -268431350 }, { method_id: 1995331703176, name: lambda$getPermittedSubclasses$0, signature: (Ljava/lang/Class;)Z, mod_bits: -268431358 }, { method_id: 1995331703184, name: lambda$methodToString$0, signature: (Ljava/lang/Class;)Ljava/lang/String;, mod_bits: -268431350 }, { method_id: 1995331701856, name: <clinit>, signature: ()V, mod_bits: 8 }]) })
VirtualMachineClassesBySignature({ signature: Ljava/lang/Long; }) -> ({ classes: (1, [{ ref_type_tag: 1, type_id: 10, status: 7 }]) })
ReferenceTypeMethods({ ref_type: 10 }) -> ({ declared: (63, [{ method_id: 1997155026200, name: toString, signature: (JI)Ljava/lang/String;, mod_bits: 9 }, { method_id: 1997155026472, name: toStringUTF16, signature: (JI)Ljava/lang/String;, mod_bits: 10 }, { method_id: 1997155026488, name: toUnsignedString, signature: (JI)Ljava/lang/String;, mod_bits: 9 }, { method_id: 1997155026560, name: toUnsignedBigInteger, signature: (J)Ljava/math/BigInteger;, mod_bits: 10 }, { method_id: 1997155026424, name: toHexString, signature: (J)Ljava/lang/String;, mod_bits: 9 }, { method_id: 1997155026512, name: toOctalString, signature: (J)Ljava/lang/String;, mod_bits: 9 }, { method_id: 1997155026520, name: toBinaryString, signature: (J)Ljava/lang/String;, mod_bits: 9 }, { method_id: 1997155026496, name: toUnsignedString0, signature: (JI)Ljava/lang/String;, mod_bits: 8 }, { method_id: 1997155026568, name: formatUnsignedLong0, signature: (JI[BII)V, mod_bits: 10 }, { method_id: 1997155026576, name: formatUnsignedLong0UTF16, signature: (JI[BII)V, mod_bits: 10 }, { method_id: 1997155026184, name: toString, signature: (J)Ljava/lang/String;, mod_bits: 9 }, { method_id: 1997155026480, name: toUnsignedString, signature: (J)Ljava/lang/String;, mod_bits: 9 }, { method_id: 1997155026592, name: parseLong, signature: (Ljava/lang/String;I)J, mod_bits: 9 }, { method_id: 1997155026600, name: parseLong, signature: (Ljava/lang/CharSequence;III)J, mod_bits: 9 }, { method_id: 1997155026584, name: parseLong, signature: (Ljava/lang/String;)J, mod_bits: 9 }, { method_id: 1997155026616, name: parseUnsignedLong, signature: (Ljava/lang/String;I)J, mod_bits: 9 }, { method_id: 1997155026624, name: parseUnsignedLong, signature: (Ljava/lang/CharSequence;III)J, mod_bits: 9 }, { method_id: 1997155026608, name: parseUnsignedLong, signature: (Ljava/lang/String;)J, mod_bits: 9 }, { method_id: 1997155026416, name: valueOf, signature: (Ljava/lang/String;I)Ljava/lang/Long;, mod_bits: 9 }, { method_id: 1997155026408, name: valueOf, signature: (Ljava/lang/String;)Ljava/lang/Long;, mod_bits: 9 }, { method_id: 1997155026400, name: valueOf, signature: (J)Ljava/lang/Long;, mod_bits: 9 }, { method_id: 1997155026432, name: decode, signature: (Ljava/lang/String;)Ljava/lang/Long;, mod_bits: 9 }, { method_id: 1997155026136, name: <init>, signature: (J)V, mod_bits: 1 }, { method_id: 1997155026128, name: <init>, signature: (Ljava/lang/String;)V, mod_bits: 1 }, { method_id: 1997155026352, name: byteValue, signature: ()B, mod_bits: 1 }, { method_id: 1997155026360, name: shortValue, signature: ()S, mod_bits: 1 }, { method_id: 1997155026368, name: intValue, signature: ()I, mod_bits: 1 }, { method_id: 1997155026376, name: longValue, signature: ()J, mod_bits: 1 }, { method_id: 1997155026384, name: floatValue, signature: ()F, mod_bits: 1 }, { method_id: 1997155026392, name: doubleValue, signature: ()D, mod_bits: 1 }, { method_id: 1997155026192, name: toString, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1997155026216, name: hashCode, signature: ()I, mod_bits: 1 }, { method_id: 1997155026208, name: hashCode, signature: (J)I, mod_bits: 9 }, { method_id: 1997155026176, name: equals, signature: (Ljava/lang/Object;)Z, mod_bits: 1 }, { method_id: 1997155026328, name: getLong, signature: (Ljava/lang/String;)Ljava/lang/Long;, mod_bits: 9 }, { method_id: 1997155026336, name: getLong, signature: (Ljava/lang/String;J)Ljava/lang/Long;, mod_bits: 9 }, { method_id: 1997155026320, name: getLong, signature: (Ljava/lang/String;Ljava/lang/Long;)Ljava/lang/Long;, mod_bits: 9 }, { method_id: 1997155026312, name: compareTo, signature: (Ljava/lang/Long;)I, mod_bits: 1 }, { method_id: 1997155026344, name: compare, signature: (JJ)I, mod_bits: 9 }, { method_id: 1997155026256, name: compareUnsigned, signature: (JJ)I, mod_bits: 9 }, { method_id: 1997155026264, name: divideUnsigned, signature: (JJ)J, mod_bits: 9 }, { method_id: 1997155026272, name: remainderUnsigned, signature: (JJ)J, mod_bits: 9 }, { method_id: 1997155026528, name: highestOneBit, signature: (J)J, mod_bits: 9 }, { method_id: 1997155026536, name: lowestOneBit, signature: (J)J, mod_bits: 9 }, { method_id: 1997155026152, name: numberOfLeadingZeros, signature: (J)I, mod_bits: 9 }, { method_id: 1997155026160, name: numberOfTrailingZeros, signature: (J)I, mod_bits: 9 }, { method_id: 1997155026168, name: bitCount, signature: (J)I, mod_bits: 9 }, { method_id: 1997155026544, name: rotateLeft, signature: (JI)J, mod_bits: 9 }, { method_id: 1997155026552, name: rotateRight, signature: (JI)J, mod_bits: 9 }, { method_id: 1997155026280, name: reverse, signature: (J)J, mod_bits: 9 }, { method_id: 1997155026296, name: compress, signature: (JJ)J, mod_bits: 9 }, { method_id: 1997155026248, name: expand, signature: (JJ)J, mod_bits: 9 }, { method_id: 1997155026504, name: parallelSuffix, signature: (J)J, mod_bits: 10 }, { method_id: 1997155026240, name: signum, signature: (J)I, mod_bits: 9 }, { method_id: 1997155026288, name: reverseBytes, signature: (J)J, mod_bits: 9 }, { method_id: 1997155026464, name: sum, signature: (JJ)J, mod_bits: 9 }, { method_id: 1997155026232, name: max, signature: (JJ)J, mod_bits: 9 }, { method_id: 1997155026224, name: min, signature: (JJ)J, mod_bits: 9 }, { method_id: 1997155026456, name: describeConstable, signature: ()Ljava/util/Optional;, mod_bits: 1 }, { method_id: 1997155026448, name: resolveConstantDesc, signature: (Ljava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/Long;, mod_bits: 1 }, { method_id: 1997155026304, name: compareTo, signature: (Ljava/lang/Object;)I, mod_bits: -268431295 }, { method_id: 1997155026440, name: resolveConstantDesc, signature: (Ljava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/Object;, mod_bits: -268431295 }, { method_id: 1997155026144, name: <clinit>, signature: ()V, mod_bits: 8 }]) })
ReferenceTypeFields({ ref_type: 10 }) -> ({ declared: (7, [{ field_id: 1997155455344, name: MIN_VALUE, signature: J, mod_bits: 25 }, { field_id: 1997155455472, name: MAX_VALUE, signature: J, mod_bits: 25 }, { field_id: 1997155455504, name: TYPE, signature: Ljava/lang/Class;, mod_bits: 25 }, { field_id: 66, name: value, signature: J, mod_bits: 18 }, { field_id: 1997155455568, name: SIZE, signature: I, mod_bits: 25 }, { field_id: 1997155455600, name: BYTES, signature: I, mod_bits: 25 }, { field_id: 1997155837968, name: serialVersionUID, signature: J, mod_bits: 26 }]) })
ReferenceTypeGetValues({ ref_type: 10, fields: (1, [{ field_id: 1997155455504 }]) }) -> ({ values: (1, [{ value: ClassObject(11) }]) })
VirtualMachineCreateString({ utf: java.math.BigInteger }) -> ({ string_object: 12 })
ClassTypeInvokeMethod({ clazz: 9, thread: 1, method_id: 1995331701872, arguments: (1, [{ arg: Object(12) }]), options: 0 }) -> ({ return_value: ClassObject(13), exception: { tag: 76, id: 0 } })
VirtualMachineCreateString({ utf: valueOf }) -> ({ string_object: 14 })
VirtualMachineClassesBySignature({ signature: [Ljava/lang/Class; }) -> ({ classes: (1, [{ ref_type_tag: 3, type_id: 15, status: 0 }]) })
ArrayTypeNewInstance({ arr_type: 15, length: 1 }) -> ({ new_array: { tag: 91, method_id: 16 } })
ArrayReferenceSetValues({ array_object: 16, first_index: 0, values: (1, [{ value: ClassObject(11) }]) }) -> 
ObjectReferenceInvokeMethod({ object: 13, thread: 1, clazz: 9, method_id: 1995331702632, arguments: (2, [{ arg: String(14) }, { arg: Array(16) }]), options: 0 }) -> ({ return_value: Object(17), exception: { tag: 76, id: 0 } })
VirtualMachineCreateString({ utf: add }) -> ({ string_object: 18 })
VirtualMachineClassesBySignature({ signature: [Ljava/lang/Class; }) -> ({ classes: (1, [{ ref_type_tag: 3, type_id: 15, status: 0 }]) })
ArrayTypeNewInstance({ arr_type: 15, length: 1 }) -> ({ new_array: { tag: 91, method_id: 19 } })
ArrayReferenceSetValues({ array_object: 19, first_index: 0, values: (1, [{ value: ClassObject(13) }]) }) -> 
ObjectReferenceInvokeMethod({ object: 13, thread: 1, clazz: 9, method_id: 1995331702632, arguments: (2, [{ arg: String(18) }, { arg: Array(19) }]), options: 0 }) -> ({ return_value: Object(20), exception: { tag: 76, id: 0 } })
VirtualMachineCreateString({ utf: subtract }) -> ({ string_object: 21 })
VirtualMachineClassesBySignature({ signature: [Ljava/lang/Class; }) -> ({ classes: (1, [{ ref_type_tag: 3, type_id: 15, status: 0 }]) })
ArrayTypeNewInstance({ arr_type: 15, length: 1 }) -> ({ new_array: { tag: 91, method_id: 22 } })
ArrayReferenceSetValues({ array_object: 22, first_index: 0, values: (1, [{ value: ClassObject(13) }]) }) -> 
ObjectReferenceInvokeMethod({ object: 13, thread: 1, clazz: 9, method_id: 1995331702632, arguments: (2, [{ arg: String(21) }, { arg: Array(22) }]), options: 0 }) -> ({ return_value: Object(23), exception: { tag: 76, id: 0 } })
VirtualMachineCreateString({ utf: multiply }) -> ({ string_object: 24 })
VirtualMachineClassesBySignature({ signature: [Ljava/lang/Class; }) -> ({ classes: (1, [{ ref_type_tag: 3, type_id: 15, status: 0 }]) })
ArrayTypeNewInstance({ arr_type: 15, length: 1 }) -> ({ new_array: { tag: 91, method_id: 25 } })
ArrayReferenceSetValues({ array_object: 25, first_index: 0, values: (1, [{ value: ClassObject(13) }]) }) -> 
ObjectReferenceInvokeMethod({ object: 13, thread: 1, clazz: 9, method_id: 1995331702632, arguments: (2, [{ arg: String(24) }, { arg: Array(25) }]), options: 0 }) -> ({ return_value: Object(26), exception: { tag: 76, id: 0 } })
VirtualMachineCreateString({ utf: divide }) -> ({ string_object: 27 })
VirtualMachineClassesBySignature({ signature: [Ljava/lang/Class; }) -> ({ classes: (1, [{ ref_type_tag: 3, type_id: 15, status: 0 }]) })
ArrayTypeNewInstance({ arr_type: 15, length: 1 }) -> ({ new_array: { tag: 91, method_id: 28 } })
ArrayReferenceSetValues({ array_object: 28, first_index: 0, values: (1, [{ value: ClassObject(13) }]) }) -> 
ObjectReferenceInvokeMethod({ object: 13, thread: 1, clazz: 9, method_id: 1995331702632, arguments: (2, [{ arg: String(27) }, { arg: Array(28) }]), options: 0 }) -> ({ return_value: Object(29), exception: { tag: 76, id: 0 } })
VirtualMachineCreateString({ utf: toString }) -> ({ string_object: 30 })
ObjectReferenceInvokeMethod({ object: 13, thread: 1, clazz: 9, method_id: 1995331702632, arguments: (2, [{ arg: String(30) }, { arg: Array(0) }]), options: 0 }) -> ({ return_value: Object(31), exception: { tag: 76, id: 0 } })
VirtualMachineClassesBySignature({ signature: Ljava/lang/reflect/Method; }) -> ({ classes: (1, [{ ref_type_tag: 1, type_id: 32, status: 7 }]) })
ReferenceTypeMethods({ ref_type: 32 }) -> ({ declared: (49, [{ method_id: 1997156080552, name: getGenericSignature, signature: ()Ljava/lang/String;, mod_bits: 2 }, { method_id: 1997156080456, name: getFactory, signature: ()Lsun/reflect/generics/factory/GenericsFactory;, mod_bits: 2 }, { method_id: 1997156080440, name: getGenericInfo, signature: ()Lsun/reflect/generics/repository/MethodRepository;, mod_bits: 0 }, { method_id: 1997156080376, name: <init>, signature: (Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;Ljava/lang/Class;[Ljava/lang/Class;IILjava/lang/String;[B[B[B)V, mod_bits: 0 }, { method_id: 1997156080408, name: copy, signature: ()Ljava/lang/reflect/Method;, mod_bits: 0 }, { method_id: 1997156080432, name: setAccessible, signature: (Z)V, mod_bits: 1 }, { method_id: 1997156080520, name: checkCanSetAccessible, signature: (Ljava/lang/Class;)V, mod_bits: 0 }, { method_id: 1997156080544, name: getRoot, signature: ()Ljava/lang/reflect/Method;, mod_bits: 0 }, { method_id: 1997156080664, name: hasGenericInformation, signature: ()Z, mod_bits: 0 }, { method_id: 1997156080672, name: getAnnotationBytes, signature: ()[B, mod_bits: 0 }, { method_id: 1997156080496, name: getDeclaringClass, signature: ()Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1997156080368, name: getName, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1997156080416, name: getModifiers, signature: ()I, mod_bits: 1 }, { method_id: 1997156080424, name: getTypeParameters, signature: ()[Ljava/lang/reflect/TypeVariable;, mod_bits: 1 }, { method_id: 1997156080464, name: getReturnType, signature: ()Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1997156080624, name: getGenericReturnType, signature: ()Ljava/lang/reflect/Type;, mod_bits: 1 }, { method_id: 1997156080568, name: getSharedParameterTypes, signature: ()[Ljava/lang/Class;, mod_bits: 0 }, { method_id: 1997156080680, name: getSharedExceptionTypes, signature: ()[Ljava/lang/Class;, mod_bits: 0 }, { method_id: 1997156080472, name: getParameterTypes, signature: ()[Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1997156080576, name: getParameterCount, signature: ()I, mod_bits: 1 }, { method_id: 1997156080592, name: getGenericParameterTypes, signature: ()[Ljava/lang/reflect/Type;, mod_bits: 1 }, { method_id: 1997156080688, name: getExceptionTypes, signature: ()[Ljava/lang/Class;, mod_bits: 1 }, { method_id: 1997156080600, name: getGenericExceptionTypes, signature: ()[Ljava/lang/reflect/Type;, mod_bits: 1 }, { method_id: 1997156080384, name: equals, signature: (Ljava/lang/Object;)Z, mod_bits: 1 }, { method_id: 1997156080400, name: hashCode, signature: ()I, mod_bits: 1 }, { method_id: 1997156080392, name: toString, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1997156080696, name: specificToStringHeader, signature: (Ljava/lang/StringBuilder;)V, mod_bits: 0 }, { method_id: 1997156080528, name: toShortString, signature: ()Ljava/lang/String;, mod_bits: 0 }, { method_id: 1997156080616, name: toShortSignature, signature: ()Ljava/lang/String;, mod_bits: 0 }, { method_id: 1997156080480, name: toGenericString, signature: ()Ljava/lang/String;, mod_bits: 1 }, { method_id: 1997156080704, name: specificToGenericStringHeader, signature: (Ljava/lang/StringBuilder;)V, mod_bits: 0 }, { method_id: 1997156080352, name: invoke, signature: (Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;, mod_bits: 129 }, { method_id: 1997156080360, name: invoke, signature: (Ljava/lang/Object;[Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;, mod_bits: 2 }, { method_id: 1997156080632, name: isCallerSensitive, signature: ()Z, mod_bits: 2 }, { method_id: 1997156080712, name: isBridge, signature: ()Z, mod_bits: 1 }, { method_id: 1997156080560, name: isVarArgs, signature: ()Z, mod_bits: 1 }, { method_id: 1997156080488, name: isSynthetic, signature: ()Z, mod_bits: 1 }, { method_id: 1997156080608, name: isDefault, signature: ()Z, mod_bits: 1 }, { method_id: 1997156080640, name: acquireMethodAccessor, signature: ()Ljdk/internal/reflect/MethodAccessor;, mod_bits: 2 }, { method_id: 1997156080648, name: getMethodAccessor, signature: ()Ljdk/internal/reflect/MethodAccessor;, mod_bits: 0 }, { method_id: 1997156080656, name: setMethodAccessor, signature: (Ljdk/internal/reflect/MethodAccessor;)V, mod_bits: 0 }, { method_id: 1997156080720, name: getDefaultValue, signature: ()Ljava/lang/Object;, mod_bits: 1 }, { method_id: 1997156080504, name: getAnnotation, signature: (Ljava/lang/Class;)Ljava/lang/annotation/Annotation;, mod_bits: 1 }, { method_id: 1997156080512, name: getDeclaredAnnotations, signature: ()[Ljava/lang/annotation/Annotation;, mod_bits: 1 }, { method_id: 1997156080584, name: getParameterAnnotations, signature: ()[[Ljava/lang/annotation/Annotation;, mod_bits: 1 }, { method_id: 1997156080728, name: getAnnotatedReturnType, signature: ()Ljava/lang/reflect/AnnotatedType;, mod_bits: 1 }, { method_id: 1997156080736, name: handleParameterNumberMismatch, signature: (I[Ljava/lang/Class;)Z, mod_bits: 0 }, { method_id: 1997156080448, name: getGenericInfo, signature: ()Lsun/reflect/generics/repository/ConstructorRepository;, mod_bits: -268431296 }, { method_id: 1997156080536, name: getRoot, signature: ()Ljava/lang/reflect/AccessibleObject;, mod_bits: -268431296 }]) })
ClassTypeInvokeMethod({ clazz: 10, thread: 1, method_id: 1997155026400, arguments: (1, [{ arg: Long(10) }]), options: 0 }) -> ({ return_value: Object(33), exception: { tag: 76, id: 0 } })
VirtualMachineClassesBySignature({ signature: [Ljava/lang/Object; }) -> ({ classes: (1, [{ ref_type_tag: 3, type_id: 34, status: 0 }]) })
ArrayTypeNewInstance({ arr_type: 34, length: 1 }) -> ({ new_array: { tag: 91, method_id: 35 } })
ArrayReferenceSetValues({ array_object: 35, first_index: 0, values: (1, [{ value: Object(33) }]) }) -> 
ObjectReferenceInvokeMethod({ object: 17, thread: 1, clazz: 32, method_id: 1997156080352, arguments: (2, [{ arg: Object(0) }, { arg: Array(35) }]), options: 0 }) -> ({ return_value: Object(36), exception: { tag: 76, id: 0 } })
ClassTypeInvokeMethod({ clazz: 10, thread: 1, method_id: 1997155026400, arguments: (1, [{ arg: Long(20) }]), options: 0 }) -> ({ return_value: Object(37), exception: { tag: 76, id: 0 } })
VirtualMachineClassesBySignature({ signature: [Ljava/lang/Object; }) -> ({ classes: (1, [{ ref_type_tag: 3, type_id: 34, status: 0 }]) })
ArrayTypeNewInstance({ arr_type: 34, length: 1 }) -> ({ new_array: { tag: 91, method_id: 38 } })
ArrayReferenceSetValues({ array_object: 38, first_index: 0, values: (1, [{ value: Object(37) }]) }) -> 
ObjectReferenceInvokeMethod({ object: 17, thread: 1, clazz: 32, method_id: 1997156080352, arguments: (2, [{ arg: Object(0) }, { arg: Array(38) }]), options: 0 }) -> ({ return_value: Object(39), exception: { tag: 76, id: 0 } })
VirtualMachineClassesBySignature({ signature: [Ljava/lang/Object; }) -> ({ classes: (1, [{ ref_type_tag: 3, type_id: 34, status: 0 }]) })
ArrayTypeNewInstance({ arr_type: 34, length: 1 }) -> ({ new_array: { tag: 91, method_id: 40 } })
ArrayReferenceSetValues({ array_object: 40, first_index: 0, values: (1, [{ value: Object(39) }]) }) -> 
ObjectReferenceInvokeMethod({ object: 20, thread: 1, clazz: 32, method_id: 1997156080352, arguments: (2, [{ arg: Object(36) }, { arg: Array(40) }]), options: 0 }) -> ({ return_value: Object(41), exception: { tag: 76, id: 0 } })
ObjectReferenceInvokeMethod({ object: 31, thread: 1, clazz: 32, method_id: 1997156080352, arguments: (2, [{ arg: Object(41) }, { arg: Array(0) }]), options: 0 }) -> ({ return_value: String(42), exception: { tag: 76, id: 0 } })
StringReferenceValue({ string_object: 42 }) -> ({ string_value: 30 })

なお、各パケットの詳細な定義はこちらです↓
https://docs.oracle.com/en/java/javase/25/docs/specs/jdwp/jdwp-protocol.html

重要なことに、jcalcは電卓の計算は全く行いません。

(これはJVMに計算を移譲する電卓が作れるか?という実験的試みでした。結果は成功でかなりいい気分です。)

おわりに

今回は電卓のようなかわいい使い方ですが、JDWPでは任意のメソッドが呼び出し可能なので、悪用は厳禁です。また、公開サーバーでデバッグ用ポートを開けることは絶対にやめましょう。

Discussion