diff --git a/pkgs/jni/lib/src/jarray.dart b/pkgs/jni/lib/src/jarray.dart
index 92f05b4..8b0aead 100644
--- a/pkgs/jni/lib/src/jarray.dart
+++ b/pkgs/jni/lib/src/jarray.dart
@@ -16,6 +16,22 @@
 
   @override
   JArray<T> fromRef(Pointer<Void> ref) => JArray.fromRef(elementType, ref);
+
+  @override
+  JObjType get superType => const JObjectType();
+
+  @override
+  final int superCount = 1;
+
+  @override
+  int get hashCode => Object.hash(JArrayType, elementType);
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == JArrayType &&
+        other is JArrayType &&
+        elementType == other.elementType;
+  }
 }
 
 class JArray<E> extends JObject {
diff --git a/pkgs/jni/lib/src/jobject.dart b/pkgs/jni/lib/src/jobject.dart
index 7477c55..dff8fda 100644
--- a/pkgs/jni/lib/src/jobject.dart
+++ b/pkgs/jni/lib/src/jobject.dart
@@ -12,15 +12,33 @@
 
   @override
   JObject fromRef(Pointer<Void> ref) => JObject.fromRef(ref);
+
+  @override
+  JObjType get superType => const JObjectType();
+
+  // TODO(#70): Once interface implementation lands, other than [superType],
+  // we should have a list of implemented interfaces.
+
+  @override
+  final int superCount = 0;
+
+  @override
+  int get hashCode => (JObjectType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == JObjectType && other is JObjectType;
+  }
 }
 
 Pointer<T> _getID<T extends NativeType>(
-    JniPointerResult Function(
-            Pointer<Void> ptr, Pointer<Char> name, Pointer<Char> sig)
-        f,
-    Pointer<Void> ptr,
-    String name,
-    String sig) {
+  JniPointerResult Function(
+          Pointer<Void> ptr, Pointer<Char> name, Pointer<Char> sig)
+      f,
+  Pointer<Void> ptr,
+  String name,
+  String sig,
+) {
   final result = using(
       (arena) => f(ptr, name.toNativeChars(arena), sig.toNativeChars(arena)));
   if (result.exception != nullptr) {
diff --git a/pkgs/jni/lib/src/jstring.dart b/pkgs/jni/lib/src/jstring.dart
index 5746e23..9d02df9 100644
--- a/pkgs/jni/lib/src/jstring.dart
+++ b/pkgs/jni/lib/src/jstring.dart
@@ -12,6 +12,20 @@
 
   @override
   JString fromRef(Pointer<Void> ref) => JString.fromRef(ref);
+
+  @override
+  JObjType get superType => const JObjectType();
+
+  @override
+  final int superCount = 1;
+
+  @override
+  int get hashCode => (JStringType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == JStringType && other is JStringType;
+  }
 }
 
 class JString extends JObject {
diff --git a/pkgs/jni/lib/src/types.dart b/pkgs/jni/lib/src/types.dart
index 07102e8..9c0cb49 100644
--- a/pkgs/jni/lib/src/types.dart
+++ b/pkgs/jni/lib/src/types.dart
@@ -34,6 +34,11 @@
 }
 
 abstract class JObjType<T extends JObject> extends JType<T> {
+  /// Number of super types. Distance to the root type.
+  int get superCount;
+
+  JObjType get superType;
+
   const JObjType();
 
   @override
@@ -49,3 +54,22 @@
     return Jni.findJniClass(signature);
   }
 }
+
+/// Lowest common ancestor of two types in the inheritance tree.
+JObjType _lowestCommonAncestor(JObjType a, JObjType b) {
+  while (a.superCount > b.superCount) {
+    a = a.superType;
+  }
+  while (b.superCount > a.superCount) {
+    b = b.superType;
+  }
+  while (a != b) {
+    a = a.superType;
+    b = b.superType;
+  }
+  return a;
+}
+
+JObjType lowestCommonSuperType(List<JObjType> types) {
+  return types.reduce(_lowestCommonAncestor);
+}
diff --git a/pkgs/jni/test/type_test.dart b/pkgs/jni/test/type_test.dart
new file mode 100644
index 0000000..0f7f5bf
--- /dev/null
+++ b/pkgs/jni/test/type_test.dart
@@ -0,0 +1,244 @@
+// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:jni/jni.dart';
+import 'package:test/test.dart';
+
+// Mocking this type tree:
+//   JObject
+//      |  \
+//      A   B
+//     / \   \
+//    C   D   E
+//   /
+//  F
+
+class A extends JObject {
+  A.fromRef(super.reference) : super.fromRef();
+  @override
+  JObjType<JObject> get $type => $AType();
+}
+
+class $AType extends JObjType<A> {
+  @override
+  A fromRef(Pointer<Void> ref) {
+    return A.fromRef(ref);
+  }
+
+  @override
+  String get signature => 'A';
+
+  @override
+  int get superCount => superType.superCount + 1;
+
+  @override
+  JObjType<JObject> get superType => JObject.type;
+
+  @override
+  int get hashCode => ($AType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $AType && other is $AType;
+  }
+}
+
+class B extends JObject {
+  B.fromRef(super.reference) : super.fromRef();
+  @override
+  JObjType<JObject> get $type => $BType();
+}
+
+class $BType extends JObjType<B> {
+  @override
+  B fromRef(Pointer<Void> ref) {
+    return B.fromRef(ref);
+  }
+
+  @override
+  String get signature => 'B';
+
+  @override
+  int get superCount => superType.superCount + 1;
+
+  @override
+  JObjType<JObject> get superType => JObject.type;
+
+  @override
+  int get hashCode => ($BType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $BType && other is $BType;
+  }
+}
+
+class C extends A {
+  C.fromRef(super.reference) : super.fromRef();
+
+  @override
+  JObjType<JObject> get $type => $CType();
+}
+
+class $CType extends JObjType<C> {
+  @override
+  C fromRef(Pointer<Void> ref) {
+    return C.fromRef(ref);
+  }
+
+  @override
+  String get signature => 'C';
+
+  @override
+  int get superCount => superType.superCount + 1;
+
+  @override
+  JObjType<JObject> get superType => $AType();
+
+  @override
+  int get hashCode => ($CType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $CType && other is $CType;
+  }
+}
+
+class D extends A {
+  D.fromRef(super.reference) : super.fromRef();
+
+  @override
+  JObjType<JObject> get $type => $DType();
+}
+
+class $DType extends JObjType<D> {
+  @override
+  D fromRef(Pointer<Void> ref) {
+    return D.fromRef(ref);
+  }
+
+  @override
+  String get signature => 'D';
+
+  @override
+  int get superCount => superType.superCount + 1;
+
+  @override
+  JObjType<JObject> get superType => $AType();
+
+  @override
+  int get hashCode => ($DType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $DType && other is $DType;
+  }
+}
+
+class E extends B {
+  E.fromRef(super.reference) : super.fromRef();
+
+  @override
+  JObjType<JObject> get $type => $EType();
+}
+
+class $EType extends JObjType<E> {
+  @override
+  E fromRef(Pointer<Void> ref) {
+    return E.fromRef(ref);
+  }
+
+  @override
+  String get signature => 'E';
+
+  @override
+  int get superCount => superType.superCount + 1;
+
+  @override
+  JObjType<JObject> get superType => $BType();
+
+  @override
+  int get hashCode => ($EType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $EType && other is $EType;
+  }
+}
+
+class F extends C {
+  F.fromRef(super.reference) : super.fromRef();
+
+  @override
+  JObjType<JObject> get $type => $FType();
+}
+
+class $FType extends JObjType<F> {
+  @override
+  F fromRef(Pointer<Void> ref) {
+    return F.fromRef(ref);
+  }
+
+  @override
+  String get signature => 'F';
+
+  @override
+  int get superCount => superType.superCount + 1;
+
+  @override
+  JObjType<JObject> get superType => $CType();
+
+  @override
+  int get hashCode => ($FType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $FType && other is $FType;
+  }
+}
+
+void main() {
+  if (!Platform.isAndroid) {
+    try {
+      Jni.spawn(dylibDir: "build/jni_libs", jvmOptions: ["-Xmx128m"]);
+    } on JvmExistsException catch (_) {
+      // TODO(#51): Support destroying and reinstantiating JVM.
+    }
+  }
+
+  test('lowestCommonSuperType', () {
+    expect(lowestCommonSuperType([JObject.type]), JObject.type);
+    expect(lowestCommonSuperType([JString.type]), JString.type);
+    expect(lowestCommonSuperType([JObject.type, JObject.type]), JObject.type);
+    expect(lowestCommonSuperType([JString.type, JString.type]), JString.type);
+    expect(lowestCommonSuperType([JString.type, JArray.type(JLong.type)]),
+        JObject.type);
+  });
+
+  test('Mocked type tree', () {
+    // As a reminder, this is how the type tree looks like:
+    //   JObject
+    //      |  \
+    //      A   B
+    //     / \   \
+    //    C   D   E
+    //   /
+    //  F
+    expect(lowestCommonSuperType([$AType(), $BType()]), const JObjectType());
+    expect(lowestCommonSuperType([$CType(), $BType()]), const JObjectType());
+    expect(lowestCommonSuperType([$FType(), $BType()]), const JObjectType());
+    expect(lowestCommonSuperType([$EType(), $CType(), $FType()]),
+        const JObjectType());
+
+    expect(lowestCommonSuperType([$CType(), $DType()]), $AType());
+    expect(lowestCommonSuperType([$FType(), $DType()]), $AType());
+    expect(lowestCommonSuperType([$FType(), $CType(), $DType()]), $AType());
+
+    expect(lowestCommonSuperType([$EType(), $BType()]), $BType());
+    expect(lowestCommonSuperType([$BType(), $BType()]), $BType());
+  });
+}
diff --git a/pkgs/jnigen/CHANGELOG.md b/pkgs/jnigen/CHANGELOG.md
index d47aa13..1516220 100644
--- a/pkgs/jnigen/CHANGELOG.md
+++ b/pkgs/jnigen/CHANGELOG.md
@@ -1,3 +1,10 @@
+## 0.4.0-dev
+* **Breaking Change** ([#145](https://github.com/dart-lang/jnigen/issues/145)): Type arguments are now named instead of positional.
+* Type parameters can now be inferred when possible.
+* Fixed a bug where passing a `long` argument truncated it to `int` in pure dart bindings.
+* Removed array extensions from the generated code.
+* Added the ability to use source dependencies from Gradle.
+
 ## 0.3.0
 * Added the option to convert Kotlin `suspend fun` to Dart async methods. Add `suspend_fun_to_async: true` to `jnigen.yaml`.
 
diff --git a/pkgs/jnigen/example/in_app_java/lib/android_utils.dart b/pkgs/jnigen/example/in_app_java/lib/android_utils.dart
index 3faba5b..5925b92 100644
--- a/pkgs/jnigen/example/in_app_java/lib/android_utils.dart
+++ b/pkgs/jnigen/example/in_app_java/lib/android_utils.dart
@@ -26,9 +26,8 @@
 
 /// from: com.example.in_app_java.AndroidUtils
 class AndroidUtils extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   AndroidUtils.fromRef(
     jni.JObjectPtr ref,
@@ -46,8 +45,12 @@
 
   /// from: static public void showToast(android.app.Activity mainActivity, java.lang.CharSequence text, int duration)
   static void showToast(
-          jni.JObject mainActivity, jni.JObject text, int duration) =>
-      _showToast(mainActivity.reference, text.reference, duration).check();
+    jni.JObject mainActivity,
+    jni.JObject text,
+    int duration,
+  ) {
+    return _showToast(mainActivity.reference, text.reference, duration).check();
+  }
 }
 
 class $AndroidUtilsType extends jni.JObjType<AndroidUtils> {
@@ -58,6 +61,20 @@
 
   @override
   AndroidUtils fromRef(jni.JObjectPtr ref) => AndroidUtils.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($AndroidUtilsType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $AndroidUtilsType && other is $AndroidUtilsType;
+  }
 }
 
 /// from: androidx.emoji2.text.EmojiCompat
@@ -110,9 +127,8 @@
 /// loading completes use InitCallback.
 /// <p/>
 class EmojiCompat extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   EmojiCompat.fromRef(
     jni.JObjectPtr ref,
@@ -328,8 +344,11 @@
   /// afterwords.
   ///
   ///@return Default EmojiCompat for this device, or null if there is no provider on the system.
-  static EmojiCompat init(jni.JObject context) =>
-      const $EmojiCompatType().fromRef(_init(context.reference).object);
+  static EmojiCompat init(
+    jni.JObject context,
+  ) {
+    return const $EmojiCompatType().fromRef(_init(context.reference).object);
+  }
 
   static final _init1 = jniLookup<
           ffi.NativeFunction<
@@ -344,11 +363,12 @@
   ///
   /// @hide
   static EmojiCompat init1(
-          jni.JObject context,
-          DefaultEmojiCompatConfig_DefaultEmojiCompatConfigFactory
-              defaultFactory) =>
-      const $EmojiCompatType()
-          .fromRef(_init1(context.reference, defaultFactory.reference).object);
+    jni.JObject context,
+    DefaultEmojiCompatConfig_DefaultEmojiCompatConfigFactory defaultFactory,
+  ) {
+    return const $EmojiCompatType()
+        .fromRef(_init1(context.reference, defaultFactory.reference).object);
+  }
 
   static final _init2 = jniLookup<
           ffi.NativeFunction<
@@ -365,8 +385,11 @@
   /// the singleton instance and any call after that will not create a new instance and return
   /// immediately.
   ///@see EmojiCompat.Config
-  static EmojiCompat init2(EmojiCompat_Config config) =>
-      const $EmojiCompatType().fromRef(_init2(config.reference).object);
+  static EmojiCompat init2(
+    EmojiCompat_Config config,
+  ) {
+    return const $EmojiCompatType().fromRef(_init2(config.reference).object);
+  }
 
   static final _isConfigured =
       jniLookup<ffi.NativeFunction<jni.JniResult Function()>>(
@@ -384,7 +407,9 @@
   /// This function does not check the \#getLoadState() and will return true even if the
   /// font is still loading, or has failed to load.
   ///@return true if EmojiCompat has been successfully initialized.
-  static bool isConfigured() => _isConfigured().boolean;
+  static bool isConfigured() {
+    return _isConfigured().boolean;
+  }
 
   static final _reset = jniLookup<
           ffi.NativeFunction<
@@ -398,8 +423,11 @@
   /// Used by the tests to reset EmojiCompat with a new configuration. Every time it is called a
   /// new instance is created with the new configuration.
   ///@hide
-  static EmojiCompat reset(EmojiCompat_Config config) =>
-      const $EmojiCompatType().fromRef(_reset(config.reference).object);
+  static EmojiCompat reset(
+    EmojiCompat_Config config,
+  ) {
+    return const $EmojiCompatType().fromRef(_reset(config.reference).object);
+  }
 
   static final _reset1 = jniLookup<
           ffi.NativeFunction<
@@ -412,8 +440,12 @@
   ///
   /// Used by the tests to reset EmojiCompat with a new singleton instance.
   ///@hide
-  static EmojiCompat reset1(EmojiCompat emojiCompat) =>
-      const $EmojiCompatType().fromRef(_reset1(emojiCompat.reference).object);
+  static EmojiCompat reset1(
+    EmojiCompat emojiCompat,
+  ) {
+    return const $EmojiCompatType()
+        .fromRef(_reset1(emojiCompat.reference).object);
+  }
 
   static final _skipDefaultConfigurationLookup =
       jniLookup<ffi.NativeFunction<jni.JniResult Function(ffi.Uint8)>>(
@@ -424,8 +456,11 @@
   ///
   /// Reset default configuration lookup flag, for tests.
   ///@hide
-  static void skipDefaultConfigurationLookup(bool shouldSkip) =>
-      _skipDefaultConfigurationLookup(shouldSkip ? 1 : 0).check();
+  static void skipDefaultConfigurationLookup(
+    bool shouldSkip,
+  ) {
+    return _skipDefaultConfigurationLookup(shouldSkip ? 1 : 0).check();
+  }
 
   static final _get0 = jniLookup<ffi.NativeFunction<jni.JniResult Function()>>(
           "EmojiCompat__get0")
@@ -438,7 +473,9 @@
   /// \#init(EmojiCompat.Config) is called to initialize the singleton instance.
   ///@return EmojiCompat instance
   ///@throws IllegalStateException if called before \#init(EmojiCompat.Config)
-  static EmojiCompat get0() => const $EmojiCompatType().fromRef(_get0().object);
+  static EmojiCompat get0() {
+    return const $EmojiCompatType().fromRef(_get0().object);
+  }
 
   static final _load = jniLookup<
           ffi.NativeFunction<
@@ -461,7 +498,9 @@
   /// </ul>
   ///@throws IllegalStateException when Config\#setMetadataLoadStrategy(int) is not set
   /// to \#LOAD_STRATEGY_MANUAL
-  void load() => _load(reference).check();
+  void load() {
+    return _load(reference).check();
+  }
 
   static final _registerInitCallback = jniLookup<
           ffi.NativeFunction<
@@ -482,8 +521,11 @@
   /// called.
   ///@param initCallback the initialization callback to register, cannot be {@code null}
   ///@see \#unregisterInitCallback(InitCallback)
-  void registerInitCallback(EmojiCompat_InitCallback initCallback) =>
-      _registerInitCallback(reference, initCallback.reference).check();
+  void registerInitCallback(
+    EmojiCompat_InitCallback initCallback,
+  ) {
+    return _registerInitCallback(reference, initCallback.reference).check();
+  }
 
   static final _unregisterInitCallback = jniLookup<
               ffi.NativeFunction<
@@ -498,8 +540,11 @@
   ///
   /// Unregisters a callback that was added before.
   ///@param initCallback the callback to be removed, cannot be {@code null}
-  void unregisterInitCallback(EmojiCompat_InitCallback initCallback) =>
-      _unregisterInitCallback(reference, initCallback.reference).check();
+  void unregisterInitCallback(
+    EmojiCompat_InitCallback initCallback,
+  ) {
+    return _unregisterInitCallback(reference, initCallback.reference).check();
+  }
 
   static final _getLoadState = jniLookup<
           ffi.NativeFunction<
@@ -513,7 +558,9 @@
   /// below always returns \#LOAD_STATE_SUCCEEDED.
   ///@return one of \#LOAD_STATE_DEFAULT, \#LOAD_STATE_LOADING,
   /// \#LOAD_STATE_SUCCEEDED, \#LOAD_STATE_FAILED
-  int getLoadState() => _getLoadState(reference).integer;
+  int getLoadState() {
+    return _getLoadState(reference).integer;
+  }
 
   static final _isEmojiSpanIndicatorEnabled = jniLookup<
               ffi.NativeFunction<
@@ -525,8 +572,9 @@
   ///
   /// @return whether a background should be drawn for the emoji for debugging
   ///@hide
-  bool isEmojiSpanIndicatorEnabled() =>
-      _isEmojiSpanIndicatorEnabled(reference).boolean;
+  bool isEmojiSpanIndicatorEnabled() {
+    return _isEmojiSpanIndicatorEnabled(reference).boolean;
+  }
 
   static final _getEmojiSpanIndicatorColor = jniLookup<
               ffi.NativeFunction<
@@ -538,8 +586,9 @@
   ///
   /// @return color of background drawn if EmojiCompat\#isEmojiSpanIndicatorEnabled is true
   ///@hide
-  int getEmojiSpanIndicatorColor() =>
-      _getEmojiSpanIndicatorColor(reference).integer;
+  int getEmojiSpanIndicatorColor() {
+    return _getEmojiSpanIndicatorColor(reference).integer;
+  }
 
   static final _getEmojiStart = jniLookup<
           ffi.NativeFunction<
@@ -562,8 +611,12 @@
   ///@param charSequence the whole sequence
   ///@param offset index of the emoji to look up
   ///@return the start index inclusively/end index exclusively
-  int getEmojiStart(jni.JObject charSequence, int offset) =>
-      _getEmojiStart(reference, charSequence.reference, offset).integer;
+  int getEmojiStart(
+    jni.JObject charSequence,
+    int offset,
+  ) {
+    return _getEmojiStart(reference, charSequence.reference, offset).integer;
+  }
 
   static final _getEmojiEnd = jniLookup<
           ffi.NativeFunction<
@@ -578,8 +631,12 @@
   /// from: public int getEmojiEnd(java.lang.CharSequence charSequence, int offset)
   ///
   /// see \#getEmojiStart(CharSequence, int).
-  int getEmojiEnd(jni.JObject charSequence, int offset) =>
-      _getEmojiEnd(reference, charSequence.reference, offset).integer;
+  int getEmojiEnd(
+    jni.JObject charSequence,
+    int offset,
+  ) {
+    return _getEmojiEnd(reference, charSequence.reference, offset).integer;
+  }
 
   static final _handleOnKeyDown = jniLookup<
           ffi.NativeFunction<
@@ -608,8 +665,13 @@
   ///              int, KeyEvent)
   ///@return {@code true} if an EmojiSpan is deleted
   static bool handleOnKeyDown(
-          jni.JObject editable, int keyCode, jni.JObject event) =>
-      _handleOnKeyDown(editable.reference, keyCode, event.reference).boolean;
+    jni.JObject editable,
+    int keyCode,
+    jni.JObject event,
+  ) {
+    return _handleOnKeyDown(editable.reference, keyCode, event.reference)
+        .boolean;
+  }
 
   static final _handleDeleteSurroundingText = jniLookup<
           ffi.NativeFunction<
@@ -640,18 +702,16 @@
   ///@param inCodePoints {@code true} if length parameters are in codepoints
   ///@return {@code true} if an EmojiSpan is deleted
   static bool handleDeleteSurroundingText(
-          jni.JObject inputConnection,
-          jni.JObject editable,
-          int beforeLength,
-          int afterLength,
-          bool inCodePoints) =>
-      _handleDeleteSurroundingText(
-              inputConnection.reference,
-              editable.reference,
-              beforeLength,
-              afterLength,
-              inCodePoints ? 1 : 0)
-          .boolean;
+    jni.JObject inputConnection,
+    jni.JObject editable,
+    int beforeLength,
+    int afterLength,
+    bool inCodePoints,
+  ) {
+    return _handleDeleteSurroundingText(inputConnection.reference,
+            editable.reference, beforeLength, afterLength, inCodePoints ? 1 : 0)
+        .boolean;
+  }
 
   static final _hasEmojiGlyph = jniLookup<
           ffi.NativeFunction<
@@ -669,8 +729,11 @@
   ///@param sequence CharSequence representing the emoji
   ///@return {@code true} if EmojiCompat can render given emoji, cannot be {@code null}
   ///@throws IllegalStateException if not initialized yet
-  bool hasEmojiGlyph(jni.JObject sequence) =>
-      _hasEmojiGlyph(reference, sequence.reference).boolean;
+  bool hasEmojiGlyph(
+    jni.JObject sequence,
+  ) {
+    return _hasEmojiGlyph(reference, sequence.reference).boolean;
+  }
 
   static final _hasEmojiGlyph1 = jniLookup<
           ffi.NativeFunction<
@@ -692,8 +755,13 @@
   ///                        equal to {@code 0},
   ///@return {@code true} if EmojiCompat can render given emoji, cannot be {@code null}
   ///@throws IllegalStateException if not initialized yet
-  bool hasEmojiGlyph1(jni.JObject sequence, int metadataVersion) =>
-      _hasEmojiGlyph1(reference, sequence.reference, metadataVersion).boolean;
+  bool hasEmojiGlyph1(
+    jni.JObject sequence,
+    int metadataVersion,
+  ) {
+    return _hasEmojiGlyph1(reference, sequence.reference, metadataVersion)
+        .boolean;
+  }
 
   static final _getEmojiMatch = jniLookup<
           ffi.NativeFunction<
@@ -718,8 +786,13 @@
   ///@param metadataVersion the metada version to check against, should be greater than or
   ///                        equal to {@code 0},
   ///@return A match result, or decomposes if replaceAll would cause partial subsequence matches.
-  int getEmojiMatch(jni.JObject sequence, int metadataVersion) =>
-      _getEmojiMatch(reference, sequence.reference, metadataVersion).integer;
+  int getEmojiMatch(
+    jni.JObject sequence,
+    int metadataVersion,
+  ) {
+    return _getEmojiMatch(reference, sequence.reference, metadataVersion)
+        .integer;
+  }
 
   static final _process = jniLookup<
           ffi.NativeFunction<
@@ -738,8 +811,12 @@
   ///@param charSequence CharSequence to add the EmojiSpans
   ///@throws IllegalStateException if not initialized yet
   ///@see \#process(CharSequence, int, int)
-  jni.JObject process(jni.JObject charSequence) => const jni.JObjectType()
-      .fromRef(_process(reference, charSequence.reference).object);
+  jni.JObject process(
+    jni.JObject charSequence,
+  ) {
+    return const jni.JObjectType()
+        .fromRef(_process(reference, charSequence.reference).object);
+  }
 
   static final _process1 = jniLookup<
           ffi.NativeFunction<
@@ -778,9 +855,14 @@
   ///                                  {@code start < 0}, {@code end < 0}, {@code end < start},
   ///                                  {@code start > charSequence.length()},
   ///                                  {@code end > charSequence.length()}
-  jni.JObject process1(jni.JObject charSequence, int start, int end) =>
-      const jni.JObjectType().fromRef(
-          _process1(reference, charSequence.reference, start, end).object);
+  jni.JObject process1(
+    jni.JObject charSequence,
+    int start,
+    int end,
+  ) {
+    return const jni.JObjectType().fromRef(
+        _process1(reference, charSequence.reference, start, end).object);
+  }
 
   static final _process2 = jniLookup<
           ffi.NativeFunction<
@@ -824,10 +906,15 @@
   ///                                  {@code end > charSequence.length()}
   ///                                  {@code maxEmojiCount < 0}
   jni.JObject process2(
-          jni.JObject charSequence, int start, int end, int maxEmojiCount) =>
-      const jni.JObjectType().fromRef(_process2(
-              reference, charSequence.reference, start, end, maxEmojiCount)
-          .object);
+    jni.JObject charSequence,
+    int start,
+    int end,
+    int maxEmojiCount,
+  ) {
+    return const jni.JObjectType().fromRef(
+        _process2(reference, charSequence.reference, start, end, maxEmojiCount)
+            .object);
+  }
 
   static final _process3 = jniLookup<
           ffi.NativeFunction<
@@ -875,16 +962,17 @@
   ///                                  {@code start > charSequence.length()},
   ///                                  {@code end > charSequence.length()}
   ///                                  {@code maxEmojiCount < 0}
-  jni.JObject process3(jni.JObject charSequence, int start, int end,
-          int maxEmojiCount, int replaceStrategy) =>
-      const jni.JObjectType().fromRef(_process3(
-              reference,
-              charSequence.reference,
-              start,
-              end,
-              maxEmojiCount,
-              replaceStrategy)
-          .object);
+  jni.JObject process3(
+    jni.JObject charSequence,
+    int start,
+    int end,
+    int maxEmojiCount,
+    int replaceStrategy,
+  ) {
+    return const jni.JObjectType().fromRef(_process3(reference,
+            charSequence.reference, start, end, maxEmojiCount, replaceStrategy)
+        .object);
+  }
 
   static final _getAssetSignature = jniLookup<
           ffi.NativeFunction<
@@ -899,8 +987,10 @@
   /// constructed using emoji assets. Can be used to detect if currently loaded asset is different
   /// then previous executions. When used on devices running API 18 or below, returns empty string.
   ///@throws IllegalStateException if not initialized yet
-  jni.JString getAssetSignature() =>
-      const jni.JStringType().fromRef(_getAssetSignature(reference).object);
+  jni.JString getAssetSignature() {
+    return const jni.JStringType()
+        .fromRef(_getAssetSignature(reference).object);
+  }
 
   static final _updateEditorInfo = jniLookup<
           ffi.NativeFunction<
@@ -927,8 +1017,11 @@
   ///                 android.widget.TextView\#onCreateInputConnection(EditorInfo)
   ///@see \#EDITOR_INFO_METAVERSION_KEY
   ///@see \#EDITOR_INFO_REPLACE_ALL_KEY
-  void updateEditorInfo(jni.JObject outAttrs) =>
-      _updateEditorInfo(reference, outAttrs.reference).check();
+  void updateEditorInfo(
+    jni.JObject outAttrs,
+  ) {
+    return _updateEditorInfo(reference, outAttrs.reference).check();
+  }
 }
 
 class $EmojiCompatType extends jni.JObjType<EmojiCompat> {
@@ -939,6 +1032,20 @@
 
   @override
   EmojiCompat fromRef(jni.JObjectPtr ref) => EmojiCompat.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($EmojiCompatType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $EmojiCompatType && other is $EmojiCompatType;
+  }
 }
 
 /// from: androidx.emoji2.text.EmojiCompat$Config
@@ -947,9 +1054,8 @@
 /// \#init(Config) is called.
 ///@see \#init(EmojiCompat.Config)
 class EmojiCompat_Config extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   EmojiCompat_Config.fromRef(
     jni.JObjectPtr ref,
@@ -968,8 +1074,11 @@
   ///
   /// Default constructor.
   ///@param metadataLoader MetadataRepoLoader instance, cannot be {@code null}
-  EmojiCompat_Config(EmojiCompat_MetadataRepoLoader metadataLoader)
-      : super.fromRef(_ctor(metadataLoader.reference).object);
+  factory EmojiCompat_Config(
+    EmojiCompat_MetadataRepoLoader metadataLoader,
+  ) {
+    return EmojiCompat_Config.fromRef(_ctor(metadataLoader.reference).object);
+  }
 
   static final _registerInitCallback = jniLookup<
               ffi.NativeFunction<
@@ -987,9 +1096,11 @@
   ///@param initCallback the initialization callback to register, cannot be {@code null}
   ///@return EmojiCompat.Config instance
   EmojiCompat_Config registerInitCallback(
-          EmojiCompat_InitCallback initCallback) =>
-      const $EmojiCompat_ConfigType().fromRef(
-          _registerInitCallback(reference, initCallback.reference).object);
+    EmojiCompat_InitCallback initCallback,
+  ) {
+    return const $EmojiCompat_ConfigType().fromRef(
+        _registerInitCallback(reference, initCallback.reference).object);
+  }
 
   static final _unregisterInitCallback = jniLookup<
               ffi.NativeFunction<
@@ -1007,9 +1118,11 @@
   ///@param initCallback the initialization callback to be removed, cannot be {@code null}
   ///@return EmojiCompat.Config instance
   EmojiCompat_Config unregisterInitCallback(
-          EmojiCompat_InitCallback initCallback) =>
-      const $EmojiCompat_ConfigType().fromRef(
-          _unregisterInitCallback(reference, initCallback.reference).object);
+    EmojiCompat_InitCallback initCallback,
+  ) {
+    return const $EmojiCompat_ConfigType().fromRef(
+        _unregisterInitCallback(reference, initCallback.reference).object);
+  }
 
   static final _setReplaceAll = jniLookup<
           ffi.NativeFunction<
@@ -1025,9 +1138,12 @@
   /// can render an emoji and do not replace those emojis.
   ///@param replaceAll replace all emojis found with EmojiSpans
   ///@return EmojiCompat.Config instance
-  EmojiCompat_Config setReplaceAll(bool replaceAll) =>
-      const $EmojiCompat_ConfigType()
-          .fromRef(_setReplaceAll(reference, replaceAll ? 1 : 0).object);
+  EmojiCompat_Config setReplaceAll(
+    bool replaceAll,
+  ) {
+    return const $EmojiCompat_ConfigType()
+        .fromRef(_setReplaceAll(reference, replaceAll ? 1 : 0).object);
+  }
 
   static final _setUseEmojiAsDefaultStyle = jniLookup<
           ffi.NativeFunction<
@@ -1050,10 +1166,13 @@
   /// exception emojis that should be still presented as text style.
   ///@param useEmojiAsDefaultStyle whether to use the emoji style presentation for all emojis
   ///                               that would be presented as text style by default
-  EmojiCompat_Config setUseEmojiAsDefaultStyle(bool useEmojiAsDefaultStyle) =>
-      const $EmojiCompat_ConfigType().fromRef(
-          _setUseEmojiAsDefaultStyle(reference, useEmojiAsDefaultStyle ? 1 : 0)
-              .object);
+  EmojiCompat_Config setUseEmojiAsDefaultStyle(
+    bool useEmojiAsDefaultStyle,
+  ) {
+    return const $EmojiCompat_ConfigType().fromRef(
+        _setUseEmojiAsDefaultStyle(reference, useEmojiAsDefaultStyle ? 1 : 0)
+            .object);
+  }
 
   static final _setUseEmojiAsDefaultStyle1 = jniLookup<
               ffi.NativeFunction<
@@ -1079,13 +1198,16 @@
   ///                                      not. When no exception is wanted, the method
   ///                                      \#setUseEmojiAsDefaultStyle(boolean) should
   ///                                      be used instead.
-  EmojiCompat_Config setUseEmojiAsDefaultStyle1(bool useEmojiAsDefaultStyle,
-          jni.JObject emojiAsDefaultStyleExceptions) =>
-      const $EmojiCompat_ConfigType().fromRef(_setUseEmojiAsDefaultStyle1(
-              reference,
-              useEmojiAsDefaultStyle ? 1 : 0,
-              emojiAsDefaultStyleExceptions.reference)
-          .object);
+  EmojiCompat_Config setUseEmojiAsDefaultStyle1(
+    bool useEmojiAsDefaultStyle,
+    jni.JObject emojiAsDefaultStyleExceptions,
+  ) {
+    return const $EmojiCompat_ConfigType().fromRef(_setUseEmojiAsDefaultStyle1(
+            reference,
+            useEmojiAsDefaultStyle ? 1 : 0,
+            emojiAsDefaultStyleExceptions.reference)
+        .object);
+  }
 
   static final _setEmojiSpanIndicatorEnabled = jniLookup<
               ffi.NativeFunction<
@@ -1102,10 +1224,13 @@
   ///@param emojiSpanIndicatorEnabled when {@code true} a background is drawn for each emoji
   ///                                  that is replaced
   EmojiCompat_Config setEmojiSpanIndicatorEnabled(
-          bool emojiSpanIndicatorEnabled) =>
-      const $EmojiCompat_ConfigType().fromRef(_setEmojiSpanIndicatorEnabled(
-              reference, emojiSpanIndicatorEnabled ? 1 : 0)
-          .object);
+    bool emojiSpanIndicatorEnabled,
+  ) {
+    return const $EmojiCompat_ConfigType().fromRef(
+        _setEmojiSpanIndicatorEnabled(
+                reference, emojiSpanIndicatorEnabled ? 1 : 0)
+            .object);
+  }
 
   static final _setEmojiSpanIndicatorColor = jniLookup<
           ffi.NativeFunction<
@@ -1119,9 +1244,12 @@
   /// Sets the color used as emoji span indicator. The default value is
   /// Color\#GREEN Color.GREEN.
   ///@see \#setEmojiSpanIndicatorEnabled(boolean)
-  EmojiCompat_Config setEmojiSpanIndicatorColor(int color) =>
-      const $EmojiCompat_ConfigType()
-          .fromRef(_setEmojiSpanIndicatorColor(reference, color).object);
+  EmojiCompat_Config setEmojiSpanIndicatorColor(
+    int color,
+  ) {
+    return const $EmojiCompat_ConfigType()
+        .fromRef(_setEmojiSpanIndicatorColor(reference, color).object);
+  }
 
   static final _setMetadataLoadStrategy = jniLookup<
           ffi.NativeFunction<
@@ -1164,9 +1292,12 @@
   /// </pre>
   ///@param strategy one of EmojiCompat\#LOAD_STRATEGY_DEFAULT,
   ///                  EmojiCompat\#LOAD_STRATEGY_MANUAL
-  EmojiCompat_Config setMetadataLoadStrategy(int strategy) =>
-      const $EmojiCompat_ConfigType()
-          .fromRef(_setMetadataLoadStrategy(reference, strategy).object);
+  EmojiCompat_Config setMetadataLoadStrategy(
+    int strategy,
+  ) {
+    return const $EmojiCompat_ConfigType()
+        .fromRef(_setMetadataLoadStrategy(reference, strategy).object);
+  }
 
   static final _setSpanFactory = jniLookup<
           ffi.NativeFunction<
@@ -1182,9 +1313,12 @@
   /// Set the span factory used to actually draw emoji replacements.
   ///@param factory custum span factory that can draw the emoji replacements
   ///@return this
-  EmojiCompat_Config setSpanFactory(EmojiCompat_SpanFactory factory0) =>
-      const $EmojiCompat_ConfigType()
-          .fromRef(_setSpanFactory(reference, factory0.reference).object);
+  EmojiCompat_Config setSpanFactory(
+    EmojiCompat_SpanFactory factory0,
+  ) {
+    return const $EmojiCompat_ConfigType()
+        .fromRef(_setSpanFactory(reference, factory0.reference).object);
+  }
 
   static final _setGlyphChecker = jniLookup<
               ffi.NativeFunction<
@@ -1201,9 +1335,12 @@
   /// The interface that is used by EmojiCompat in order to check if a given emoji can be
   /// rendered by the system.
   ///@param glyphChecker GlyphChecker instance to be used.
-  EmojiCompat_Config setGlyphChecker(EmojiCompat_GlyphChecker glyphChecker) =>
-      const $EmojiCompat_ConfigType()
-          .fromRef(_setGlyphChecker(reference, glyphChecker.reference).object);
+  EmojiCompat_Config setGlyphChecker(
+    EmojiCompat_GlyphChecker glyphChecker,
+  ) {
+    return const $EmojiCompat_ConfigType()
+        .fromRef(_setGlyphChecker(reference, glyphChecker.reference).object);
+  }
 
   static final _getMetadataRepoLoader = jniLookup<
               ffi.NativeFunction<
@@ -1215,9 +1352,10 @@
   /// The returned object must be deleted after use, by calling the `delete` method.
   ///
   /// Returns the MetadataRepoLoader.
-  EmojiCompat_MetadataRepoLoader getMetadataRepoLoader() =>
-      const $EmojiCompat_MetadataRepoLoaderType()
-          .fromRef(_getMetadataRepoLoader(reference).object);
+  EmojiCompat_MetadataRepoLoader getMetadataRepoLoader() {
+    return const $EmojiCompat_MetadataRepoLoaderType()
+        .fromRef(_getMetadataRepoLoader(reference).object);
+  }
 }
 
 class $EmojiCompat_ConfigType extends jni.JObjType<EmojiCompat_Config> {
@@ -1229,6 +1367,21 @@
   @override
   EmojiCompat_Config fromRef(jni.JObjectPtr ref) =>
       EmojiCompat_Config.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($EmojiCompat_ConfigType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $EmojiCompat_ConfigType &&
+        other is $EmojiCompat_ConfigType;
+  }
 }
 
 /// from: androidx.emoji2.text.EmojiCompat$MetadataRepoLoaderCallback
@@ -1236,9 +1389,8 @@
 /// Callback to inform EmojiCompat about the state of the metadata load. Passed to
 /// MetadataRepoLoader during MetadataRepoLoader\#load(MetadataRepoLoaderCallback) call.
 class EmojiCompat_MetadataRepoLoaderCallback extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   EmojiCompat_MetadataRepoLoaderCallback.fromRef(
     jni.JObjectPtr ref,
@@ -1252,7 +1404,9 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  EmojiCompat_MetadataRepoLoaderCallback() : super.fromRef(_ctor().object);
+  factory EmojiCompat_MetadataRepoLoaderCallback() {
+    return EmojiCompat_MetadataRepoLoaderCallback.fromRef(_ctor().object);
+  }
 
   static final _onLoaded = jniLookup<
               ffi.NativeFunction<
@@ -1267,8 +1421,11 @@
   ///
   /// Called by MetadataRepoLoader when metadata is loaded successfully.
   ///@param metadataRepo MetadataRepo instance, cannot be {@code null}
-  void onLoaded(jni.JObject metadataRepo) =>
-      _onLoaded(reference, metadataRepo.reference).check();
+  void onLoaded(
+    jni.JObject metadataRepo,
+  ) {
+    return _onLoaded(reference, metadataRepo.reference).check();
+  }
 
   static final _onFailed = jniLookup<
               ffi.NativeFunction<
@@ -1283,8 +1440,11 @@
   ///
   /// Called by MetadataRepoLoader if an error occurs while loading the metadata.
   ///@param throwable the exception that caused the failure, {@code nullable}
-  void onFailed(jni.JObject throwable) =>
-      _onFailed(reference, throwable.reference).check();
+  void onFailed(
+    jni.JObject throwable,
+  ) {
+    return _onFailed(reference, throwable.reference).check();
+  }
 }
 
 class $EmojiCompat_MetadataRepoLoaderCallbackType
@@ -1298,15 +1458,29 @@
   @override
   EmojiCompat_MetadataRepoLoaderCallback fromRef(jni.JObjectPtr ref) =>
       EmojiCompat_MetadataRepoLoaderCallback.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($EmojiCompat_MetadataRepoLoaderCallbackType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $EmojiCompat_MetadataRepoLoaderCallbackType &&
+        other is $EmojiCompat_MetadataRepoLoaderCallbackType;
+  }
 }
 
 /// from: androidx.emoji2.text.EmojiCompat$GlyphChecker
 ///
 /// Interface to check if a given emoji exists on the system.
 class EmojiCompat_GlyphChecker extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   EmojiCompat_GlyphChecker.fromRef(
     jni.JObjectPtr ref,
@@ -1363,9 +1537,15 @@
   ///@param end the exclusive end offset for the emoji in the {@code charSequence}
   ///@param sdkAdded the API version that the emoji was added in AOSP
   ///@return true if the given sequence can be rendered as a single glyph, otherwise false.
-  bool hasGlyph(jni.JObject charSequence, int start, int end, int sdkAdded) =>
-      _hasGlyph(reference, charSequence.reference, start, end, sdkAdded)
-          .boolean;
+  bool hasGlyph(
+    jni.JObject charSequence,
+    int start,
+    int end,
+    int sdkAdded,
+  ) {
+    return _hasGlyph(reference, charSequence.reference, start, end, sdkAdded)
+        .boolean;
+  }
 }
 
 class $EmojiCompat_GlyphCheckerType
@@ -1378,15 +1558,29 @@
   @override
   EmojiCompat_GlyphChecker fromRef(jni.JObjectPtr ref) =>
       EmojiCompat_GlyphChecker.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($EmojiCompat_GlyphCheckerType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $EmojiCompat_GlyphCheckerType &&
+        other is $EmojiCompat_GlyphCheckerType;
+  }
 }
 
 /// from: androidx.emoji2.text.EmojiCompat$MetadataRepoLoader
 ///
 /// Interface to load emoji metadata.
 class EmojiCompat_MetadataRepoLoader extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   EmojiCompat_MetadataRepoLoader.fromRef(
     jni.JObjectPtr ref,
@@ -1409,8 +1603,11 @@
   /// MetadataRepoLoaderCallback\#onFailed(Throwable) should be called. When used on
   /// devices running API 18 or below, this function is never called.
   ///@param loaderCallback callback to signal the loading state
-  void load(EmojiCompat_MetadataRepoLoaderCallback loaderCallback) =>
-      _load(reference, loaderCallback.reference).check();
+  void load(
+    EmojiCompat_MetadataRepoLoaderCallback loaderCallback,
+  ) {
+    return _load(reference, loaderCallback.reference).check();
+  }
 }
 
 class $EmojiCompat_MetadataRepoLoaderType
@@ -1424,15 +1621,29 @@
   @override
   EmojiCompat_MetadataRepoLoader fromRef(jni.JObjectPtr ref) =>
       EmojiCompat_MetadataRepoLoader.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($EmojiCompat_MetadataRepoLoaderType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $EmojiCompat_MetadataRepoLoaderType &&
+        other is $EmojiCompat_MetadataRepoLoaderType;
+  }
 }
 
 /// from: androidx.emoji2.text.EmojiCompat$InitCallback
 ///
 /// Listener class for the initialization of the EmojiCompat.
 class EmojiCompat_InitCallback extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   EmojiCompat_InitCallback.fromRef(
     jni.JObjectPtr ref,
@@ -1446,7 +1657,9 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  EmojiCompat_InitCallback() : super.fromRef(_ctor().object);
+  factory EmojiCompat_InitCallback() {
+    return EmojiCompat_InitCallback.fromRef(_ctor().object);
+  }
 
   static final _onInitialized = jniLookup<
               ffi.NativeFunction<
@@ -1458,7 +1671,9 @@
   ///
   /// Called when EmojiCompat is initialized and the emoji data is loaded. When used on devices
   /// running API 18 or below, this function is always called.
-  void onInitialized() => _onInitialized(reference).check();
+  void onInitialized() {
+    return _onInitialized(reference).check();
+  }
 
   static final _onFailed = jniLookup<
           ffi.NativeFunction<
@@ -1472,8 +1687,11 @@
   ///
   /// Called when an unrecoverable error occurs during EmojiCompat initialization. When used on
   /// devices running API 18 or below, this function is never called.
-  void onFailed(jni.JObject throwable) =>
-      _onFailed(reference, throwable.reference).check();
+  void onFailed(
+    jni.JObject throwable,
+  ) {
+    return _onFailed(reference, throwable.reference).check();
+  }
 }
 
 class $EmojiCompat_InitCallbackType
@@ -1486,15 +1704,29 @@
   @override
   EmojiCompat_InitCallback fromRef(jni.JObjectPtr ref) =>
       EmojiCompat_InitCallback.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($EmojiCompat_InitCallbackType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $EmojiCompat_InitCallbackType &&
+        other is $EmojiCompat_InitCallbackType;
+  }
 }
 
 /// from: androidx.emoji2.text.EmojiCompat$DefaultSpanFactory
 ///
 /// @hide
 class EmojiCompat_DefaultSpanFactory extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   EmojiCompat_DefaultSpanFactory.fromRef(
     jni.JObjectPtr ref,
@@ -1508,7 +1740,9 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  EmojiCompat_DefaultSpanFactory() : super.fromRef(_ctor().object);
+  factory EmojiCompat_DefaultSpanFactory() {
+    return EmojiCompat_DefaultSpanFactory.fromRef(_ctor().object);
+  }
 
   static final _createSpan = jniLookup<
               ffi.NativeFunction<
@@ -1526,8 +1760,12 @@
   ///@param rasterizer TypefaceEmojiRasterizer instance, which can draw the emoji onto a
   ///                   Canvas.
   ///@return TypefaceEmojiSpan
-  jni.JObject createSpan(jni.JObject rasterizer) => const jni.JObjectType()
-      .fromRef(_createSpan(reference, rasterizer.reference).object);
+  jni.JObject createSpan(
+    jni.JObject rasterizer,
+  ) {
+    return const jni.JObjectType()
+        .fromRef(_createSpan(reference, rasterizer.reference).object);
+  }
 }
 
 class $EmojiCompat_DefaultSpanFactoryType
@@ -1541,6 +1779,21 @@
   @override
   EmojiCompat_DefaultSpanFactory fromRef(jni.JObjectPtr ref) =>
       EmojiCompat_DefaultSpanFactory.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($EmojiCompat_DefaultSpanFactoryType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $EmojiCompat_DefaultSpanFactoryType &&
+        other is $EmojiCompat_DefaultSpanFactoryType;
+  }
 }
 
 /// from: androidx.emoji2.text.EmojiCompat$SpanFactory
@@ -1552,9 +1805,8 @@
 /// Apps should use this only if they want to control the drawing of EmojiSpans for non-standard
 /// emoji display (for example, resizing or repositioning emoji).
 class EmojiCompat_SpanFactory extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   EmojiCompat_SpanFactory.fromRef(
     jni.JObjectPtr ref,
@@ -1578,8 +1830,12 @@
   ///@param rasterizer TypefaceEmojiRasterizer instance, which can draw the emoji onto a
   ///                   Canvas.
   ///@return EmojiSpan instance that can use TypefaceEmojiRasterizer to draw emoji.
-  jni.JObject createSpan(jni.JObject rasterizer) => const jni.JObjectType()
-      .fromRef(_createSpan(reference, rasterizer.reference).object);
+  jni.JObject createSpan(
+    jni.JObject rasterizer,
+  ) {
+    return const jni.JObjectType()
+        .fromRef(_createSpan(reference, rasterizer.reference).object);
+  }
 }
 
 class $EmojiCompat_SpanFactoryType
@@ -1592,6 +1848,21 @@
   @override
   EmojiCompat_SpanFactory fromRef(jni.JObjectPtr ref) =>
       EmojiCompat_SpanFactory.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($EmojiCompat_SpanFactoryType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $EmojiCompat_SpanFactoryType &&
+        other is $EmojiCompat_SpanFactoryType;
+  }
 }
 
 /// from: androidx.emoji2.text.DefaultEmojiCompatConfig
@@ -1631,9 +1902,8 @@
 ///  <li>It <i>MUST</i> be installed in the system image.</li>
 /// </ol>
 class DefaultEmojiCompatConfig extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   DefaultEmojiCompatConfig.fromRef(
     jni.JObjectPtr ref,
@@ -1659,8 +1929,11 @@
   ///@param context context for lookup
   ///@return A valid config for downloading the emoji compat font, or null if no font provider
   /// could be found.
-  static jni.JObject create(jni.JObject context) =>
-      const jni.JObjectType().fromRef(_create(context.reference).object);
+  static jni.JObject create(
+    jni.JObject context,
+  ) {
+    return const jni.JObjectType().fromRef(_create(context.reference).object);
+  }
 }
 
 class $DefaultEmojiCompatConfigType
@@ -1673,6 +1946,21 @@
   @override
   DefaultEmojiCompatConfig fromRef(jni.JObjectPtr ref) =>
       DefaultEmojiCompatConfig.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($DefaultEmojiCompatConfigType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $DefaultEmojiCompatConfigType &&
+        other is $DefaultEmojiCompatConfigType;
+  }
 }
 
 /// from: androidx.emoji2.text.DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API28
@@ -1681,9 +1969,8 @@
 ///@hide
 class DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API28
     extends DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API19 {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API28.fromRef(
     jni.JObjectPtr ref,
@@ -1698,8 +1985,10 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API28()
-      : super.fromRef(_ctor().object);
+  factory DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API28() {
+    return DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API28
+        .fromRef(_ctor().object);
+  }
 
   static final _getSigningSignatures1 = jniLookup<
               ffi.NativeFunction<
@@ -1713,10 +2002,14 @@
   /// from: public android.content.pm.Signature[] getSigningSignatures(android.content.pm.PackageManager packageManager, java.lang.String providerPackage)
   /// The returned object must be deleted after use, by calling the `delete` method.
   jni.JArray<jni.JObject> getSigningSignatures1(
-          jni.JObject packageManager, jni.JString providerPackage) =>
-      const jni.JArrayType(jni.JObjectType()).fromRef(_getSigningSignatures1(
-              reference, packageManager.reference, providerPackage.reference)
-          .object);
+    jni.JObject packageManager,
+    jni.JString providerPackage,
+  ) {
+    return const jni.JArrayType(jni.JObjectType()).fromRef(
+        _getSigningSignatures1(
+                reference, packageManager.reference, providerPackage.reference)
+            .object);
+  }
 }
 
 class $DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API28Type
@@ -1733,6 +2026,26 @@
           jni.JObjectPtr ref) =>
       DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API28.fromRef(
           ref);
+
+  @override
+  jni.JObjType get superType =>
+      const $DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API19Type();
+
+  @override
+  final superCount = 3;
+
+  @override
+  int get hashCode =>
+      ($DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API28Type)
+          .hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType ==
+            $DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API28Type &&
+        other
+            is $DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API28Type;
+  }
 }
 
 /// from: androidx.emoji2.text.DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API19
@@ -1741,9 +2054,8 @@
 ///@hide
 class DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API19
     extends DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API19.fromRef(
     jni.JObjectPtr ref,
@@ -1758,8 +2070,10 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API19()
-      : super.fromRef(_ctor().object);
+  factory DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API19() {
+    return DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API19
+        .fromRef(_ctor().object);
+  }
 
   static final _queryIntentContentProviders = jniLookup<
               ffi.NativeFunction<
@@ -1776,10 +2090,14 @@
   /// from: public java.util.List<android.content.pm.ResolveInfo> queryIntentContentProviders(android.content.pm.PackageManager packageManager, android.content.Intent intent, int flags)
   /// The returned object must be deleted after use, by calling the `delete` method.
   jni.JObject queryIntentContentProviders(
-          jni.JObject packageManager, jni.JObject intent, int flags) =>
-      const jni.JObjectType().fromRef(_queryIntentContentProviders(
-              reference, packageManager.reference, intent.reference, flags)
-          .object);
+    jni.JObject packageManager,
+    jni.JObject intent,
+    int flags,
+  ) {
+    return const jni.JObjectType().fromRef(_queryIntentContentProviders(
+            reference, packageManager.reference, intent.reference, flags)
+        .object);
+  }
 
   static final _getProviderInfo = jniLookup<
               ffi.NativeFunction<
@@ -1792,9 +2110,12 @@
 
   /// from: public android.content.pm.ProviderInfo getProviderInfo(android.content.pm.ResolveInfo resolveInfo)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  jni.JObject getProviderInfo(jni.JObject resolveInfo) =>
-      const jni.JObjectType()
-          .fromRef(_getProviderInfo(reference, resolveInfo.reference).object);
+  jni.JObject getProviderInfo(
+    jni.JObject resolveInfo,
+  ) {
+    return const jni.JObjectType()
+        .fromRef(_getProviderInfo(reference, resolveInfo.reference).object);
+  }
 }
 
 class $DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API19Type
@@ -1811,6 +2132,26 @@
           jni.JObjectPtr ref) =>
       DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API19.fromRef(
           ref);
+
+  @override
+  jni.JObjType get superType =>
+      const $DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelperType();
+
+  @override
+  final superCount = 2;
+
+  @override
+  int get hashCode =>
+      ($DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API19Type)
+          .hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType ==
+            $DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API19Type &&
+        other
+            is $DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API19Type;
+  }
 }
 
 /// from: androidx.emoji2.text.DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper
@@ -1819,9 +2160,8 @@
 ///@hide
 class DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper
     extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper.fromRef(
     jni.JObjectPtr ref,
@@ -1836,8 +2176,10 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper()
-      : super.fromRef(_ctor().object);
+  factory DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper() {
+    return DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper.fromRef(
+        _ctor().object);
+  }
 
   static final _getSigningSignatures = jniLookup<
               ffi.NativeFunction<
@@ -1853,10 +2195,14 @@
   ///
   /// Get the signing signatures for a package in package manager.
   jni.JArray<jni.JObject> getSigningSignatures(
-          jni.JObject packageManager, jni.JString providerPackage) =>
-      const jni.JArrayType(jni.JObjectType()).fromRef(_getSigningSignatures(
-              reference, packageManager.reference, providerPackage.reference)
-          .object);
+    jni.JObject packageManager,
+    jni.JString providerPackage,
+  ) {
+    return const jni.JArrayType(jni.JObjectType()).fromRef(
+        _getSigningSignatures(
+                reference, packageManager.reference, providerPackage.reference)
+            .object);
+  }
 
   static final _queryIntentContentProviders = jniLookup<
               ffi.NativeFunction<
@@ -1875,10 +2221,14 @@
   ///
   /// Get the content provider by intent.
   jni.JObject queryIntentContentProviders(
-          jni.JObject packageManager, jni.JObject intent, int flags) =>
-      const jni.JObjectType().fromRef(_queryIntentContentProviders(
-              reference, packageManager.reference, intent.reference, flags)
-          .object);
+    jni.JObject packageManager,
+    jni.JObject intent,
+    int flags,
+  ) {
+    return const jni.JObjectType().fromRef(_queryIntentContentProviders(
+            reference, packageManager.reference, intent.reference, flags)
+        .object);
+  }
 
   static final _getProviderInfo = jniLookup<
               ffi.NativeFunction<
@@ -1895,9 +2245,12 @@
   /// Get a ProviderInfo, if present, from a ResolveInfo
   ///@param resolveInfo the subject
   ///@return resolveInfo.providerInfo above API 19
-  jni.JObject getProviderInfo(jni.JObject resolveInfo) =>
-      const jni.JObjectType()
-          .fromRef(_getProviderInfo(reference, resolveInfo.reference).object);
+  jni.JObject getProviderInfo(
+    jni.JObject resolveInfo,
+  ) {
+    return const jni.JObjectType()
+        .fromRef(_getProviderInfo(reference, resolveInfo.reference).object);
+  }
 }
 
 class $DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelperType extends jni
@@ -1912,6 +2265,23 @@
   DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper fromRef(
           jni.JObjectPtr ref) =>
       DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode =>
+      ($DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelperType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType ==
+            $DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelperType &&
+        other is $DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelperType;
+  }
 }
 
 /// from: androidx.emoji2.text.DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory
@@ -1921,9 +2291,8 @@
 ///@hide
 class DefaultEmojiCompatConfig_DefaultEmojiCompatConfigFactory
     extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   DefaultEmojiCompatConfig_DefaultEmojiCompatConfigFactory.fromRef(
     jni.JObjectPtr ref,
@@ -1942,9 +2311,12 @@
   /// The returned object must be deleted after use, by calling the `delete` method.
   ///
   /// @hide
-  DefaultEmojiCompatConfig_DefaultEmojiCompatConfigFactory(
-      DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper helper)
-      : super.fromRef(_ctor(helper.reference).object);
+  factory DefaultEmojiCompatConfig_DefaultEmojiCompatConfigFactory(
+    DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper helper,
+  ) {
+    return DefaultEmojiCompatConfig_DefaultEmojiCompatConfigFactory.fromRef(
+        _ctor(helper.reference).object);
+  }
 
   static final _create = jniLookup<
               ffi.NativeFunction<
@@ -1960,9 +2332,12 @@
   ///
   /// @see DefaultEmojiCompatConfig\#create
   ///@hide
-  EmojiCompat_Config create(jni.JObject context) =>
-      const $EmojiCompat_ConfigType()
-          .fromRef(_create(reference, context.reference).object);
+  EmojiCompat_Config create(
+    jni.JObject context,
+  ) {
+    return const $EmojiCompat_ConfigType()
+        .fromRef(_create(reference, context.reference).object);
+  }
 }
 
 class $DefaultEmojiCompatConfig_DefaultEmojiCompatConfigFactoryType extends jni
@@ -1977,13 +2352,29 @@
   DefaultEmojiCompatConfig_DefaultEmojiCompatConfigFactory fromRef(
           jni.JObjectPtr ref) =>
       DefaultEmojiCompatConfig_DefaultEmojiCompatConfigFactory.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode =>
+      ($DefaultEmojiCompatConfig_DefaultEmojiCompatConfigFactoryType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType ==
+            $DefaultEmojiCompatConfig_DefaultEmojiCompatConfigFactoryType &&
+        other is $DefaultEmojiCompatConfig_DefaultEmojiCompatConfigFactoryType;
+  }
 }
 
 /// from: android.os.Build
 class Build extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   Build.fromRef(
     jni.JObjectPtr ref,
@@ -2264,7 +2655,9 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  Build() : super.fromRef(_ctor().object);
+  factory Build() {
+    return Build.fromRef(_ctor().object);
+  }
 
   static final _getSerial =
       jniLookup<ffi.NativeFunction<jni.JniResult Function()>>(
@@ -2273,8 +2666,9 @@
 
   /// from: static public java.lang.String getSerial()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  static jni.JString getSerial() =>
-      const jni.JStringType().fromRef(_getSerial().object);
+  static jni.JString getSerial() {
+    return const jni.JStringType().fromRef(_getSerial().object);
+  }
 
   static final _getFingerprintedPartitions =
       jniLookup<ffi.NativeFunction<jni.JniResult Function()>>(
@@ -2283,8 +2677,10 @@
 
   /// from: static public java.util.List getFingerprintedPartitions()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  static jni.JObject getFingerprintedPartitions() =>
-      const jni.JObjectType().fromRef(_getFingerprintedPartitions().object);
+  static jni.JObject getFingerprintedPartitions() {
+    return const jni.JObjectType()
+        .fromRef(_getFingerprintedPartitions().object);
+  }
 
   static final _getRadioVersion =
       jniLookup<ffi.NativeFunction<jni.JniResult Function()>>(
@@ -2293,8 +2689,9 @@
 
   /// from: static public java.lang.String getRadioVersion()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  static jni.JString getRadioVersion() =>
-      const jni.JStringType().fromRef(_getRadioVersion().object);
+  static jni.JString getRadioVersion() {
+    return const jni.JStringType().fromRef(_getRadioVersion().object);
+  }
 }
 
 class $BuildType extends jni.JObjType<Build> {
@@ -2305,32 +2702,46 @@
 
   @override
   Build fromRef(jni.JObjectPtr ref) => Build.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($BuildType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $BuildType && other is $BuildType;
+  }
 }
 
 /// from: java.util.HashMap
-class HashMap<K extends jni.JObject, V extends jni.JObject>
+class HashMap<$K extends jni.JObject, $V extends jni.JObject>
     extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type($K, $V);
+  late final jni.JObjType $type = type(K, V);
 
-  final jni.JObjType<K> $K;
-  final jni.JObjType<V> $V;
+  final jni.JObjType<$K> K;
+  final jni.JObjType<$V> V;
 
   HashMap.fromRef(
-    this.$K,
-    this.$V,
+    this.K,
+    this.V,
     jni.JObjectPtr ref,
   ) : super.fromRef(ref);
 
   /// The type which includes information such as the signature of this class.
-  static $HashMapType<K, V> type<K extends jni.JObject, V extends jni.JObject>(
-    jni.JObjType<K> $K,
-    jni.JObjType<V> $V,
+  static $HashMapType<$K, $V>
+      type<$K extends jni.JObject, $V extends jni.JObject>(
+    jni.JObjType<$K> K,
+    jni.JObjType<$V> V,
   ) {
     return $HashMapType(
-      $K,
-      $V,
+      K,
+      V,
     );
   }
 
@@ -2341,8 +2752,14 @@
 
   /// from: public void <init>(int i, float f)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  HashMap(this.$K, this.$V, int i, double f)
-      : super.fromRef(_ctor(i, f).object);
+  factory HashMap(
+    int i,
+    double f, {
+    required jni.JObjType<$K> K,
+    required jni.JObjType<$V> V,
+  }) {
+    return HashMap.fromRef(K, V, _ctor(i, f).object);
+  }
 
   static final _ctor1 =
       jniLookup<ffi.NativeFunction<jni.JniResult Function(ffi.Int32)>>(
@@ -2351,7 +2768,13 @@
 
   /// from: public void <init>(int i)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  HashMap.ctor1(this.$K, this.$V, int i) : super.fromRef(_ctor1(i).object);
+  factory HashMap.ctor1(
+    int i, {
+    required jni.JObjType<$K> K,
+    required jni.JObjType<$V> V,
+  }) {
+    return HashMap.fromRef(K, V, _ctor1(i).object);
+  }
 
   static final _ctor2 =
       jniLookup<ffi.NativeFunction<jni.JniResult Function()>>("HashMap__ctor2")
@@ -2359,7 +2782,12 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  HashMap.ctor2(this.$K, this.$V) : super.fromRef(_ctor2().object);
+  factory HashMap.ctor2({
+    required jni.JObjType<$K> K,
+    required jni.JObjType<$V> V,
+  }) {
+    return HashMap.fromRef(K, V, _ctor2().object);
+  }
 
   static final _ctor3 = jniLookup<
           ffi.NativeFunction<
@@ -2368,8 +2796,13 @@
 
   /// from: public void <init>(java.util.Map map)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  HashMap.ctor3(this.$K, this.$V, jni.JObject map)
-      : super.fromRef(_ctor3(map.reference).object);
+  factory HashMap.ctor3(
+    jni.JObject map, {
+    required jni.JObjType<$K> K,
+    required jni.JObjType<$V> V,
+  }) {
+    return HashMap.fromRef(K, V, _ctor3(map.reference).object);
+  }
 
   static final _size = jniLookup<
           ffi.NativeFunction<
@@ -2377,7 +2810,9 @@
       .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
 
   /// from: public int size()
-  int size() => _size(reference).integer;
+  int size() {
+    return _size(reference).integer;
+  }
 
   static final _isEmpty = jniLookup<
           ffi.NativeFunction<
@@ -2386,7 +2821,9 @@
       .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
 
   /// from: public boolean isEmpty()
-  bool isEmpty() => _isEmpty(reference).boolean;
+  bool isEmpty() {
+    return _isEmpty(reference).boolean;
+  }
 
   static final _get0 = jniLookup<
           ffi.NativeFunction<
@@ -2398,8 +2835,11 @@
 
   /// from: public V get(java.lang.Object object)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  V get0(jni.JObject object) =>
-      $V.fromRef(_get0(reference, object.reference).object);
+  $V get0(
+    jni.JObject object,
+  ) {
+    return V.fromRef(_get0(reference, object.reference).object);
+  }
 
   static final _containsKey = jniLookup<
           ffi.NativeFunction<
@@ -2410,8 +2850,11 @@
               ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
 
   /// from: public boolean containsKey(java.lang.Object object)
-  bool containsKey(jni.JObject object) =>
-      _containsKey(reference, object.reference).boolean;
+  bool containsKey(
+    jni.JObject object,
+  ) {
+    return _containsKey(reference, object.reference).boolean;
+  }
 
   static final _put = jniLookup<
           ffi.NativeFunction<
@@ -2425,8 +2868,13 @@
 
   /// from: public V put(K object, V object1)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  V put(K object, V object1) =>
-      $V.fromRef(_put(reference, object.reference, object1.reference).object);
+  $V put(
+    $K object,
+    $V object1,
+  ) {
+    return V
+        .fromRef(_put(reference, object.reference, object1.reference).object);
+  }
 
   static final _putAll = jniLookup<
           ffi.NativeFunction<
@@ -2437,7 +2885,11 @@
               ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
 
   /// from: public void putAll(java.util.Map map)
-  void putAll(jni.JObject map) => _putAll(reference, map.reference).check();
+  void putAll(
+    jni.JObject map,
+  ) {
+    return _putAll(reference, map.reference).check();
+  }
 
   static final _remove = jniLookup<
           ffi.NativeFunction<
@@ -2449,8 +2901,11 @@
 
   /// from: public V remove(java.lang.Object object)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  V remove(jni.JObject object) =>
-      $V.fromRef(_remove(reference, object.reference).object);
+  $V remove(
+    jni.JObject object,
+  ) {
+    return V.fromRef(_remove(reference, object.reference).object);
+  }
 
   static final _clear = jniLookup<
           ffi.NativeFunction<
@@ -2458,7 +2913,9 @@
       .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
 
   /// from: public void clear()
-  void clear() => _clear(reference).check();
+  void clear() {
+    return _clear(reference).check();
+  }
 
   static final _containsValue = jniLookup<
           ffi.NativeFunction<
@@ -2469,8 +2926,11 @@
               ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
 
   /// from: public boolean containsValue(java.lang.Object object)
-  bool containsValue(jni.JObject object) =>
-      _containsValue(reference, object.reference).boolean;
+  bool containsValue(
+    jni.JObject object,
+  ) {
+    return _containsValue(reference, object.reference).boolean;
+  }
 
   static final _keySet = jniLookup<
           ffi.NativeFunction<
@@ -2479,8 +2939,9 @@
 
   /// from: public java.util.Set keySet()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  jni.JObject keySet() =>
-      const jni.JObjectType().fromRef(_keySet(reference).object);
+  jni.JObject keySet() {
+    return const jni.JObjectType().fromRef(_keySet(reference).object);
+  }
 
   static final _values = jniLookup<
           ffi.NativeFunction<
@@ -2489,8 +2950,9 @@
 
   /// from: public java.util.Collection values()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  jni.JObject values() =>
-      const jni.JObjectType().fromRef(_values(reference).object);
+  jni.JObject values() {
+    return const jni.JObjectType().fromRef(_values(reference).object);
+  }
 
   static final _entrySet = jniLookup<
           ffi.NativeFunction<
@@ -2500,8 +2962,9 @@
 
   /// from: public java.util.Set entrySet()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  jni.JObject entrySet() =>
-      const jni.JObjectType().fromRef(_entrySet(reference).object);
+  jni.JObject entrySet() {
+    return const jni.JObjectType().fromRef(_entrySet(reference).object);
+  }
 
   static final _getOrDefault = jniLookup<
           ffi.NativeFunction<
@@ -2515,8 +2978,13 @@
 
   /// from: public V getOrDefault(java.lang.Object object, V object1)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  V getOrDefault(jni.JObject object, V object1) => $V.fromRef(
-      _getOrDefault(reference, object.reference, object1.reference).object);
+  $V getOrDefault(
+    jni.JObject object,
+    $V object1,
+  ) {
+    return V.fromRef(
+        _getOrDefault(reference, object.reference, object1.reference).object);
+  }
 
   static final _putIfAbsent = jniLookup<
           ffi.NativeFunction<
@@ -2530,8 +2998,13 @@
 
   /// from: public V putIfAbsent(K object, V object1)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  V putIfAbsent(K object, V object1) => $V.fromRef(
-      _putIfAbsent(reference, object.reference, object1.reference).object);
+  $V putIfAbsent(
+    $K object,
+    $V object1,
+  ) {
+    return V.fromRef(
+        _putIfAbsent(reference, object.reference, object1.reference).object);
+  }
 
   static final _remove1 = jniLookup<
           ffi.NativeFunction<
@@ -2544,8 +3017,12 @@
               ffi.Pointer<ffi.Void>)>();
 
   /// from: public boolean remove(java.lang.Object object, java.lang.Object object1)
-  bool remove1(jni.JObject object, jni.JObject object1) =>
-      _remove1(reference, object.reference, object1.reference).boolean;
+  bool remove1(
+    jni.JObject object,
+    jni.JObject object1,
+  ) {
+    return _remove1(reference, object.reference, object1.reference).boolean;
+  }
 
   static final _replace = jniLookup<
           ffi.NativeFunction<
@@ -2559,9 +3036,15 @@
               ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
 
   /// from: public boolean replace(K object, V object1, V object2)
-  bool replace(K object, V object1, V object2) => _replace(
-          reference, object.reference, object1.reference, object2.reference)
-      .boolean;
+  bool replace(
+    $K object,
+    $V object1,
+    $V object2,
+  ) {
+    return _replace(
+            reference, object.reference, object1.reference, object2.reference)
+        .boolean;
+  }
 
   static final _replace1 = jniLookup<
           ffi.NativeFunction<
@@ -2575,8 +3058,13 @@
 
   /// from: public V replace(K object, V object1)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  V replace1(K object, V object1) => $V.fromRef(
-      _replace1(reference, object.reference, object1.reference).object);
+  $V replace1(
+    $K object,
+    $V object1,
+  ) {
+    return V.fromRef(
+        _replace1(reference, object.reference, object1.reference).object);
+  }
 
   static final _computeIfAbsent = jniLookup<
           ffi.NativeFunction<
@@ -2590,8 +3078,14 @@
 
   /// from: public V computeIfAbsent(K object, java.util.function.Function function)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  V computeIfAbsent(K object, jni.JObject function) => $V.fromRef(
-      _computeIfAbsent(reference, object.reference, function.reference).object);
+  $V computeIfAbsent(
+    $K object,
+    jni.JObject function,
+  ) {
+    return V.fromRef(
+        _computeIfAbsent(reference, object.reference, function.reference)
+            .object);
+  }
 
   static final _computeIfPresent = jniLookup<
           ffi.NativeFunction<
@@ -2605,9 +3099,14 @@
 
   /// from: public V computeIfPresent(K object, java.util.function.BiFunction biFunction)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  V computeIfPresent(K object, jni.JObject biFunction) => $V.fromRef(
-      _computeIfPresent(reference, object.reference, biFunction.reference)
-          .object);
+  $V computeIfPresent(
+    $K object,
+    jni.JObject biFunction,
+  ) {
+    return V.fromRef(
+        _computeIfPresent(reference, object.reference, biFunction.reference)
+            .object);
+  }
 
   static final _compute = jniLookup<
           ffi.NativeFunction<
@@ -2621,8 +3120,13 @@
 
   /// from: public V compute(K object, java.util.function.BiFunction biFunction)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  V compute(K object, jni.JObject biFunction) => $V.fromRef(
-      _compute(reference, object.reference, biFunction.reference).object);
+  $V compute(
+    $K object,
+    jni.JObject biFunction,
+  ) {
+    return V.fromRef(
+        _compute(reference, object.reference, biFunction.reference).object);
+  }
 
   static final _merge = jniLookup<
           ffi.NativeFunction<
@@ -2637,9 +3141,15 @@
 
   /// from: public V merge(K object, V object1, java.util.function.BiFunction biFunction)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  V merge(K object, V object1, jni.JObject biFunction) => $V.fromRef(_merge(
-          reference, object.reference, object1.reference, biFunction.reference)
-      .object);
+  $V merge(
+    $K object,
+    $V object1,
+    jni.JObject biFunction,
+  ) {
+    return V.fromRef(_merge(reference, object.reference, object1.reference,
+            biFunction.reference)
+        .object);
+  }
 
   static final _forEach = jniLookup<
           ffi.NativeFunction<
@@ -2650,8 +3160,11 @@
               ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
 
   /// from: public void forEach(java.util.function.BiConsumer biConsumer)
-  void forEach(jni.JObject biConsumer) =>
-      _forEach(reference, biConsumer.reference).check();
+  void forEach(
+    jni.JObject biConsumer,
+  ) {
+    return _forEach(reference, biConsumer.reference).check();
+  }
 
   static final _replaceAll = jniLookup<
           ffi.NativeFunction<
@@ -2662,8 +3175,11 @@
               ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
 
   /// from: public void replaceAll(java.util.function.BiFunction biFunction)
-  void replaceAll(jni.JObject biFunction) =>
-      _replaceAll(reference, biFunction.reference).check();
+  void replaceAll(
+    jni.JObject biFunction,
+  ) {
+    return _replaceAll(reference, biFunction.reference).check();
+  }
 
   static final _clone = jniLookup<
           ffi.NativeFunction<
@@ -2672,23 +3188,41 @@
 
   /// from: public java.lang.Object clone()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  jni.JObject clone() =>
-      const jni.JObjectType().fromRef(_clone(reference).object);
+  jni.JObject clone() {
+    return const jni.JObjectType().fromRef(_clone(reference).object);
+  }
 }
 
-class $HashMapType<K extends jni.JObject, V extends jni.JObject>
-    extends jni.JObjType<HashMap<K, V>> {
-  final jni.JObjType<K> $K;
-  final jni.JObjType<V> $V;
+class $HashMapType<$K extends jni.JObject, $V extends jni.JObject>
+    extends jni.JObjType<HashMap<$K, $V>> {
+  final jni.JObjType<$K> K;
+  final jni.JObjType<$V> V;
 
   const $HashMapType(
-    this.$K,
-    this.$V,
+    this.K,
+    this.V,
   );
 
   @override
   String get signature => r"Ljava/util/HashMap;";
 
   @override
-  HashMap<K, V> fromRef(jni.JObjectPtr ref) => HashMap.fromRef($K, $V, ref);
+  HashMap<$K, $V> fromRef(jni.JObjectPtr ref) => HashMap.fromRef(K, V, ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => Object.hash($HashMapType, K, V);
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $HashMapType &&
+        other is $HashMapType &&
+        K == other.K &&
+        V == other.V;
+  }
 }
diff --git a/pkgs/jnigen/example/in_app_java/lib/main.dart b/pkgs/jnigen/example/in_app_java/lib/main.dart
index f435428..7765b9c 100644
--- a/pkgs/jnigen/example/in_app_java/lib/main.dart
+++ b/pkgs/jnigen/example/in_app_java/lib/main.dart
@@ -12,7 +12,7 @@
 JObject activity = JObject.fromRef(Jni.getCurrentActivity());
 JObject context = JObject.fromRef(Jni.getCachedApplicationContext());
 
-final hashmap = HashMap.ctor2(JString.type, JString.type);
+final hashmap = HashMap.ctor2(K: JString.type, V: JString.type);
 
 final emojiCompat = EmojiCompat.get0();
 
diff --git a/pkgs/jnigen/example/kotlin_plugin/lib/kotlin_bindings.dart b/pkgs/jnigen/example/kotlin_plugin/lib/kotlin_bindings.dart
index b6a9bca..3485f93 100644
--- a/pkgs/jnigen/example/kotlin_plugin/lib/kotlin_bindings.dart
+++ b/pkgs/jnigen/example/kotlin_plugin/lib/kotlin_bindings.dart
@@ -26,9 +26,8 @@
 
 /// from: Example
 class Example extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   Example.fromRef(
     jni.JObjectPtr ref,
@@ -42,7 +41,9 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  Example() : super.fromRef(_ctor().object);
+  factory Example() {
+    return Example.fromRef(_ctor().object);
+  }
 
   static final _thinkBeforeAnswering = jniLookup<
           ffi.NativeFunction<
@@ -75,4 +76,18 @@
 
   @override
   Example fromRef(jni.JObjectPtr ref) => Example.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($ExampleType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $ExampleType && other is $ExampleType;
+  }
 }
diff --git a/pkgs/jnigen/example/notification_plugin/lib/notifications.dart b/pkgs/jnigen/example/notification_plugin/lib/notifications.dart
index 7d93c7c..5a4d559 100644
--- a/pkgs/jnigen/example/notification_plugin/lib/notifications.dart
+++ b/pkgs/jnigen/example/notification_plugin/lib/notifications.dart
@@ -30,9 +30,8 @@
 
 /// from: com.example.notification_plugin.Notifications
 class Notifications extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   Notifications.fromRef(
     jni.JObjectPtr ref,
@@ -46,7 +45,9 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  Notifications() : super.fromRef(_ctor().object);
+  factory Notifications() {
+    return Notifications.fromRef(_ctor().object);
+  }
 
   static final _showNotification = jniLookup<
           ffi.NativeFunction<
@@ -60,11 +61,16 @@
               ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
 
   /// from: static public void showNotification(android.content.Context context, int notificationID, java.lang.String title, java.lang.String text)
-  static void showNotification(jni.JObject context, int notificationID,
-          jni.JString title, jni.JString text) =>
-      _showNotification(context.reference, notificationID, title.reference,
-              text.reference)
-          .check();
+  static void showNotification(
+    jni.JObject context,
+    int notificationID,
+    jni.JString title,
+    jni.JString text,
+  ) {
+    return _showNotification(
+            context.reference, notificationID, title.reference, text.reference)
+        .check();
+  }
 }
 
 class $NotificationsType extends jni.JObjType<Notifications> {
@@ -75,4 +81,19 @@
 
   @override
   Notifications fromRef(jni.JObjectPtr ref) => Notifications.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($NotificationsType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $NotificationsType &&
+        other is $NotificationsType;
+  }
 }
diff --git a/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/PDDocument.dart b/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/PDDocument.dart
index ebafa96..ec0d860 100644
--- a/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/PDDocument.dart
+++ b/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/PDDocument.dart
@@ -46,9 +46,8 @@
 /// The \#close() method must be called once the document is no longer needed.
 ///@author Ben Litchfield
 class PDDocument extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   PDDocument.fromRef(
     jni.JObjectPtr ref,
@@ -65,7 +64,9 @@
   ///
   /// Creates an empty PDF document.
   /// You need to add at least one page for the document to be valid.
-  PDDocument() : super.fromRef(_ctor().object);
+  factory PDDocument() {
+    return PDDocument.fromRef(_ctor().object);
+  }
 
   static final _ctor1 = jniLookup<
           ffi.NativeFunction<
@@ -79,8 +80,11 @@
   /// Creates an empty PDF document.
   /// You need to add at least one page for the document to be valid.
   ///@param memUsageSetting defines how memory is used for buffering PDF streams
-  PDDocument.ctor1(jni.JObject memUsageSetting)
-      : super.fromRef(_ctor1(memUsageSetting.reference).object);
+  factory PDDocument.ctor1(
+    jni.JObject memUsageSetting,
+  ) {
+    return PDDocument.fromRef(_ctor1(memUsageSetting.reference).object);
+  }
 
   static final _ctor2 = jniLookup<
           ffi.NativeFunction<
@@ -93,8 +97,11 @@
   ///
   /// Constructor that uses an existing document. The COSDocument that is passed in must be valid.
   ///@param doc The COSDocument that this document wraps.
-  PDDocument.ctor2(jni.JObject doc)
-      : super.fromRef(_ctor2(doc.reference).object);
+  factory PDDocument.ctor2(
+    jni.JObject doc,
+  ) {
+    return PDDocument.fromRef(_ctor2(doc.reference).object);
+  }
 
   static final _ctor3 = jniLookup<
           ffi.NativeFunction<
@@ -110,8 +117,12 @@
   /// Constructor that uses an existing document. The COSDocument that is passed in must be valid.
   ///@param doc The COSDocument that this document wraps.
   ///@param source the parser which is used to read the pdf
-  PDDocument.ctor3(jni.JObject doc, jni.JObject source)
-      : super.fromRef(_ctor3(doc.reference, source.reference).object);
+  factory PDDocument.ctor3(
+    jni.JObject doc,
+    jni.JObject source,
+  ) {
+    return PDDocument.fromRef(_ctor3(doc.reference, source.reference).object);
+  }
 
   static final _ctor4 = jniLookup<
           ffi.NativeFunction<
@@ -130,10 +141,14 @@
   ///@param doc The COSDocument that this document wraps.
   ///@param source the parser which is used to read the pdf
   ///@param permission he access permissions of the pdf
-  PDDocument.ctor4(jni.JObject doc, jni.JObject source, jni.JObject permission)
-      : super.fromRef(
-            _ctor4(doc.reference, source.reference, permission.reference)
-                .object);
+  factory PDDocument.ctor4(
+    jni.JObject doc,
+    jni.JObject source,
+    jni.JObject permission,
+  ) {
+    return PDDocument.fromRef(
+        _ctor4(doc.reference, source.reference, permission.reference).object);
+  }
 
   static final _addPage = jniLookup<
           ffi.NativeFunction<
@@ -148,7 +163,11 @@
   /// This will add a page to the document. This is a convenience method, that will add the page to the root of the
   /// hierarchy and set the parent of the page to the root.
   ///@param page The page to add to the document.
-  void addPage(jni.JObject page) => _addPage(reference, page.reference).check();
+  void addPage(
+    jni.JObject page,
+  ) {
+    return _addPage(reference, page.reference).check();
+  }
 
   static final _addSignature = jniLookup<
           ffi.NativeFunction<
@@ -170,8 +189,11 @@
   ///@throws IOException if there is an error creating required fields
   ///@throws IllegalStateException if one attempts to add several signature
   /// fields.
-  void addSignature(jni.JObject sigObject) =>
-      _addSignature(reference, sigObject.reference).check();
+  void addSignature(
+    jni.JObject sigObject,
+  ) {
+    return _addSignature(reference, sigObject.reference).check();
+  }
 
   static final _addSignature1 = jniLookup<
           ffi.NativeFunction<
@@ -196,8 +218,13 @@
   ///@throws IOException if there is an error creating required fields
   ///@throws IllegalStateException if one attempts to add several signature
   /// fields.
-  void addSignature1(jni.JObject sigObject, jni.JObject options) =>
-      _addSignature1(reference, sigObject.reference, options.reference).check();
+  void addSignature1(
+    jni.JObject sigObject,
+    jni.JObject options,
+  ) {
+    return _addSignature1(reference, sigObject.reference, options.reference)
+        .check();
+  }
 
   static final _addSignature2 = jniLookup<
           ffi.NativeFunction<
@@ -221,10 +248,14 @@
   ///@throws IOException if there is an error creating required fields
   ///@throws IllegalStateException if one attempts to add several signature
   /// fields.
-  void addSignature2(jni.JObject sigObject, jni.JObject signatureInterface) =>
-      _addSignature2(
-              reference, sigObject.reference, signatureInterface.reference)
-          .check();
+  void addSignature2(
+    jni.JObject sigObject,
+    jni.JObject signatureInterface,
+  ) {
+    return _addSignature2(
+            reference, sigObject.reference, signatureInterface.reference)
+        .check();
+  }
 
   static final _addSignature3 = jniLookup<
           ffi.NativeFunction<
@@ -252,11 +283,15 @@
   ///@throws IOException if there is an error creating required fields
   ///@throws IllegalStateException if one attempts to add several signature
   /// fields.
-  void addSignature3(jni.JObject sigObject, jni.JObject signatureInterface,
-          jni.JObject options) =>
-      _addSignature3(reference, sigObject.reference,
-              signatureInterface.reference, options.reference)
-          .check();
+  void addSignature3(
+    jni.JObject sigObject,
+    jni.JObject signatureInterface,
+    jni.JObject options,
+  ) {
+    return _addSignature3(reference, sigObject.reference,
+            signatureInterface.reference, options.reference)
+        .check();
+  }
 
   static final _addSignatureField = jniLookup<
           ffi.NativeFunction<
@@ -279,11 +314,15 @@
   ///@throws IOException if there is an error creating required fields
   ///@deprecated The method is misleading, because only one signature may be
   /// added in a document. The method will be removed in the future.
-  void addSignatureField(jni.JObject sigFields, jni.JObject signatureInterface,
-          jni.JObject options) =>
-      _addSignatureField(reference, sigFields.reference,
-              signatureInterface.reference, options.reference)
-          .check();
+  void addSignatureField(
+    jni.JObject sigFields,
+    jni.JObject signatureInterface,
+    jni.JObject options,
+  ) {
+    return _addSignatureField(reference, sigFields.reference,
+            signatureInterface.reference, options.reference)
+        .check();
+  }
 
   static final _removePage = jniLookup<
           ffi.NativeFunction<
@@ -297,8 +336,11 @@
   ///
   /// Remove the page from the document.
   ///@param page The page to remove from the document.
-  void removePage(jni.JObject page) =>
-      _removePage(reference, page.reference).check();
+  void removePage(
+    jni.JObject page,
+  ) {
+    return _removePage(reference, page.reference).check();
+  }
 
   static final _removePage1 = jniLookup<
           ffi.NativeFunction<
@@ -310,8 +352,11 @@
   ///
   /// Remove the page from the document.
   ///@param pageNumber 0 based index to page number.
-  void removePage1(int pageNumber) =>
-      _removePage1(reference, pageNumber).check();
+  void removePage1(
+    int pageNumber,
+  ) {
+    return _removePage1(reference, pageNumber).check();
+  }
 
   static final _importPage = jniLookup<
           ffi.NativeFunction<
@@ -345,8 +390,12 @@
   ///@param page The page to import.
   ///@return The page that was imported.
   ///@throws IOException If there is an error copying the page.
-  jni.JObject importPage(jni.JObject page) => const jni.JObjectType()
-      .fromRef(_importPage(reference, page.reference).object);
+  jni.JObject importPage(
+    jni.JObject page,
+  ) {
+    return const jni.JObjectType()
+        .fromRef(_importPage(reference, page.reference).object);
+  }
 
   static final _getDocument = jniLookup<
           ffi.NativeFunction<
@@ -359,8 +408,9 @@
   ///
   /// This will get the low level document.
   ///@return The document that this layer sits on top of.
-  jni.JObject getDocument() =>
-      const jni.JObjectType().fromRef(_getDocument(reference).object);
+  jni.JObject getDocument() {
+    return const jni.JObjectType().fromRef(_getDocument(reference).object);
+  }
 
   static final _getDocumentInformation = jniLookup<
           ffi.NativeFunction<
@@ -378,9 +428,10 @@
   /// document level metadata, a metadata stream should be used instead, see
   /// PDDocumentCatalog\#getMetadata().
   ///@return The documents /Info dictionary, never null.
-  pddocumentinformation_.PDDocumentInformation getDocumentInformation() =>
-      const pddocumentinformation_.$PDDocumentInformationType()
-          .fromRef(_getDocumentInformation(reference).object);
+  pddocumentinformation_.PDDocumentInformation getDocumentInformation() {
+    return const pddocumentinformation_.$PDDocumentInformationType()
+        .fromRef(_getDocumentInformation(reference).object);
+  }
 
   static final _setDocumentInformation = jniLookup<
           ffi.NativeFunction<
@@ -399,8 +450,10 @@
   /// PDDocumentCatalog\#setMetadata(org.apache.pdfbox.pdmodel.common.PDMetadata) PDDocumentCatalog\#setMetadata(PDMetadata).
   ///@param info The updated document information.
   void setDocumentInformation(
-          pddocumentinformation_.PDDocumentInformation info) =>
-      _setDocumentInformation(reference, info.reference).check();
+    pddocumentinformation_.PDDocumentInformation info,
+  ) {
+    return _setDocumentInformation(reference, info.reference).check();
+  }
 
   static final _getDocumentCatalog = jniLookup<
           ffi.NativeFunction<
@@ -413,8 +466,10 @@
   ///
   /// This will get the document CATALOG. This is guaranteed to not return null.
   ///@return The documents /Root dictionary
-  jni.JObject getDocumentCatalog() =>
-      const jni.JObjectType().fromRef(_getDocumentCatalog(reference).object);
+  jni.JObject getDocumentCatalog() {
+    return const jni.JObjectType()
+        .fromRef(_getDocumentCatalog(reference).object);
+  }
 
   static final _isEncrypted = jniLookup<
           ffi.NativeFunction<
@@ -426,7 +481,9 @@
   ///
   /// This will tell if this document is encrypted or not.
   ///@return true If this document is encrypted.
-  bool isEncrypted() => _isEncrypted(reference).boolean;
+  bool isEncrypted() {
+    return _isEncrypted(reference).boolean;
+  }
 
   static final _getEncryption = jniLookup<
           ffi.NativeFunction<
@@ -442,8 +499,9 @@
   /// but the only supported subclass at this time is a
   /// PDStandardEncryption object.
   ///@return The encryption dictionary(most likely a PDStandardEncryption object)
-  jni.JObject getEncryption() =>
-      const jni.JObjectType().fromRef(_getEncryption(reference).object);
+  jni.JObject getEncryption() {
+    return const jni.JObjectType().fromRef(_getEncryption(reference).object);
+  }
 
   static final _setEncryptionDictionary = jniLookup<
               ffi.NativeFunction<
@@ -459,8 +517,11 @@
   /// This will set the encryption dictionary for this document.
   ///@param encryption The encryption dictionary(most likely a PDStandardEncryption object)
   ///@throws IOException If there is an error determining which security handler to use.
-  void setEncryptionDictionary(jni.JObject encryption) =>
-      _setEncryptionDictionary(reference, encryption.reference).check();
+  void setEncryptionDictionary(
+    jni.JObject encryption,
+  ) {
+    return _setEncryptionDictionary(reference, encryption.reference).check();
+  }
 
   static final _getLastSignatureDictionary = jniLookup<
               ffi.NativeFunction<
@@ -475,8 +536,10 @@
   /// last in time when empty signature fields are created first but signed after other fields.
   ///@return the last signature as <code>PDSignatureField</code>.
   ///@throws IOException if no document catalog can be found.
-  jni.JObject getLastSignatureDictionary() => const jni.JObjectType()
-      .fromRef(_getLastSignatureDictionary(reference).object);
+  jni.JObject getLastSignatureDictionary() {
+    return const jni.JObjectType()
+        .fromRef(_getLastSignatureDictionary(reference).object);
+  }
 
   static final _getSignatureFields = jniLookup<
           ffi.NativeFunction<
@@ -490,8 +553,10 @@
   /// Retrieve all signature fields from the document.
   ///@return a <code>List</code> of <code>PDSignatureField</code>s
   ///@throws IOException if no document catalog can be found.
-  jni.JObject getSignatureFields() =>
-      const jni.JObjectType().fromRef(_getSignatureFields(reference).object);
+  jni.JObject getSignatureFields() {
+    return const jni.JObjectType()
+        .fromRef(_getSignatureFields(reference).object);
+  }
 
   static final _getSignatureDictionaries = jniLookup<
               ffi.NativeFunction<
@@ -505,8 +570,10 @@
   /// Retrieve all signature dictionaries from the document.
   ///@return a <code>List</code> of <code>PDSignatureField</code>s
   ///@throws IOException if no document catalog can be found.
-  jni.JObject getSignatureDictionaries() => const jni.JObjectType()
-      .fromRef(_getSignatureDictionaries(reference).object);
+  jni.JObject getSignatureDictionaries() {
+    return const jni.JObjectType()
+        .fromRef(_getSignatureDictionaries(reference).object);
+  }
 
   static final _registerTrueTypeFontForClosing = jniLookup<
               ffi.NativeFunction<
@@ -523,8 +590,11 @@
   /// is closed when the PDDocument is closed to avoid memory leaks. Users don't have to call this
   /// method, it is done by the appropriate PDFont classes.
   ///@param ttf
-  void registerTrueTypeFontForClosing(jni.JObject ttf) =>
-      _registerTrueTypeFontForClosing(reference, ttf.reference).check();
+  void registerTrueTypeFontForClosing(
+    jni.JObject ttf,
+  ) {
+    return _registerTrueTypeFontForClosing(reference, ttf.reference).check();
+  }
 
   static final _load = jniLookup<
           ffi.NativeFunction<
@@ -540,8 +610,11 @@
   ///@return loaded document
   ///@throws InvalidPasswordException If the file required a non-empty password.
   ///@throws IOException in case of a file reading or parsing error
-  static PDDocument load(jni.JObject file) =>
-      const $PDDocumentType().fromRef(_load(file.reference).object);
+  static PDDocument load(
+    jni.JObject file,
+  ) {
+    return const $PDDocumentType().fromRef(_load(file.reference).object);
+  }
 
   static final _load1 = jniLookup<
           ffi.NativeFunction<
@@ -560,9 +633,13 @@
   ///@return loaded document
   ///@throws InvalidPasswordException If the file required a non-empty password.
   ///@throws IOException in case of a file reading or parsing error
-  static PDDocument load1(jni.JObject file, jni.JObject memUsageSetting) =>
-      const $PDDocumentType()
-          .fromRef(_load1(file.reference, memUsageSetting.reference).object);
+  static PDDocument load1(
+    jni.JObject file,
+    jni.JObject memUsageSetting,
+  ) {
+    return const $PDDocumentType()
+        .fromRef(_load1(file.reference, memUsageSetting.reference).object);
+  }
 
   static final _load2 = jniLookup<
           ffi.NativeFunction<
@@ -581,9 +658,13 @@
   ///@return loaded document
   ///@throws InvalidPasswordException If the password is incorrect.
   ///@throws IOException in case of a file reading or parsing error
-  static PDDocument load2(jni.JObject file, jni.JString password) =>
-      const $PDDocumentType()
-          .fromRef(_load2(file.reference, password.reference).object);
+  static PDDocument load2(
+    jni.JObject file,
+    jni.JString password,
+  ) {
+    return const $PDDocumentType()
+        .fromRef(_load2(file.reference, password.reference).object);
+  }
 
   static final _load3 = jniLookup<
           ffi.NativeFunction<
@@ -605,11 +686,15 @@
   ///@return loaded document
   ///@throws InvalidPasswordException If the password is incorrect.
   ///@throws IOException in case of a file reading or parsing error
-  static PDDocument load3(jni.JObject file, jni.JString password,
-          jni.JObject memUsageSetting) =>
-      const $PDDocumentType().fromRef(
-          _load3(file.reference, password.reference, memUsageSetting.reference)
-              .object);
+  static PDDocument load3(
+    jni.JObject file,
+    jni.JString password,
+    jni.JObject memUsageSetting,
+  ) {
+    return const $PDDocumentType().fromRef(
+        _load3(file.reference, password.reference, memUsageSetting.reference)
+            .object);
+  }
 
   static final _load4 = jniLookup<
           ffi.NativeFunction<
@@ -632,11 +717,16 @@
   ///@param alias alias to be used for decryption when using public key security
   ///@return loaded document
   ///@throws IOException in case of a file reading or parsing error
-  static PDDocument load4(jni.JObject file, jni.JString password,
-          jni.JObject keyStore, jni.JString alias) =>
-      const $PDDocumentType().fromRef(_load4(file.reference, password.reference,
-              keyStore.reference, alias.reference)
-          .object);
+  static PDDocument load4(
+    jni.JObject file,
+    jni.JString password,
+    jni.JObject keyStore,
+    jni.JString alias,
+  ) {
+    return const $PDDocumentType().fromRef(_load4(file.reference,
+            password.reference, keyStore.reference, alias.reference)
+        .object);
+  }
 
   static final _load5 = jniLookup<
           ffi.NativeFunction<
@@ -666,14 +756,20 @@
   ///@return loaded document
   ///@throws IOException in case of a file reading or parsing error
   static PDDocument load5(
-          jni.JObject file,
-          jni.JString password,
-          jni.JObject keyStore,
-          jni.JString alias,
-          jni.JObject memUsageSetting) =>
-      const $PDDocumentType().fromRef(_load5(file.reference, password.reference,
-              keyStore.reference, alias.reference, memUsageSetting.reference)
-          .object);
+    jni.JObject file,
+    jni.JString password,
+    jni.JObject keyStore,
+    jni.JString alias,
+    jni.JObject memUsageSetting,
+  ) {
+    return const $PDDocumentType().fromRef(_load5(
+            file.reference,
+            password.reference,
+            keyStore.reference,
+            alias.reference,
+            memUsageSetting.reference)
+        .object);
+  }
 
   static final _load6 = jniLookup<
           ffi.NativeFunction<
@@ -690,8 +786,11 @@
   ///@return loaded document
   ///@throws InvalidPasswordException If the PDF required a non-empty password.
   ///@throws IOException In case of a reading or parsing error.
-  static PDDocument load6(jni.JObject input) =>
-      const $PDDocumentType().fromRef(_load6(input.reference).object);
+  static PDDocument load6(
+    jni.JObject input,
+  ) {
+    return const $PDDocumentType().fromRef(_load6(input.reference).object);
+  }
 
   static final _load7 = jniLookup<
           ffi.NativeFunction<
@@ -711,9 +810,13 @@
   ///@return loaded document
   ///@throws InvalidPasswordException If the PDF required a non-empty password.
   ///@throws IOException In case of a reading or parsing error.
-  static PDDocument load7(jni.JObject input, jni.JObject memUsageSetting) =>
-      const $PDDocumentType()
-          .fromRef(_load7(input.reference, memUsageSetting.reference).object);
+  static PDDocument load7(
+    jni.JObject input,
+    jni.JObject memUsageSetting,
+  ) {
+    return const $PDDocumentType()
+        .fromRef(_load7(input.reference, memUsageSetting.reference).object);
+  }
 
   static final _load8 = jniLookup<
           ffi.NativeFunction<
@@ -733,9 +836,13 @@
   ///@return loaded document
   ///@throws InvalidPasswordException If the password is incorrect.
   ///@throws IOException In case of a reading or parsing error.
-  static PDDocument load8(jni.JObject input, jni.JString password) =>
-      const $PDDocumentType()
-          .fromRef(_load8(input.reference, password.reference).object);
+  static PDDocument load8(
+    jni.JObject input,
+    jni.JString password,
+  ) {
+    return const $PDDocumentType()
+        .fromRef(_load8(input.reference, password.reference).object);
+  }
 
   static final _load9 = jniLookup<
           ffi.NativeFunction<
@@ -759,11 +866,16 @@
   ///@param alias alias to be used for decryption when using public key security
   ///@return loaded document
   ///@throws IOException In case of a reading or parsing error.
-  static PDDocument load9(jni.JObject input, jni.JString password,
-          jni.JObject keyStore, jni.JString alias) =>
-      const $PDDocumentType().fromRef(_load9(input.reference,
-              password.reference, keyStore.reference, alias.reference)
-          .object);
+  static PDDocument load9(
+    jni.JObject input,
+    jni.JString password,
+    jni.JObject keyStore,
+    jni.JString alias,
+  ) {
+    return const $PDDocumentType().fromRef(_load9(input.reference,
+            password.reference, keyStore.reference, alias.reference)
+        .object);
+  }
 
   static final _load10 = jniLookup<
           ffi.NativeFunction<
@@ -786,11 +898,15 @@
   ///@return loaded document
   ///@throws InvalidPasswordException If the password is incorrect.
   ///@throws IOException In case of a reading or parsing error.
-  static PDDocument load10(jni.JObject input, jni.JString password,
-          jni.JObject memUsageSetting) =>
-      const $PDDocumentType().fromRef(_load10(
-              input.reference, password.reference, memUsageSetting.reference)
-          .object);
+  static PDDocument load10(
+    jni.JObject input,
+    jni.JString password,
+    jni.JObject memUsageSetting,
+  ) {
+    return const $PDDocumentType().fromRef(
+        _load10(input.reference, password.reference, memUsageSetting.reference)
+            .object);
+  }
 
   static final _load11 = jniLookup<
           ffi.NativeFunction<
@@ -822,18 +938,20 @@
   ///@throws InvalidPasswordException If the password is incorrect.
   ///@throws IOException In case of a reading or parsing error.
   static PDDocument load11(
-          jni.JObject input,
-          jni.JString password,
-          jni.JObject keyStore,
-          jni.JString alias,
-          jni.JObject memUsageSetting) =>
-      const $PDDocumentType().fromRef(_load11(
-              input.reference,
-              password.reference,
-              keyStore.reference,
-              alias.reference,
-              memUsageSetting.reference)
-          .object);
+    jni.JObject input,
+    jni.JString password,
+    jni.JObject keyStore,
+    jni.JString alias,
+    jni.JObject memUsageSetting,
+  ) {
+    return const $PDDocumentType().fromRef(_load11(
+            input.reference,
+            password.reference,
+            keyStore.reference,
+            alias.reference,
+            memUsageSetting.reference)
+        .object);
+  }
 
   static final _load12 = jniLookup<
           ffi.NativeFunction<
@@ -849,8 +967,11 @@
   ///@return loaded document
   ///@throws InvalidPasswordException If the PDF required a non-empty password.
   ///@throws IOException In case of a reading or parsing error.
-  static PDDocument load12(jni.JArray<jni.JByte> input) =>
-      const $PDDocumentType().fromRef(_load12(input.reference).object);
+  static PDDocument load12(
+    jni.JArray<jni.JByte> input,
+  ) {
+    return const $PDDocumentType().fromRef(_load12(input.reference).object);
+  }
 
   static final _load13 = jniLookup<
           ffi.NativeFunction<
@@ -869,9 +990,13 @@
   ///@return loaded document
   ///@throws InvalidPasswordException If the password is incorrect.
   ///@throws IOException In case of a reading or parsing error.
-  static PDDocument load13(jni.JArray<jni.JByte> input, jni.JString password) =>
-      const $PDDocumentType()
-          .fromRef(_load13(input.reference, password.reference).object);
+  static PDDocument load13(
+    jni.JArray<jni.JByte> input,
+    jni.JString password,
+  ) {
+    return const $PDDocumentType()
+        .fromRef(_load13(input.reference, password.reference).object);
+  }
 
   static final _load14 = jniLookup<
           ffi.NativeFunction<
@@ -895,11 +1020,16 @@
   ///@return loaded document
   ///@throws InvalidPasswordException If the password is incorrect.
   ///@throws IOException In case of a reading or parsing error.
-  static PDDocument load14(jni.JArray<jni.JByte> input, jni.JString password,
-          jni.JObject keyStore, jni.JString alias) =>
-      const $PDDocumentType().fromRef(_load14(input.reference,
-              password.reference, keyStore.reference, alias.reference)
-          .object);
+  static PDDocument load14(
+    jni.JArray<jni.JByte> input,
+    jni.JString password,
+    jni.JObject keyStore,
+    jni.JString alias,
+  ) {
+    return const $PDDocumentType().fromRef(_load14(input.reference,
+            password.reference, keyStore.reference, alias.reference)
+        .object);
+  }
 
   static final _load15 = jniLookup<
           ffi.NativeFunction<
@@ -930,18 +1060,20 @@
   ///@throws InvalidPasswordException If the password is incorrect.
   ///@throws IOException In case of a reading or parsing error.
   static PDDocument load15(
-          jni.JArray<jni.JByte> input,
-          jni.JString password,
-          jni.JObject keyStore,
-          jni.JString alias,
-          jni.JObject memUsageSetting) =>
-      const $PDDocumentType().fromRef(_load15(
-              input.reference,
-              password.reference,
-              keyStore.reference,
-              alias.reference,
-              memUsageSetting.reference)
-          .object);
+    jni.JArray<jni.JByte> input,
+    jni.JString password,
+    jni.JObject keyStore,
+    jni.JString alias,
+    jni.JObject memUsageSetting,
+  ) {
+    return const $PDDocumentType().fromRef(_load15(
+            input.reference,
+            password.reference,
+            keyStore.reference,
+            alias.reference,
+            memUsageSetting.reference)
+        .object);
+  }
 
   static final _save = jniLookup<
           ffi.NativeFunction<
@@ -960,8 +1092,11 @@
   /// do not use the document after saving because the contents are now encrypted.
   ///@param fileName The file to save as.
   ///@throws IOException if the output could not be written
-  void save(jni.JString fileName) =>
-      _save(reference, fileName.reference).check();
+  void save(
+    jni.JString fileName,
+  ) {
+    return _save(reference, fileName.reference).check();
+  }
 
   static final _save1 = jniLookup<
           ffi.NativeFunction<
@@ -980,7 +1115,11 @@
   /// do not use the document after saving because the contents are now encrypted.
   ///@param file The file to save as.
   ///@throws IOException if the output could not be written
-  void save1(jni.JObject file) => _save1(reference, file.reference).check();
+  void save1(
+    jni.JObject file,
+  ) {
+    return _save1(reference, file.reference).check();
+  }
 
   static final _save2 = jniLookup<
           ffi.NativeFunction<
@@ -1000,7 +1139,11 @@
   ///@param output The stream to write to. It will be closed when done. It is recommended to wrap
   /// it in a java.io.BufferedOutputStream, unless it is already buffered.
   ///@throws IOException if the output could not be written
-  void save2(jni.JObject output) => _save2(reference, output.reference).check();
+  void save2(
+    jni.JObject output,
+  ) {
+    return _save2(reference, output.reference).check();
+  }
 
   static final _saveIncremental = jniLookup<
           ffi.NativeFunction<
@@ -1025,8 +1168,11 @@
   /// harmed!
   ///@throws IOException if the output could not be written
   ///@throws IllegalStateException if the document was not loaded from a file or a stream.
-  void saveIncremental(jni.JObject output) =>
-      _saveIncremental(reference, output.reference).check();
+  void saveIncremental(
+    jni.JObject output,
+  ) {
+    return _saveIncremental(reference, output.reference).check();
+  }
 
   static final _saveIncremental1 = jniLookup<
           ffi.NativeFunction<
@@ -1058,9 +1204,14 @@
   ///@param objectsToWrite objects that __must__ be part of the incremental saving.
   ///@throws IOException if the output could not be written
   ///@throws IllegalStateException if the document was not loaded from a file or a stream.
-  void saveIncremental1(jni.JObject output, jni.JObject objectsToWrite) =>
-      _saveIncremental1(reference, output.reference, objectsToWrite.reference)
-          .check();
+  void saveIncremental1(
+    jni.JObject output,
+    jni.JObject objectsToWrite,
+  ) {
+    return _saveIncremental1(
+            reference, output.reference, objectsToWrite.reference)
+        .check();
+  }
 
   static final _saveIncrementalForExternalSigning = jniLookup<
               ffi.NativeFunction<
@@ -1111,10 +1262,12 @@
   ///@throws IOException if the output could not be written
   ///@throws IllegalStateException if the document was not loaded from a file or a stream or
   /// signature options were not set.
-  jni.JObject saveIncrementalForExternalSigning(jni.JObject output) =>
-      const jni.JObjectType().fromRef(
-          _saveIncrementalForExternalSigning(reference, output.reference)
-              .object);
+  jni.JObject saveIncrementalForExternalSigning(
+    jni.JObject output,
+  ) {
+    return const jni.JObjectType().fromRef(
+        _saveIncrementalForExternalSigning(reference, output.reference).object);
+  }
 
   static final _getPage = jniLookup<
           ffi.NativeFunction<
@@ -1132,8 +1285,12 @@
   /// PDDocument\#getPages() instead.
   ///@param pageIndex the 0-based page index
   ///@return the page at the given index.
-  jni.JObject getPage(int pageIndex) =>
-      const jni.JObjectType().fromRef(_getPage(reference, pageIndex).object);
+  jni.JObject getPage(
+    int pageIndex,
+  ) {
+    return const jni.JObjectType()
+        .fromRef(_getPage(reference, pageIndex).object);
+  }
 
   static final _getPages = jniLookup<
           ffi.NativeFunction<
@@ -1146,8 +1303,9 @@
   ///
   /// Returns the page tree.
   ///@return the page tree
-  jni.JObject getPages() =>
-      const jni.JObjectType().fromRef(_getPages(reference).object);
+  jni.JObject getPages() {
+    return const jni.JObjectType().fromRef(_getPages(reference).object);
+  }
 
   static final _getNumberOfPages = jniLookup<
           ffi.NativeFunction<
@@ -1159,7 +1317,9 @@
   ///
   /// This will return the total page count of the PDF document.
   ///@return The total number of pages in the PDF document.
-  int getNumberOfPages() => _getNumberOfPages(reference).integer;
+  int getNumberOfPages() {
+    return _getNumberOfPages(reference).integer;
+  }
 
   static final _close = jniLookup<
           ffi.NativeFunction<
@@ -1171,7 +1331,9 @@
   ///
   /// This will close the underlying COSDocument object.
   ///@throws IOException If there is an error releasing resources.
-  void close() => _close(reference).check();
+  void close() {
+    return _close(reference).check();
+  }
 
   static final _protect = jniLookup<
           ffi.NativeFunction<
@@ -1193,8 +1355,11 @@
   ///@see org.apache.pdfbox.pdmodel.encryption.PublicKeyProtectionPolicy
   ///@param policy The protection policy.
   ///@throws IOException if there isn't any suitable security handler.
-  void protect(jni.JObject policy) =>
-      _protect(reference, policy.reference).check();
+  void protect(
+    jni.JObject policy,
+  ) {
+    return _protect(reference, policy.reference).check();
+  }
 
   static final _getCurrentAccessPermission = jniLookup<
               ffi.NativeFunction<
@@ -1210,8 +1375,10 @@
   /// only mode so that permissions cannot be changed. Methods providing access to content should rely on this object
   /// to verify if the current user is allowed to proceed.
   ///@return the access permissions for the current user on the document.
-  jni.JObject getCurrentAccessPermission() => const jni.JObjectType()
-      .fromRef(_getCurrentAccessPermission(reference).object);
+  jni.JObject getCurrentAccessPermission() {
+    return const jni.JObjectType()
+        .fromRef(_getCurrentAccessPermission(reference).object);
+  }
 
   static final _isAllSecurityToBeRemoved = jniLookup<
               ffi.NativeFunction<
@@ -1223,8 +1390,9 @@
   ///
   /// Indicates if all security is removed or not when writing the pdf.
   ///@return returns true if all security shall be removed otherwise false
-  bool isAllSecurityToBeRemoved() =>
-      _isAllSecurityToBeRemoved(reference).boolean;
+  bool isAllSecurityToBeRemoved() {
+    return _isAllSecurityToBeRemoved(reference).boolean;
+  }
 
   static final _setAllSecurityToBeRemoved = jniLookup<
           ffi.NativeFunction<
@@ -1236,8 +1404,12 @@
   ///
   /// Activates/Deactivates the removal of all security when writing the pdf.
   ///@param removeAllSecurity remove all security if set to true
-  void setAllSecurityToBeRemoved(bool removeAllSecurity) =>
-      _setAllSecurityToBeRemoved(reference, removeAllSecurity ? 1 : 0).check();
+  void setAllSecurityToBeRemoved(
+    bool removeAllSecurity,
+  ) {
+    return _setAllSecurityToBeRemoved(reference, removeAllSecurity ? 1 : 0)
+        .check();
+  }
 
   static final _getDocumentId = jniLookup<
           ffi.NativeFunction<
@@ -1250,8 +1422,9 @@
   ///
   /// Provides the document ID.
   ///@return the document ID
-  jni.JObject getDocumentId() =>
-      const jni.JObjectType().fromRef(_getDocumentId(reference).object);
+  jni.JObject getDocumentId() {
+    return const jni.JObjectType().fromRef(_getDocumentId(reference).object);
+  }
 
   static final _setDocumentId = jniLookup<
           ffi.NativeFunction<
@@ -1265,8 +1438,11 @@
   ///
   /// Sets the document ID to the given value.
   ///@param docId the new document ID
-  void setDocumentId(jni.JObject docId) =>
-      _setDocumentId(reference, docId.reference).check();
+  void setDocumentId(
+    jni.JObject docId,
+  ) {
+    return _setDocumentId(reference, docId.reference).check();
+  }
 
   static final _getVersion = jniLookup<
           ffi.NativeFunction<
@@ -1278,7 +1454,9 @@
   ///
   /// Returns the PDF specification version this document conforms to.
   ///@return the PDF version (e.g. 1.4f)
-  double getVersion() => _getVersion(reference).float;
+  double getVersion() {
+    return _getVersion(reference).float;
+  }
 
   static final _setVersion = jniLookup<
           ffi.NativeFunction<
@@ -1290,8 +1468,11 @@
   ///
   /// Sets the PDF specification version for this document.
   ///@param newVersion the new PDF version (e.g. 1.4f)
-  void setVersion(double newVersion) =>
-      _setVersion(reference, newVersion).check();
+  void setVersion(
+    double newVersion,
+  ) {
+    return _setVersion(reference, newVersion).check();
+  }
 
   static final _getResourceCache = jniLookup<
           ffi.NativeFunction<
@@ -1304,8 +1485,9 @@
   ///
   /// Returns the resource cache associated with this document, or null if there is none.
   ///@return the resource cache or null.
-  jni.JObject getResourceCache() =>
-      const jni.JObjectType().fromRef(_getResourceCache(reference).object);
+  jni.JObject getResourceCache() {
+    return const jni.JObjectType().fromRef(_getResourceCache(reference).object);
+  }
 
   static final _setResourceCache = jniLookup<
           ffi.NativeFunction<
@@ -1319,8 +1501,11 @@
   ///
   /// Sets the resource cache associated with this document.
   ///@param resourceCache A resource cache, or null.
-  void setResourceCache(jni.JObject resourceCache) =>
-      _setResourceCache(reference, resourceCache.reference).check();
+  void setResourceCache(
+    jni.JObject resourceCache,
+  ) {
+    return _setResourceCache(reference, resourceCache.reference).check();
+  }
 }
 
 class $PDDocumentType extends jni.JObjType<PDDocument> {
@@ -1331,4 +1516,18 @@
 
   @override
   PDDocument fromRef(jni.JObjectPtr ref) => PDDocument.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($PDDocumentType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $PDDocumentType && other is $PDDocumentType;
+  }
 }
diff --git a/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/PDDocumentInformation.dart b/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/PDDocumentInformation.dart
index bcb2655..90134bc 100644
--- a/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/PDDocumentInformation.dart
+++ b/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/PDDocumentInformation.dart
@@ -47,9 +47,8 @@
 ///@author Ben Litchfield
 ///@author Gerardo Ortiz
 class PDDocumentInformation extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   PDDocumentInformation.fromRef(
     jni.JObjectPtr ref,
@@ -65,7 +64,9 @@
   /// The returned object must be deleted after use, by calling the `delete` method.
   ///
   /// Default Constructor.
-  PDDocumentInformation() : super.fromRef(_ctor().object);
+  factory PDDocumentInformation() {
+    return PDDocumentInformation.fromRef(_ctor().object);
+  }
 
   static final _ctor1 = jniLookup<
           ffi.NativeFunction<
@@ -78,8 +79,11 @@
   ///
   /// Constructor that is used for a preexisting dictionary.
   ///@param dic The underlying dictionary.
-  PDDocumentInformation.ctor1(jni.JObject dic)
-      : super.fromRef(_ctor1(dic.reference).object);
+  factory PDDocumentInformation.ctor1(
+    jni.JObject dic,
+  ) {
+    return PDDocumentInformation.fromRef(_ctor1(dic.reference).object);
+  }
 
   static final _getCOSObject = jniLookup<
               ffi.NativeFunction<
@@ -92,8 +96,9 @@
   ///
   /// This will get the underlying dictionary that this object wraps.
   ///@return The underlying info dictionary.
-  jni.JObject getCOSObject() =>
-      const jni.JObjectType().fromRef(_getCOSObject(reference).object);
+  jni.JObject getCOSObject() {
+    return const jni.JObjectType().fromRef(_getCOSObject(reference).object);
+  }
 
   static final _getPropertyStringValue = jniLookup<
               ffi.NativeFunction<
@@ -115,9 +120,12 @@
   ///
   ///@param propertyKey the dictionaries key
   ///@return the properties value
-  jni.JObject getPropertyStringValue(jni.JString propertyKey) =>
-      const jni.JObjectType().fromRef(
-          _getPropertyStringValue(reference, propertyKey.reference).object);
+  jni.JObject getPropertyStringValue(
+    jni.JString propertyKey,
+  ) {
+    return const jni.JObjectType().fromRef(
+        _getPropertyStringValue(reference, propertyKey.reference).object);
+  }
 
   static final _getTitle = jniLookup<
           ffi.NativeFunction<
@@ -130,8 +138,9 @@
   ///
   /// This will get the title of the document.  This will return null if no title exists.
   ///@return The title of the document.
-  jni.JString getTitle() =>
-      const jni.JStringType().fromRef(_getTitle(reference).object);
+  jni.JString getTitle() {
+    return const jni.JStringType().fromRef(_getTitle(reference).object);
+  }
 
   static final _setTitle = jniLookup<
           ffi.NativeFunction<
@@ -145,8 +154,11 @@
   ///
   /// This will set the title of the document.
   ///@param title The new title for the document.
-  void setTitle(jni.JString title) =>
-      _setTitle(reference, title.reference).check();
+  void setTitle(
+    jni.JString title,
+  ) {
+    return _setTitle(reference, title.reference).check();
+  }
 
   static final _getAuthor = jniLookup<
           ffi.NativeFunction<
@@ -159,8 +171,9 @@
   ///
   /// This will get the author of the document.  This will return null if no author exists.
   ///@return The author of the document.
-  jni.JString getAuthor() =>
-      const jni.JStringType().fromRef(_getAuthor(reference).object);
+  jni.JString getAuthor() {
+    return const jni.JStringType().fromRef(_getAuthor(reference).object);
+  }
 
   static final _setAuthor = jniLookup<
           ffi.NativeFunction<
@@ -174,8 +187,11 @@
   ///
   /// This will set the author of the document.
   ///@param author The new author for the document.
-  void setAuthor(jni.JString author) =>
-      _setAuthor(reference, author.reference).check();
+  void setAuthor(
+    jni.JString author,
+  ) {
+    return _setAuthor(reference, author.reference).check();
+  }
 
   static final _getSubject = jniLookup<
           ffi.NativeFunction<
@@ -188,8 +204,9 @@
   ///
   /// This will get the subject of the document.  This will return null if no subject exists.
   ///@return The subject of the document.
-  jni.JString getSubject() =>
-      const jni.JStringType().fromRef(_getSubject(reference).object);
+  jni.JString getSubject() {
+    return const jni.JStringType().fromRef(_getSubject(reference).object);
+  }
 
   static final _setSubject = jniLookup<
           ffi.NativeFunction<
@@ -203,8 +220,11 @@
   ///
   /// This will set the subject of the document.
   ///@param subject The new subject for the document.
-  void setSubject(jni.JString subject) =>
-      _setSubject(reference, subject.reference).check();
+  void setSubject(
+    jni.JString subject,
+  ) {
+    return _setSubject(reference, subject.reference).check();
+  }
 
   static final _getKeywords = jniLookup<
           ffi.NativeFunction<
@@ -217,8 +237,9 @@
   ///
   /// This will get the keywords of the document.  This will return null if no keywords exists.
   ///@return The keywords of the document.
-  jni.JString getKeywords() =>
-      const jni.JStringType().fromRef(_getKeywords(reference).object);
+  jni.JString getKeywords() {
+    return const jni.JStringType().fromRef(_getKeywords(reference).object);
+  }
 
   static final _setKeywords = jniLookup<
           ffi.NativeFunction<
@@ -232,8 +253,11 @@
   ///
   /// This will set the keywords of the document.
   ///@param keywords The new keywords for the document.
-  void setKeywords(jni.JString keywords) =>
-      _setKeywords(reference, keywords.reference).check();
+  void setKeywords(
+    jni.JString keywords,
+  ) {
+    return _setKeywords(reference, keywords.reference).check();
+  }
 
   static final _getCreator = jniLookup<
           ffi.NativeFunction<
@@ -246,8 +270,9 @@
   ///
   /// This will get the creator of the document.  This will return null if no creator exists.
   ///@return The creator of the document.
-  jni.JString getCreator() =>
-      const jni.JStringType().fromRef(_getCreator(reference).object);
+  jni.JString getCreator() {
+    return const jni.JStringType().fromRef(_getCreator(reference).object);
+  }
 
   static final _setCreator = jniLookup<
           ffi.NativeFunction<
@@ -261,8 +286,11 @@
   ///
   /// This will set the creator of the document.
   ///@param creator The new creator for the document.
-  void setCreator(jni.JString creator) =>
-      _setCreator(reference, creator.reference).check();
+  void setCreator(
+    jni.JString creator,
+  ) {
+    return _setCreator(reference, creator.reference).check();
+  }
 
   static final _getProducer = jniLookup<
           ffi.NativeFunction<
@@ -275,8 +303,9 @@
   ///
   /// This will get the producer of the document.  This will return null if no producer exists.
   ///@return The producer of the document.
-  jni.JString getProducer() =>
-      const jni.JStringType().fromRef(_getProducer(reference).object);
+  jni.JString getProducer() {
+    return const jni.JStringType().fromRef(_getProducer(reference).object);
+  }
 
   static final _setProducer = jniLookup<
           ffi.NativeFunction<
@@ -290,8 +319,11 @@
   ///
   /// This will set the producer of the document.
   ///@param producer The new producer for the document.
-  void setProducer(jni.JString producer) =>
-      _setProducer(reference, producer.reference).check();
+  void setProducer(
+    jni.JString producer,
+  ) {
+    return _setProducer(reference, producer.reference).check();
+  }
 
   static final _getCreationDate = jniLookup<
               ffi.NativeFunction<
@@ -304,8 +336,9 @@
   ///
   /// This will get the creation date of the document.  This will return null if no creation date exists.
   ///@return The creation date of the document.
-  jni.JObject getCreationDate() =>
-      const jni.JObjectType().fromRef(_getCreationDate(reference).object);
+  jni.JObject getCreationDate() {
+    return const jni.JObjectType().fromRef(_getCreationDate(reference).object);
+  }
 
   static final _setCreationDate = jniLookup<
               ffi.NativeFunction<
@@ -320,8 +353,11 @@
   ///
   /// This will set the creation date of the document.
   ///@param date The new creation date for the document.
-  void setCreationDate(jni.JObject date) =>
-      _setCreationDate(reference, date.reference).check();
+  void setCreationDate(
+    jni.JObject date,
+  ) {
+    return _setCreationDate(reference, date.reference).check();
+  }
 
   static final _getModificationDate = jniLookup<
               ffi.NativeFunction<
@@ -334,8 +370,10 @@
   ///
   /// This will get the modification date of the document.  This will return null if no modification date exists.
   ///@return The modification date of the document.
-  jni.JObject getModificationDate() =>
-      const jni.JObjectType().fromRef(_getModificationDate(reference).object);
+  jni.JObject getModificationDate() {
+    return const jni.JObjectType()
+        .fromRef(_getModificationDate(reference).object);
+  }
 
   static final _setModificationDate = jniLookup<
               ffi.NativeFunction<
@@ -350,8 +388,11 @@
   ///
   /// This will set the modification date of the document.
   ///@param date The new modification date for the document.
-  void setModificationDate(jni.JObject date) =>
-      _setModificationDate(reference, date.reference).check();
+  void setModificationDate(
+    jni.JObject date,
+  ) {
+    return _setModificationDate(reference, date.reference).check();
+  }
 
   static final _getTrapped = jniLookup<
           ffi.NativeFunction<
@@ -365,8 +406,9 @@
   /// This will get the trapped value for the document.
   /// This will return null if one is not found.
   ///@return The trapped value for the document.
-  jni.JString getTrapped() =>
-      const jni.JStringType().fromRef(_getTrapped(reference).object);
+  jni.JString getTrapped() {
+    return const jni.JStringType().fromRef(_getTrapped(reference).object);
+  }
 
   static final _getMetadataKeys = jniLookup<
               ffi.NativeFunction<
@@ -380,8 +422,9 @@
   /// This will get the keys of all metadata information fields for the document.
   ///@return all metadata key strings.
   ///@since Apache PDFBox 1.3.0
-  jni.JObject getMetadataKeys() =>
-      const jni.JObjectType().fromRef(_getMetadataKeys(reference).object);
+  jni.JObject getMetadataKeys() {
+    return const jni.JObjectType().fromRef(_getMetadataKeys(reference).object);
+  }
 
   static final _getCustomMetadataValue = jniLookup<
               ffi.NativeFunction<
@@ -399,9 +442,12 @@
   ///  This will return null if one is not found.
   ///@param fieldName Name of custom metadata field from pdf document.
   ///@return String Value of metadata field
-  jni.JString getCustomMetadataValue(jni.JString fieldName) =>
-      const jni.JStringType().fromRef(
-          _getCustomMetadataValue(reference, fieldName.reference).object);
+  jni.JString getCustomMetadataValue(
+    jni.JString fieldName,
+  ) {
+    return const jni.JStringType().fromRef(
+        _getCustomMetadataValue(reference, fieldName.reference).object);
+  }
 
   static final _setCustomMetadataValue = jniLookup<
               ffi.NativeFunction<
@@ -417,10 +463,14 @@
   /// Set the custom metadata value.
   ///@param fieldName The name of the custom metadata field.
   ///@param fieldValue The value to the custom metadata field.
-  void setCustomMetadataValue(jni.JString fieldName, jni.JString fieldValue) =>
-      _setCustomMetadataValue(
-              reference, fieldName.reference, fieldValue.reference)
-          .check();
+  void setCustomMetadataValue(
+    jni.JString fieldName,
+    jni.JString fieldValue,
+  ) {
+    return _setCustomMetadataValue(
+            reference, fieldName.reference, fieldValue.reference)
+        .check();
+  }
 
   static final _setTrapped = jniLookup<
           ffi.NativeFunction<
@@ -436,8 +486,11 @@
   /// 'True', 'False', or 'Unknown'.
   ///@param value The new trapped value for the document.
   ///@throws IllegalArgumentException if the parameter is invalid.
-  void setTrapped(jni.JString value) =>
-      _setTrapped(reference, value.reference).check();
+  void setTrapped(
+    jni.JString value,
+  ) {
+    return _setTrapped(reference, value.reference).check();
+  }
 }
 
 class $PDDocumentInformationType extends jni.JObjType<PDDocumentInformation> {
@@ -449,4 +502,19 @@
   @override
   PDDocumentInformation fromRef(jni.JObjectPtr ref) =>
       PDDocumentInformation.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($PDDocumentInformationType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $PDDocumentInformationType &&
+        other is $PDDocumentInformationType;
+  }
 }
diff --git a/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/text/PDFTextStripper.dart b/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/text/PDFTextStripper.dart
index ccf668b..ee03391 100644
--- a/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/text/PDFTextStripper.dart
+++ b/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/text/PDFTextStripper.dart
@@ -50,9 +50,8 @@
 /// smaller and smaller chunks of the page. Eventually, we fully process each page and then print it.
 ///@author Ben Litchfield
 class PDFTextStripper extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   PDFTextStripper.fromRef(
     jni.JObjectPtr ref,
@@ -193,7 +192,9 @@
   ///
   /// Instantiate a new PDFTextStripper object.
   ///@throws IOException If there is an error loading the properties.
-  PDFTextStripper() : super.fromRef(_ctor().object);
+  factory PDFTextStripper() {
+    return PDFTextStripper.fromRef(_ctor().object);
+  }
 
   static final _getText = jniLookup<
           ffi.NativeFunction<
@@ -216,8 +217,12 @@
   ///@param doc The document to get the text from.
   ///@return The text of the PDF document.
   ///@throws IOException if the doc state is invalid or it is encrypted.
-  jni.JString getText(pddocument_.PDDocument doc) => const jni.JStringType()
-      .fromRef(_getText(reference, doc.reference).object);
+  jni.JString getText(
+    pddocument_.PDDocument doc,
+  ) {
+    return const jni.JStringType()
+        .fromRef(_getText(reference, doc.reference).object);
+  }
 
   static final _writeText = jniLookup<
           ffi.NativeFunction<
@@ -235,8 +240,12 @@
   ///@param doc The document to get the data from.
   ///@param outputStream The location to put the text.
   ///@throws IOException If the doc is in an invalid state.
-  void writeText(pddocument_.PDDocument doc, jni.JObject outputStream) =>
-      _writeText(reference, doc.reference, outputStream.reference).check();
+  void writeText(
+    pddocument_.PDDocument doc,
+    jni.JObject outputStream,
+  ) {
+    return _writeText(reference, doc.reference, outputStream.reference).check();
+  }
 
   static final _processPages = jniLookup<
           ffi.NativeFunction<
@@ -251,8 +260,11 @@
   /// This will process all of the pages and the text that is in them.
   ///@param pages The pages object in the document.
   ///@throws IOException If there is an error parsing the text.
-  void processPages(jni.JObject pages) =>
-      _processPages(reference, pages.reference).check();
+  void processPages(
+    jni.JObject pages,
+  ) {
+    return _processPages(reference, pages.reference).check();
+  }
 
   static final _startDocument = jniLookup<
           ffi.NativeFunction<
@@ -267,8 +279,11 @@
   /// This method is available for subclasses of this class. It will be called before processing of the document start.
   ///@param document The PDF document that is being processed.
   ///@throws IOException If an IO error occurs.
-  void startDocument(pddocument_.PDDocument document) =>
-      _startDocument(reference, document.reference).check();
+  void startDocument(
+    pddocument_.PDDocument document,
+  ) {
+    return _startDocument(reference, document.reference).check();
+  }
 
   static final _endDocument = jniLookup<
           ffi.NativeFunction<
@@ -284,8 +299,11 @@
   /// finishes.
   ///@param document The PDF document that is being processed.
   ///@throws IOException If an IO error occurs.
-  void endDocument(pddocument_.PDDocument document) =>
-      _endDocument(reference, document.reference).check();
+  void endDocument(
+    pddocument_.PDDocument document,
+  ) {
+    return _endDocument(reference, document.reference).check();
+  }
 
   static final _processPage = jniLookup<
           ffi.NativeFunction<
@@ -300,8 +318,11 @@
   /// This will process the contents of a page.
   ///@param page The page to process.
   ///@throws IOException If there is an error processing the page.
-  void processPage(jni.JObject page) =>
-      _processPage(reference, page.reference).check();
+  void processPage(
+    jni.JObject page,
+  ) {
+    return _processPage(reference, page.reference).check();
+  }
 
   static final _startArticle = jniLookup<
           ffi.NativeFunction<
@@ -315,7 +336,9 @@
   /// assumes that the primary direction of text is left to right. Default implementation is to do nothing. Subclasses
   /// may provide additional information.
   ///@throws IOException If there is any error writing to the stream.
-  void startArticle() => _startArticle(reference).check();
+  void startArticle() {
+    return _startArticle(reference).check();
+  }
 
   static final _startArticle1 = jniLookup<
           ffi.NativeFunction<
@@ -329,8 +352,11 @@
   /// Default implementation is to do nothing. Subclasses may provide additional information.
   ///@param isLTR true if primary direction of text is left to right.
   ///@throws IOException If there is any error writing to the stream.
-  void startArticle1(bool isLTR) =>
-      _startArticle1(reference, isLTR ? 1 : 0).check();
+  void startArticle1(
+    bool isLTR,
+  ) {
+    return _startArticle1(reference, isLTR ? 1 : 0).check();
+  }
 
   static final _endArticle = jniLookup<
           ffi.NativeFunction<
@@ -342,7 +368,9 @@
   ///
   /// End an article. Default implementation is to do nothing. Subclasses may provide additional information.
   ///@throws IOException If there is any error writing to the stream.
-  void endArticle() => _endArticle(reference).check();
+  void endArticle() {
+    return _endArticle(reference).check();
+  }
 
   static final _startPage = jniLookup<
           ffi.NativeFunction<
@@ -357,8 +385,11 @@
   /// Start a new page. Default implementation is to do nothing. Subclasses may provide additional information.
   ///@param page The page we are about to process.
   ///@throws IOException If there is any error writing to the stream.
-  void startPage(jni.JObject page) =>
-      _startPage(reference, page.reference).check();
+  void startPage(
+    jni.JObject page,
+  ) {
+    return _startPage(reference, page.reference).check();
+  }
 
   static final _endPage = jniLookup<
           ffi.NativeFunction<
@@ -373,7 +404,11 @@
   /// End a page. Default implementation is to do nothing. Subclasses may provide additional information.
   ///@param page The page we are about to process.
   ///@throws IOException If there is any error writing to the stream.
-  void endPage(jni.JObject page) => _endPage(reference, page.reference).check();
+  void endPage(
+    jni.JObject page,
+  ) {
+    return _endPage(reference, page.reference).check();
+  }
 
   static final _writePage = jniLookup<
           ffi.NativeFunction<
@@ -387,7 +422,9 @@
   /// text, where newlines and word spacings should be placed. The text will be sorted only if that feature was
   /// enabled.
   ///@throws IOException If there is an error writing the text.
-  void writePage() => _writePage(reference).check();
+  void writePage() {
+    return _writePage(reference).check();
+  }
 
   static final _writeLineSeparator = jniLookup<
               ffi.NativeFunction<
@@ -399,7 +436,9 @@
   ///
   /// Write the line separator value to the output stream.
   ///@throws IOException If there is a problem writing out the line separator to the document.
-  void writeLineSeparator() => _writeLineSeparator(reference).check();
+  void writeLineSeparator() {
+    return _writeLineSeparator(reference).check();
+  }
 
   static final _writeWordSeparator = jniLookup<
               ffi.NativeFunction<
@@ -411,7 +450,9 @@
   ///
   /// Write the word separator value to the output stream.
   ///@throws IOException If there is a problem writing out the word separator to the document.
-  void writeWordSeparator() => _writeWordSeparator(reference).check();
+  void writeWordSeparator() {
+    return _writeWordSeparator(reference).check();
+  }
 
   static final _writeCharacters = jniLookup<
           ffi.NativeFunction<
@@ -426,8 +467,11 @@
   /// Write the string in TextPosition to the output stream.
   ///@param text The text to write to the stream.
   ///@throws IOException If there is an error when writing the text.
-  void writeCharacters(jni.JObject text) =>
-      _writeCharacters(reference, text.reference).check();
+  void writeCharacters(
+    jni.JObject text,
+  ) {
+    return _writeCharacters(reference, text.reference).check();
+  }
 
   static final _writeString = jniLookup<
           ffi.NativeFunction<
@@ -446,8 +490,13 @@
   ///@param text The text to write to the stream.
   ///@param textPositions The TextPositions belonging to the text.
   ///@throws IOException If there is an error when writing the text.
-  void writeString(jni.JString text, jni.JObject textPositions) =>
-      _writeString(reference, text.reference, textPositions.reference).check();
+  void writeString(
+    jni.JString text,
+    jni.JObject textPositions,
+  ) {
+    return _writeString(reference, text.reference, textPositions.reference)
+        .check();
+  }
 
   static final _writeString1 = jniLookup<
           ffi.NativeFunction<
@@ -462,8 +511,11 @@
   /// Write a Java string to the output stream.
   ///@param text The text to write to the stream.
   ///@throws IOException If there is an error when writing the text.
-  void writeString1(jni.JString text) =>
-      _writeString1(reference, text.reference).check();
+  void writeString1(
+    jni.JString text,
+  ) {
+    return _writeString1(reference, text.reference).check();
+  }
 
   static final _processTextPosition = jniLookup<
               ffi.NativeFunction<
@@ -479,8 +531,11 @@
   /// This will process a TextPosition object and add the text to the list of characters on a page. It takes care of
   /// overlapping text.
   ///@param text The text to process.
-  void processTextPosition(jni.JObject text) =>
-      _processTextPosition(reference, text.reference).check();
+  void processTextPosition(
+    jni.JObject text,
+  ) {
+    return _processTextPosition(reference, text.reference).check();
+  }
 
   static final _getStartPage = jniLookup<
           ffi.NativeFunction<
@@ -494,7 +549,9 @@
   /// document, if the start page is 1 then all pages will be extracted. If the start page is 4 then pages 4 and 5 will
   /// be extracted. The default value is 1.
   ///@return Value of property startPage.
-  int getStartPage() => _getStartPage(reference).integer;
+  int getStartPage() {
+    return _getStartPage(reference).integer;
+  }
 
   static final _setStartPage = jniLookup<
           ffi.NativeFunction<
@@ -506,8 +563,11 @@
   ///
   /// This will set the first page to be extracted by this class.
   ///@param startPageValue New value of 1-based startPage property.
-  void setStartPage(int startPageValue) =>
-      _setStartPage(reference, startPageValue).check();
+  void setStartPage(
+    int startPageValue,
+  ) {
+    return _setStartPage(reference, startPageValue).check();
+  }
 
   static final _getEndPage = jniLookup<
           ffi.NativeFunction<
@@ -521,7 +581,9 @@
   /// value of 5 would extract the entire document, an end page of 2 would extract pages 1 and 2. This defaults to
   /// Integer.MAX_VALUE such that all pages of the pdf will be extracted.
   ///@return Value of property endPage.
-  int getEndPage() => _getEndPage(reference).integer;
+  int getEndPage() {
+    return _getEndPage(reference).integer;
+  }
 
   static final _setEndPage = jniLookup<
           ffi.NativeFunction<
@@ -533,8 +595,11 @@
   ///
   /// This will set the last page to be extracted by this class.
   ///@param endPageValue New value of 1-based endPage property.
-  void setEndPage(int endPageValue) =>
-      _setEndPage(reference, endPageValue).check();
+  void setEndPage(
+    int endPageValue,
+  ) {
+    return _setEndPage(reference, endPageValue).check();
+  }
 
   static final _setLineSeparator = jniLookup<
           ffi.NativeFunction<
@@ -549,8 +614,11 @@
   /// Set the desired line separator for output text. The line.separator system property is used if the line separator
   /// preference is not set explicitly using this method.
   ///@param separator The desired line separator string.
-  void setLineSeparator(jni.JString separator) =>
-      _setLineSeparator(reference, separator.reference).check();
+  void setLineSeparator(
+    jni.JString separator,
+  ) {
+    return _setLineSeparator(reference, separator.reference).check();
+  }
 
   static final _getLineSeparator = jniLookup<
           ffi.NativeFunction<
@@ -563,8 +631,9 @@
   ///
   /// This will get the line separator.
   ///@return The desired line separator string.
-  jni.JString getLineSeparator() =>
-      const jni.JStringType().fromRef(_getLineSeparator(reference).object);
+  jni.JString getLineSeparator() {
+    return const jni.JStringType().fromRef(_getLineSeparator(reference).object);
+  }
 
   static final _getWordSeparator = jniLookup<
           ffi.NativeFunction<
@@ -577,8 +646,9 @@
   ///
   /// This will get the word separator.
   ///@return The desired word separator string.
-  jni.JString getWordSeparator() =>
-      const jni.JStringType().fromRef(_getWordSeparator(reference).object);
+  jni.JString getWordSeparator() {
+    return const jni.JStringType().fromRef(_getWordSeparator(reference).object);
+  }
 
   static final _setWordSeparator = jniLookup<
           ffi.NativeFunction<
@@ -595,8 +665,11 @@
   /// accurate count of characters that are found in a PDF document then you might want to set the word separator to
   /// the empty string.
   ///@param separator The desired page separator string.
-  void setWordSeparator(jni.JString separator) =>
-      _setWordSeparator(reference, separator.reference).check();
+  void setWordSeparator(
+    jni.JString separator,
+  ) {
+    return _setWordSeparator(reference, separator.reference).check();
+  }
 
   static final _getSuppressDuplicateOverlappingText = jniLookup<
               ffi.NativeFunction<
@@ -607,8 +680,9 @@
   /// from: public boolean getSuppressDuplicateOverlappingText()
   ///
   /// @return Returns the suppressDuplicateOverlappingText.
-  bool getSuppressDuplicateOverlappingText() =>
-      _getSuppressDuplicateOverlappingText(reference).boolean;
+  bool getSuppressDuplicateOverlappingText() {
+    return _getSuppressDuplicateOverlappingText(reference).boolean;
+  }
 
   static final _getCurrentPageNo = jniLookup<
           ffi.NativeFunction<
@@ -620,7 +694,9 @@
   ///
   /// Get the current page number that is being processed.
   ///@return A 1 based number representing the current page.
-  int getCurrentPageNo() => _getCurrentPageNo(reference).integer;
+  int getCurrentPageNo() {
+    return _getCurrentPageNo(reference).integer;
+  }
 
   static final _getOutput = jniLookup<
           ffi.NativeFunction<
@@ -633,8 +709,9 @@
   ///
   /// The output stream that is being written to.
   ///@return The stream that output is being written to.
-  jni.JObject getOutput() =>
-      const jni.JObjectType().fromRef(_getOutput(reference).object);
+  jni.JObject getOutput() {
+    return const jni.JObjectType().fromRef(_getOutput(reference).object);
+  }
 
   static final _getCharactersByArticle = jniLookup<
               ffi.NativeFunction<
@@ -648,8 +725,10 @@
   /// Character strings are grouped by articles. It is quite common that there will only be a single article. This
   /// returns a List that contains List objects, the inner lists will contain TextPosition objects.
   ///@return A double List of TextPositions for all text strings on the page.
-  jni.JObject getCharactersByArticle() => const jni.JObjectType()
-      .fromRef(_getCharactersByArticle(reference).object);
+  jni.JObject getCharactersByArticle() {
+    return const jni.JObjectType()
+        .fromRef(_getCharactersByArticle(reference).object);
+  }
 
   static final _setSuppressDuplicateOverlappingText = jniLookup<
               ffi.NativeFunction<
@@ -664,10 +743,12 @@
   /// means that certain sections will be duplicated, but better performance will be noticed.
   ///@param suppressDuplicateOverlappingTextValue The suppressDuplicateOverlappingText to set.
   void setSuppressDuplicateOverlappingText(
-          bool suppressDuplicateOverlappingTextValue) =>
-      _setSuppressDuplicateOverlappingText(
-              reference, suppressDuplicateOverlappingTextValue ? 1 : 0)
-          .check();
+    bool suppressDuplicateOverlappingTextValue,
+  ) {
+    return _setSuppressDuplicateOverlappingText(
+            reference, suppressDuplicateOverlappingTextValue ? 1 : 0)
+        .check();
+  }
 
   static final _getSeparateByBeads = jniLookup<
               ffi.NativeFunction<
@@ -679,7 +760,9 @@
   ///
   /// This will tell if the text stripper should separate by beads.
   ///@return If the text will be grouped by beads.
-  bool getSeparateByBeads() => _getSeparateByBeads(reference).boolean;
+  bool getSeparateByBeads() {
+    return _getSeparateByBeads(reference).boolean;
+  }
 
   static final _setShouldSeparateByBeads = jniLookup<
           ffi.NativeFunction<
@@ -691,9 +774,12 @@
   ///
   /// Set if the text stripper should group the text output by a list of beads. The default value is true!
   ///@param aShouldSeparateByBeads The new grouping of beads.
-  void setShouldSeparateByBeads(bool aShouldSeparateByBeads) =>
-      _setShouldSeparateByBeads(reference, aShouldSeparateByBeads ? 1 : 0)
-          .check();
+  void setShouldSeparateByBeads(
+    bool aShouldSeparateByBeads,
+  ) {
+    return _setShouldSeparateByBeads(reference, aShouldSeparateByBeads ? 1 : 0)
+        .check();
+  }
 
   static final _getEndBookmark = jniLookup<
           ffi.NativeFunction<
@@ -706,8 +792,9 @@
   ///
   /// Get the bookmark where text extraction should end, inclusive. Default is null.
   ///@return The ending bookmark.
-  jni.JObject getEndBookmark() =>
-      const jni.JObjectType().fromRef(_getEndBookmark(reference).object);
+  jni.JObject getEndBookmark() {
+    return const jni.JObjectType().fromRef(_getEndBookmark(reference).object);
+  }
 
   static final _setEndBookmark = jniLookup<
           ffi.NativeFunction<
@@ -721,8 +808,11 @@
   ///
   /// Set the bookmark where the text extraction should stop.
   ///@param aEndBookmark The ending bookmark.
-  void setEndBookmark(jni.JObject aEndBookmark) =>
-      _setEndBookmark(reference, aEndBookmark.reference).check();
+  void setEndBookmark(
+    jni.JObject aEndBookmark,
+  ) {
+    return _setEndBookmark(reference, aEndBookmark.reference).check();
+  }
 
   static final _getStartBookmark = jniLookup<
           ffi.NativeFunction<
@@ -735,8 +825,9 @@
   ///
   /// Get the bookmark where text extraction should start, inclusive. Default is null.
   ///@return The starting bookmark.
-  jni.JObject getStartBookmark() =>
-      const jni.JObjectType().fromRef(_getStartBookmark(reference).object);
+  jni.JObject getStartBookmark() {
+    return const jni.JObjectType().fromRef(_getStartBookmark(reference).object);
+  }
 
   static final _setStartBookmark = jniLookup<
           ffi.NativeFunction<
@@ -750,8 +841,11 @@
   ///
   /// Set the bookmark where text extraction should start, inclusive.
   ///@param aStartBookmark The starting bookmark.
-  void setStartBookmark(jni.JObject aStartBookmark) =>
-      _setStartBookmark(reference, aStartBookmark.reference).check();
+  void setStartBookmark(
+    jni.JObject aStartBookmark,
+  ) {
+    return _setStartBookmark(reference, aStartBookmark.reference).check();
+  }
 
   static final _getAddMoreFormatting = jniLookup<
               ffi.NativeFunction<
@@ -763,7 +857,9 @@
   ///
   /// This will tell if the text stripper should add some more text formatting.
   ///@return true if some more text formatting will be added
-  bool getAddMoreFormatting() => _getAddMoreFormatting(reference).boolean;
+  bool getAddMoreFormatting() {
+    return _getAddMoreFormatting(reference).boolean;
+  }
 
   static final _setAddMoreFormatting = jniLookup<
           ffi.NativeFunction<
@@ -775,8 +871,12 @@
   ///
   /// There will some additional text formatting be added if addMoreFormatting is set to true. Default is false.
   ///@param newAddMoreFormatting Tell PDFBox to add some more text formatting
-  void setAddMoreFormatting(bool newAddMoreFormatting) =>
-      _setAddMoreFormatting(reference, newAddMoreFormatting ? 1 : 0).check();
+  void setAddMoreFormatting(
+    bool newAddMoreFormatting,
+  ) {
+    return _setAddMoreFormatting(reference, newAddMoreFormatting ? 1 : 0)
+        .check();
+  }
 
   static final _getSortByPosition = jniLookup<
           ffi.NativeFunction<
@@ -788,7 +888,9 @@
   ///
   /// This will tell if the text stripper should sort the text tokens before writing to the stream.
   ///@return true If the text tokens will be sorted before being written.
-  bool getSortByPosition() => _getSortByPosition(reference).boolean;
+  bool getSortByPosition() {
+    return _getSortByPosition(reference).boolean;
+  }
 
   static final _setSortByPosition = jniLookup<
           ffi.NativeFunction<
@@ -806,8 +908,11 @@
   /// A PDF writer could choose to write each character in a different order. By default PDFBox does __not__ sort
   /// the text tokens before processing them due to performance reasons.
   ///@param newSortByPosition Tell PDFBox to sort the text positions.
-  void setSortByPosition(bool newSortByPosition) =>
-      _setSortByPosition(reference, newSortByPosition ? 1 : 0).check();
+  void setSortByPosition(
+    bool newSortByPosition,
+  ) {
+    return _setSortByPosition(reference, newSortByPosition ? 1 : 0).check();
+  }
 
   static final _getSpacingTolerance = jniLookup<
               ffi.NativeFunction<
@@ -820,7 +925,9 @@
   /// Get the current space width-based tolerance value that is being used to estimate where spaces in text should be
   /// added. Note that the default value for this has been determined from trial and error.
   ///@return The current tolerance / scaling factor
-  double getSpacingTolerance() => _getSpacingTolerance(reference).float;
+  double getSpacingTolerance() {
+    return _getSpacingTolerance(reference).float;
+  }
 
   static final _setSpacingTolerance = jniLookup<
           ffi.NativeFunction<
@@ -834,8 +941,11 @@
   /// that the default value for this has been determined from trial and error. Setting this value larger will reduce
   /// the number of spaces added.
   ///@param spacingToleranceValue tolerance / scaling factor to use
-  void setSpacingTolerance(double spacingToleranceValue) =>
-      _setSpacingTolerance(reference, spacingToleranceValue).check();
+  void setSpacingTolerance(
+    double spacingToleranceValue,
+  ) {
+    return _setSpacingTolerance(reference, spacingToleranceValue).check();
+  }
 
   static final _getAverageCharTolerance = jniLookup<
               ffi.NativeFunction<
@@ -848,7 +958,9 @@
   /// Get the current character width-based tolerance value that is being used to estimate where spaces in text should
   /// be added. Note that the default value for this has been determined from trial and error.
   ///@return The current tolerance / scaling factor
-  double getAverageCharTolerance() => _getAverageCharTolerance(reference).float;
+  double getAverageCharTolerance() {
+    return _getAverageCharTolerance(reference).float;
+  }
 
   static final _setAverageCharTolerance = jniLookup<
           ffi.NativeFunction<
@@ -862,8 +974,12 @@
   /// that the default value for this has been determined from trial and error. Setting this value larger will reduce
   /// the number of spaces added.
   ///@param averageCharToleranceValue average tolerance / scaling factor to use
-  void setAverageCharTolerance(double averageCharToleranceValue) =>
-      _setAverageCharTolerance(reference, averageCharToleranceValue).check();
+  void setAverageCharTolerance(
+    double averageCharToleranceValue,
+  ) {
+    return _setAverageCharTolerance(reference, averageCharToleranceValue)
+        .check();
+  }
 
   static final _getIndentThreshold = jniLookup<
               ffi.NativeFunction<
@@ -876,7 +992,9 @@
   /// returns the multiple of whitespace character widths for the current text which the current line start can be
   /// indented from the previous line start beyond which the current line start is considered to be a paragraph start.
   ///@return the number of whitespace character widths to use when detecting paragraph indents.
-  double getIndentThreshold() => _getIndentThreshold(reference).float;
+  double getIndentThreshold() {
+    return _getIndentThreshold(reference).float;
+  }
 
   static final _setIndentThreshold = jniLookup<
           ffi.NativeFunction<
@@ -890,8 +1008,11 @@
   /// indented from the previous line start beyond which the current line start is considered to be a paragraph start.
   /// The default value is 2.0.
   ///@param indentThresholdValue the number of whitespace character widths to use when detecting paragraph indents.
-  void setIndentThreshold(double indentThresholdValue) =>
-      _setIndentThreshold(reference, indentThresholdValue).check();
+  void setIndentThreshold(
+    double indentThresholdValue,
+  ) {
+    return _setIndentThreshold(reference, indentThresholdValue).check();
+  }
 
   static final _getDropThreshold = jniLookup<
           ffi.NativeFunction<
@@ -904,7 +1025,9 @@
   /// the minimum whitespace, as a multiple of the max height of the current characters beyond which the current line
   /// start is considered to be a paragraph start.
   ///@return the character height multiple for max allowed whitespace between lines in the same paragraph.
-  double getDropThreshold() => _getDropThreshold(reference).float;
+  double getDropThreshold() {
+    return _getDropThreshold(reference).float;
+  }
 
   static final _setDropThreshold = jniLookup<
           ffi.NativeFunction<
@@ -918,8 +1041,11 @@
   /// line start is considered to be a paragraph start. The default value is 2.5.
   ///@param dropThresholdValue the character height multiple for max allowed whitespace between lines in the same
   /// paragraph.
-  void setDropThreshold(double dropThresholdValue) =>
-      _setDropThreshold(reference, dropThresholdValue).check();
+  void setDropThreshold(
+    double dropThresholdValue,
+  ) {
+    return _setDropThreshold(reference, dropThresholdValue).check();
+  }
 
   static final _getParagraphStart = jniLookup<
           ffi.NativeFunction<
@@ -932,8 +1058,10 @@
   ///
   /// Returns the string which will be used at the beginning of a paragraph.
   ///@return the paragraph start string
-  jni.JString getParagraphStart() =>
-      const jni.JStringType().fromRef(_getParagraphStart(reference).object);
+  jni.JString getParagraphStart() {
+    return const jni.JStringType()
+        .fromRef(_getParagraphStart(reference).object);
+  }
 
   static final _setParagraphStart = jniLookup<
           ffi.NativeFunction<
@@ -947,8 +1075,11 @@
   ///
   /// Sets the string which will be used at the beginning of a paragraph.
   ///@param s the paragraph start string
-  void setParagraphStart(jni.JString s) =>
-      _setParagraphStart(reference, s.reference).check();
+  void setParagraphStart(
+    jni.JString s,
+  ) {
+    return _setParagraphStart(reference, s.reference).check();
+  }
 
   static final _getParagraphEnd = jniLookup<
           ffi.NativeFunction<
@@ -961,8 +1092,9 @@
   ///
   /// Returns the string which will be used at the end of a paragraph.
   ///@return the paragraph end string
-  jni.JString getParagraphEnd() =>
-      const jni.JStringType().fromRef(_getParagraphEnd(reference).object);
+  jni.JString getParagraphEnd() {
+    return const jni.JStringType().fromRef(_getParagraphEnd(reference).object);
+  }
 
   static final _setParagraphEnd = jniLookup<
           ffi.NativeFunction<
@@ -976,8 +1108,11 @@
   ///
   /// Sets the string which will be used at the end of a paragraph.
   ///@param s the paragraph end string
-  void setParagraphEnd(jni.JString s) =>
-      _setParagraphEnd(reference, s.reference).check();
+  void setParagraphEnd(
+    jni.JString s,
+  ) {
+    return _setParagraphEnd(reference, s.reference).check();
+  }
 
   static final _getPageStart = jniLookup<
           ffi.NativeFunction<
@@ -990,8 +1125,9 @@
   ///
   /// Returns the string which will be used at the beginning of a page.
   ///@return the page start string
-  jni.JString getPageStart() =>
-      const jni.JStringType().fromRef(_getPageStart(reference).object);
+  jni.JString getPageStart() {
+    return const jni.JStringType().fromRef(_getPageStart(reference).object);
+  }
 
   static final _setPageStart = jniLookup<
           ffi.NativeFunction<
@@ -1005,8 +1141,11 @@
   ///
   /// Sets the string which will be used at the beginning of a page.
   ///@param pageStartValue the page start string
-  void setPageStart(jni.JString pageStartValue) =>
-      _setPageStart(reference, pageStartValue.reference).check();
+  void setPageStart(
+    jni.JString pageStartValue,
+  ) {
+    return _setPageStart(reference, pageStartValue.reference).check();
+  }
 
   static final _getPageEnd = jniLookup<
           ffi.NativeFunction<
@@ -1019,8 +1158,9 @@
   ///
   /// Returns the string which will be used at the end of a page.
   ///@return the page end string
-  jni.JString getPageEnd() =>
-      const jni.JStringType().fromRef(_getPageEnd(reference).object);
+  jni.JString getPageEnd() {
+    return const jni.JStringType().fromRef(_getPageEnd(reference).object);
+  }
 
   static final _setPageEnd = jniLookup<
           ffi.NativeFunction<
@@ -1034,8 +1174,11 @@
   ///
   /// Sets the string which will be used at the end of a page.
   ///@param pageEndValue the page end string
-  void setPageEnd(jni.JString pageEndValue) =>
-      _setPageEnd(reference, pageEndValue.reference).check();
+  void setPageEnd(
+    jni.JString pageEndValue,
+  ) {
+    return _setPageEnd(reference, pageEndValue.reference).check();
+  }
 
   static final _getArticleStart = jniLookup<
           ffi.NativeFunction<
@@ -1048,8 +1191,9 @@
   ///
   /// Returns the string which will be used at the beginning of an article.
   ///@return the article start string
-  jni.JString getArticleStart() =>
-      const jni.JStringType().fromRef(_getArticleStart(reference).object);
+  jni.JString getArticleStart() {
+    return const jni.JStringType().fromRef(_getArticleStart(reference).object);
+  }
 
   static final _setArticleStart = jniLookup<
           ffi.NativeFunction<
@@ -1063,8 +1207,11 @@
   ///
   /// Sets the string which will be used at the beginning of an article.
   ///@param articleStartValue the article start string
-  void setArticleStart(jni.JString articleStartValue) =>
-      _setArticleStart(reference, articleStartValue.reference).check();
+  void setArticleStart(
+    jni.JString articleStartValue,
+  ) {
+    return _setArticleStart(reference, articleStartValue.reference).check();
+  }
 
   static final _getArticleEnd = jniLookup<
           ffi.NativeFunction<
@@ -1077,8 +1224,9 @@
   ///
   /// Returns the string which will be used at the end of an article.
   ///@return the article end string
-  jni.JString getArticleEnd() =>
-      const jni.JStringType().fromRef(_getArticleEnd(reference).object);
+  jni.JString getArticleEnd() {
+    return const jni.JStringType().fromRef(_getArticleEnd(reference).object);
+  }
 
   static final _setArticleEnd = jniLookup<
           ffi.NativeFunction<
@@ -1092,8 +1240,11 @@
   ///
   /// Sets the string which will be used at the end of an article.
   ///@param articleEndValue the article end string
-  void setArticleEnd(jni.JString articleEndValue) =>
-      _setArticleEnd(reference, articleEndValue.reference).check();
+  void setArticleEnd(
+    jni.JString articleEndValue,
+  ) {
+    return _setArticleEnd(reference, articleEndValue.reference).check();
+  }
 
   static final _writeParagraphSeparator = jniLookup<
               ffi.NativeFunction<
@@ -1105,7 +1256,9 @@
   ///
   /// writes the paragraph separator string to the output.
   ///@throws IOException if something went wrong
-  void writeParagraphSeparator() => _writeParagraphSeparator(reference).check();
+  void writeParagraphSeparator() {
+    return _writeParagraphSeparator(reference).check();
+  }
 
   static final _writeParagraphStart = jniLookup<
               ffi.NativeFunction<
@@ -1117,7 +1270,9 @@
   ///
   /// Write something (if defined) at the start of a paragraph.
   ///@throws IOException if something went wrong
-  void writeParagraphStart() => _writeParagraphStart(reference).check();
+  void writeParagraphStart() {
+    return _writeParagraphStart(reference).check();
+  }
 
   static final _writeParagraphEnd = jniLookup<
           ffi.NativeFunction<
@@ -1129,7 +1284,9 @@
   ///
   /// Write something (if defined) at the end of a paragraph.
   ///@throws IOException if something went wrong
-  void writeParagraphEnd() => _writeParagraphEnd(reference).check();
+  void writeParagraphEnd() {
+    return _writeParagraphEnd(reference).check();
+  }
 
   static final _writePageStart = jniLookup<
           ffi.NativeFunction<
@@ -1141,7 +1298,9 @@
   ///
   /// Write something (if defined) at the start of a page.
   ///@throws IOException if something went wrong
-  void writePageStart() => _writePageStart(reference).check();
+  void writePageStart() {
+    return _writePageStart(reference).check();
+  }
 
   static final _writePageEnd = jniLookup<
           ffi.NativeFunction<
@@ -1153,7 +1312,9 @@
   ///
   /// Write something (if defined) at the end of a page.
   ///@throws IOException if something went wrong
-  void writePageEnd() => _writePageEnd(reference).check();
+  void writePageEnd() {
+    return _writePageEnd(reference).check();
+  }
 
   static final _setListItemPatterns = jniLookup<
               ffi.NativeFunction<
@@ -1168,8 +1329,11 @@
   ///
   /// use to supply a different set of regular expression patterns for matching list item starts.
   ///@param patterns list of patterns
-  void setListItemPatterns(jni.JObject patterns) =>
-      _setListItemPatterns(reference, patterns.reference).check();
+  void setListItemPatterns(
+    jni.JObject patterns,
+  ) {
+    return _setListItemPatterns(reference, patterns.reference).check();
+  }
 
   static final _getListItemPatterns = jniLookup<
               ffi.NativeFunction<
@@ -1196,8 +1360,10 @@
   ///
   /// This method returns a list of such regular expression Patterns.
   ///@return a list of Pattern objects.
-  jni.JObject getListItemPatterns() =>
-      const jni.JObjectType().fromRef(_getListItemPatterns(reference).object);
+  jni.JObject getListItemPatterns() {
+    return const jni.JObjectType()
+        .fromRef(_getListItemPatterns(reference).object);
+  }
 
   static final _matchPattern = jniLookup<
           ffi.NativeFunction<
@@ -1220,9 +1386,13 @@
   ///@param string the string to be searched
   ///@param patterns list of patterns
   ///@return matching pattern
-  static jni.JObject matchPattern(jni.JString string, jni.JObject patterns) =>
-      const jni.JObjectType()
-          .fromRef(_matchPattern(string.reference, patterns.reference).object);
+  static jni.JObject matchPattern(
+    jni.JString string,
+    jni.JObject patterns,
+  ) {
+    return const jni.JObjectType()
+        .fromRef(_matchPattern(string.reference, patterns.reference).object);
+  }
 }
 
 class $PDFTextStripperType extends jni.JObjType<PDFTextStripper> {
@@ -1233,4 +1403,19 @@
 
   @override
   PDFTextStripper fromRef(jni.JObjectPtr ref) => PDFTextStripper.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($PDFTextStripperType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $PDFTextStripperType &&
+        other is $PDFTextStripperType;
+  }
 }
diff --git a/pkgs/jnigen/lib/src/bindings/dart_generator.dart b/pkgs/jnigen/lib/src/bindings/dart_generator.dart
index 56fff02..58561f9 100644
--- a/pkgs/jnigen/lib/src/bindings/dart_generator.dart
+++ b/pkgs/jnigen/lib/src/bindings/dart_generator.dart
@@ -4,6 +4,8 @@
 
 import 'dart:io';
 
+import 'package:meta/meta.dart';
+
 import '../config/config.dart';
 import '../elements/elements.dart';
 import '../logging/logging.dart';
@@ -50,6 +52,16 @@
   String capitalize() {
     return '${this[0].toUpperCase()}${substring(1)}';
   }
+
+  /// Reverses an ASCII string.
+  String get reversed => split('').reversed.join();
+}
+
+extension on Iterable<String> {
+  /// Similar to [join] but adds the [separator] to the end as well.
+  String delimited([String separator = '']) {
+    return map((e) => '$e$separator').join();
+  }
 }
 
 /// Encloses [inside] in the middle of [open] and [close]
@@ -63,6 +75,33 @@
   return '\n${'  ' * depth}';
 }
 
+/// Merges two maps. For the same keys, their value lists will be concatenated.
+///
+/// ** After calling this, the original maps might get modified! **
+Map<K, List<V>> _mergeMapValues<K, V>(Map<K, List<V>> a, Map<K, List<V>> b) {
+  final merged = <K, List<V>>{};
+  for (final key in {...a.keys, ...b.keys}) {
+    if (!a.containsKey(key)) {
+      merged[key] = b[key]!;
+      continue;
+    }
+    if (!b.containsKey(key)) {
+      merged[key] = a[key]!;
+      continue;
+    }
+
+    // Merging the smaller one to the bigger one
+    if (a[key]!.length > b[key]!.length) {
+      merged[key] = a[key]!;
+      merged[key]!.addAll(b[key]!);
+    } else {
+      merged[key] = b[key]!;
+      merged[key]!.addAll(a[key]!);
+    }
+  }
+  return merged;
+}
+
 /// **Naming Convention**
 ///
 /// Let's take the following code as an example:
@@ -87,10 +126,10 @@
 /// * `fTypeClassesDef` refers to `JType<T> $T, JType<U> $U`.
 /// * `fTypeClassesCall` refers to `$T, $U` when calling the method.
 class DartGenerator extends Visitor<Classes, Future<void>> {
-  DartGenerator(this.config);
-
   final Config config;
 
+  DartGenerator(this.config);
+
   static const cInitImport = 'import "dart:ffi" as ffi;\n'
       'import "package:jni/internal_helpers_for_jnigen.dart";\n';
 
@@ -243,16 +282,16 @@
 
 /// Generates the Dart class definition, type class, and the array extension
 class _ClassGenerator extends Visitor<ClassDecl, void> {
+  final Config config;
+  final StringSink s;
+  final Resolver? resolver;
+
   _ClassGenerator(
     this.config,
     this.s, {
     this.resolver,
   });
 
-  final Config config;
-  final StringSink s;
-  final Resolver? resolver;
-
   static const staticTypeGetter = 'type';
   static const instanceTypeGetter = '\$$staticTypeGetter';
 
@@ -277,18 +316,22 @@
     );
     final typeParams = node.allTypeParams
         .accept(const _TypeParamGenerator(withExtends: false));
-    final typeParamsCall = _encloseIfNotEmpty('<', typeParams.join(', '), '>');
+    final typeParamsCall = _encloseIfNotEmpty(
+      '<',
+      typeParams.map((typeParam) => '$_typeParamPrefix$typeParam').join(', '),
+      '>',
+    );
     final staticTypeGetterCallArgs = _encloseIfNotEmpty(
       '(',
-      typeParams.map((typeParams) => '$_typeParamPrefix$typeParams').join(', '),
+      typeParams.join(', '),
       ')',
     );
     final typeClassDefinitions = typeParams
         .map((typeParam) =>
-            'final $_jType<$typeParam> $_typeParamPrefix$typeParam;')
+            'final $_jType<$_typeParamPrefix$typeParam> $typeParam;')
         .join(_newLine(depth: 1));
     final ctorTypeClassesDef = typeParams
-        .map((typeParam) => 'this.$_typeParamPrefix$typeParam,')
+        .map((typeParam) => 'this.$typeParam,')
         .join(_newLine(depth: 2));
     final superClass = (node.classDecl.superclass!.type as DeclaredType);
     final superTypeClassesCall = superClass.classDecl == ClassDecl.object
@@ -299,9 +342,8 @@
             .join(_newLine(depth: 2));
     s.write('''
 class $name$typeParamsDef extends $superName {
-  late final $_jType? _$instanceTypeGetter;
   @override
-  $_jType get $instanceTypeGetter => _$instanceTypeGetter ??= $staticTypeGetter$staticTypeGetterCallArgs;
+  late final $_jType $instanceTypeGetter = $staticTypeGetter$staticTypeGetterCallArgs;
 
   $typeClassDefinitions
 
@@ -332,11 +374,10 @@
     } else {
       final staticTypeGetterTypeClassesDef = typeParams
           .map(
-              (typeParam) => '$_jType<$typeParam> $_typeParamPrefix$typeParam,')
+              (typeParam) => '$_jType<$_typeParamPrefix$typeParam> $typeParam,')
           .join(_newLine(depth: 2));
-      final typeClassesCall = typeParams
-          .map((typeParam) => '$_typeParamPrefix$typeParam,')
-          .join(_newLine(depth: 3));
+      final typeClassesCall =
+          typeParams.map((typeParam) => '$typeParam,').join(_newLine(depth: 3));
       s.write('''
   static $typeClassName$typeParamsCall $staticTypeGetter$typeParamsDef(
     $staticTypeGetterTypeClassesDef
@@ -363,10 +404,17 @@
     s.writeln('}');
 
     // TypeClass definition
-    final typeClassesCall = typeParams
-        .map((typeParam) => '$_typeParamPrefix$typeParam,')
-        .join(_newLine(depth: 2));
+    final typeClassesCall =
+        typeParams.map((typeParam) => '$typeParam,').join(_newLine(depth: 2));
     final signature = node.signature;
+    final superTypeClass = superClass.accept(_TypeClassGenerator(resolver));
+    final hashCodeTypeClasses = typeParams.join(', ');
+    final equalityTypeClasses = typeParams
+        .map((typeParam) => ' && $typeParam == other.$typeParam')
+        .join();
+    final hashCode = typeParams.isEmpty
+        ? '($typeClassName).hashCode'
+        : 'Object.hash($typeClassName, $hashCodeTypeClasses)';
     s.write('''
 class $typeClassName$typeParamsDef extends $_jType<$name$typeParamsCall> {
   $typeClassDefinitions
@@ -383,6 +431,20 @@
     $typeClassesCall
     ref
   );
+
+  @override
+  $_jType get superType => ${superTypeClass.name};
+
+  @override
+  final superCount = ${node.superCount};
+
+  @override
+  int get hashCode => $hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $typeClassName && other is $typeClassName$equalityTypeClasses;
+  }
 }
 
 ''');
@@ -392,11 +454,11 @@
 
 /// Generates the JavaDoc comments.
 class _DocGenerator extends Visitor<JavaDocComment, void> {
-  const _DocGenerator(this.s, {required this.depth});
-
   final StringSink s;
   final int depth;
 
+  const _DocGenerator(this.s, {required this.depth});
+
   @override
   void visit(JavaDocComment node) {
     final link = RegExp('{@link ([^{}]+)}');
@@ -421,10 +483,10 @@
 
 /// Generates the user-facing Dart type.
 class _TypeGenerator extends TypeVisitor<String> {
-  const _TypeGenerator(this.resolver);
-
   final Resolver? resolver;
 
+  const _TypeGenerator(this.resolver);
+
   @override
   String visitArrayType(ArrayType node) {
     final innerType = node.type;
@@ -478,7 +540,7 @@
 
   @override
   String visitTypeVar(TypeVar node) {
-    return node.name;
+    return '$_typeParamPrefix${node.name}';
   }
 
   @override
@@ -494,10 +556,10 @@
 }
 
 class _TypeClass {
-  const _TypeClass(this.name, this.canBeConst);
-
   final String name;
   final bool canBeConst;
+
+  const _TypeClass(this.name, this.canBeConst);
 }
 
 /// Generates the type class.
@@ -528,7 +590,6 @@
     }
     final allTypeParams = node.classDecl.allTypeParams
         .accept(const _TypeParamGenerator(withExtends: false))
-        .map((typeParam) => '$_typeParamPrefix$typeParam')
         .toList();
 
     // The ones that are declared.
@@ -539,9 +600,6 @@
     // also const.
     final canBeConst = definedTypeClasses.every((e) => e.canBeConst);
 
-    // Adding const to `JObjectType`s if the entire expression is not const.
-    final constJObject = canBeConst ? '' : 'const ';
-
     // Replacing the declared ones. They come at the end.
     // The rest will be `JObjectType`.
     if (allTypeParams.length >= node.params.length) {
@@ -550,13 +608,16 @@
         allTypeParams.length - node.params.length,
         List.filled(
           allTypeParams.length - node.params.length,
-          '$constJObject$_jObject$_typeClassSuffix()',
+          // Adding const to subexpressions if the entire expression is not const.
+          '${canBeConst ? '' : 'const '}$_jObject$_typeClassSuffix()',
         ),
       );
       allTypeParams.replaceRange(
         allTypeParams.length - node.params.length,
         allTypeParams.length,
-        definedTypeClasses.map((param) => param.name),
+        // Adding const to subexpressions if the entire expression is not const.
+        definedTypeClasses.map((param) =>
+            '${param.canBeConst && !canBeConst ? 'const ' : ''}${param.name}'),
       );
     }
 
@@ -577,7 +638,7 @@
 
   @override
   _TypeClass visitTypeVar(TypeVar node) {
-    return _TypeClass('$_typeParamPrefix${node.name}', false);
+    return _TypeClass(node.name, false);
   }
 
   @override
@@ -594,17 +655,17 @@
 }
 
 class _TypeParamGenerator extends Visitor<TypeParam, String> {
-  const _TypeParamGenerator({required this.withExtends});
-
   final bool withExtends;
 
+  const _TypeParamGenerator({required this.withExtends});
+
   @override
   String visit(TypeParam node) {
     if (!withExtends) {
       return node.name;
     }
     // TODO(#144): resolve the actual type being extended, if any.
-    return '${node.name} extends $_jObject';
+    return '$_typeParamPrefix${node.name} extends $_jObject';
   }
 }
 
@@ -637,10 +698,10 @@
 ///   .asFunction<jni.JniResult Function(int, int)>();
 /// ```
 class _TypeSig extends TypeVisitor<String> {
-  const _TypeSig({required this.isFfi});
-
   final bool isFfi;
 
+  const _TypeSig({required this.isFfi});
+
   @override
   String visitPrimitiveType(PrimitiveType node) {
     if (isFfi) return '$_ffi.${node.ffiType}';
@@ -700,11 +761,11 @@
 }
 
 class _FromNative extends TypeVisitor<String> {
-  const _FromNative(this.resolver, this.value);
-
   final Resolver? resolver;
   final String value;
 
+  const _FromNative(this.resolver, this.value);
+
   @override
   String visitPrimitiveType(PrimitiveType node) {
     return value;
@@ -718,12 +779,12 @@
 }
 
 class _FieldGenerator extends Visitor<Field, void> {
-  const _FieldGenerator(this.config, this.resolver, this.s);
-
   final Config config;
   final Resolver? resolver;
   final StringSink s;
 
+  const _FieldGenerator(this.config, this.resolver, this.s);
+
   void writeCAccessor(Field node) {
     final name = node.finalName;
     final cName = node.accept(const CFieldName());
@@ -854,10 +915,10 @@
 }
 
 class _MethodTypeSig extends Visitor<Method, String> {
-  const _MethodTypeSig({required this.isFfi});
-
   final bool isFfi;
 
+  const _MethodTypeSig({required this.isFfi});
+
   @override
   String visit(Method node) {
     final args = [
@@ -872,12 +933,12 @@
 
 /// Generates Dart bindings for Java methods.
 class _MethodGenerator extends Visitor<Method, void> {
-  const _MethodGenerator(this.config, this.resolver, this.s);
-
   final Config config;
   final Resolver? resolver;
   final StringSink s;
 
+  const _MethodGenerator(this.config, this.resolver, this.s);
+
   void writeCAccessor(Method node) {
     final name = node.finalName;
     final cName = node.accept(const CMethodName());
@@ -938,7 +999,8 @@
     final params =
         node.params.accept(const _ParamCall(isCBased: false)).join(', ');
     final resultGetter = node.returnType.accept(const _JniResultGetter());
-    return '$_accessors.call${ifStatic}MethodWithArgs($self, _id_$name, $callType, [$params]).$resultGetter';
+    return '$_accessors.call${ifStatic}MethodWithArgs'
+        '($self, _id_$name, $callType, [$params]).$resultGetter';
   }
 
   @override
@@ -959,27 +1021,58 @@
     }
     node.javadoc?.accept(_DocGenerator(s, depth: 1));
 
+    // Used for inferring the type parameter from the given parameters.
+    final typeLocators = node.params
+        .accept(_ParamTypeLocator(resolver: resolver))
+        .fold(<String, List<String>>{}, _mergeMapValues).map(
+            (key, value) => MapEntry(
+                  key,
+                  _encloseIfNotEmpty(
+                    '[',
+                    value.delimited(', '),
+                    ']',
+                  ),
+                ));
+
+    bool isRequired(TypeParam typeParam) {
+      return (typeLocators[typeParam.name] ?? '').isEmpty;
+    }
+
+    final typeInference =
+        (node.isCtor ? node.classDecl.allTypeParams : node.typeParams)
+            .where((tp) => !isRequired(tp))
+            .map((tp) => tp.name)
+            .map((tp) => '$tp ??= $_jni.lowestCommonSuperType'
+                '(${typeLocators[tp]}) as $_jType<$_typeParamPrefix$tp>;')
+            .join(_newLine(depth: 2));
+
     if (node.isCtor) {
       final className = node.classDecl.finalName;
       final name = node.finalName;
       final ctorName = name == 'ctor' ? className : '$className.$name';
-      final paramsDef = [
-        ...node.classDecl.allTypeParams.accept(const _ClassTypeParamDef()),
-        ...node.params.accept(_ParamDef(resolver)),
-      ].join(', ');
-      final superClass = (node.classDecl.superclass!.type as DeclaredType);
-      final superTypeClassesCall = superClass.classDecl == ClassDecl.object
-          ? ''
-          : superClass.params
-              .accept(_TypeClassGenerator(resolver))
-              .map((typeClass) => '${typeClass.name},')
-              .join(_newLine(depth: 2));
+      final paramsDef = node.params.accept(_ParamDef(resolver)).delimited(', ');
+      final typeClassDef = _encloseIfNotEmpty(
+        '{',
+        node.classDecl.allTypeParams
+            .map((typeParam) => typeParam
+                .accept(_CtorTypeClassDef(isRequired: isRequired(typeParam))))
+            .delimited(', '),
+        '}',
+      );
+      final typeClassCall = node.classDecl.allTypeParams
+          .map((typeParam) =>
+              typeParam.accept(const _TypeParamGenerator(withExtends: false)))
+          .delimited(', ');
+
       final ctorExpr = (isCBased ? cCtor : dartOnlyCtor)(node);
       s.write('''
-  $ctorName($paramsDef) : super.fromRef(
-    $superTypeClassesCall
-    $ctorExpr.object
-  );
+  factory $ctorName($paramsDef$typeClassDef) {
+    $typeInference
+    return ${node.classDecl.finalName}.fromRef(
+      $typeClassCall
+      $ctorExpr.object
+    );
+  }
 
 ''');
       return;
@@ -993,10 +1086,16 @@
         .accept(_TypeClassGenerator(resolver))
         .name;
     final ifStatic = node.isStatic ? 'static ' : '';
-    final defArgs = [
-      ...node.typeParams.accept(const _MethodTypeParamDef()),
-      ...node.params.accept(_ParamDef(resolver))
-    ];
+    final defArgs = node.params.accept(_ParamDef(resolver)).toList();
+    final typeClassDef = _encloseIfNotEmpty(
+      '{',
+      node.typeParams
+          .map((typeParam) => typeParam.accept(_MethodTypeClassDef(
+                isRequired: isRequired(typeParam),
+              )))
+          .delimited(', '),
+      '}',
+    );
     final typeParamsDef = _encloseIfNotEmpty(
       '<',
       node.typeParams
@@ -1007,13 +1106,14 @@
     if (isSuspendFun(node)) {
       defArgs.removeLast();
     }
-    final params = defArgs.join(', ');
-    s.write('  $ifStatic$returnType $name$typeParamsDef($params) ');
+    final params = defArgs.delimited(', ');
+    s.write('  $ifStatic$returnType $name$typeParamsDef($params$typeClassDef)');
     final callExpr = (isCBased ? cMethodCall : dartOnlyMethodCall)(node);
     if (isSuspendFun(node)) {
       final returning =
           node.asyncReturnType!.accept(_FromNative(resolver, '\$o'));
       s.write('''async {
+    $typeInference
     final \$p = ReceivePort();
     final \$c = $_jObject.fromRef($_jni.Jni.newPortContinuation(\$p));
     $callExpr;
@@ -1028,41 +1128,51 @@
 ''');
     } else {
       final returning = node.returnType.accept(_FromNative(resolver, callExpr));
-      s.writeln('=> $returning;\n');
+      s.writeln('''{
+    $typeInference
+    return $returning;
+  }
+''');
     }
   }
 }
 
 /// Generates the method type param definition.
 ///
-/// For example `JObjType<T> $T` in:
+/// For example `required JObjType<T> $T` in:
 /// ```dart
-/// void bar(JObjType<T> $T, ...) => ...
+/// void bar(..., {required JObjType<T> $T}) => ...
 /// ```
-class _MethodTypeParamDef extends Visitor<TypeParam, String> {
-  const _MethodTypeParamDef();
+class _MethodTypeClassDef extends Visitor<TypeParam, String> {
+  final bool isRequired;
+
+  const _MethodTypeClassDef({required this.isRequired});
 
   @override
   String visit(TypeParam node) {
-    return '$_jType<${node.name}> $_typeParamPrefix${node.name}';
+    return '${isRequired ? 'required ' : ''}$_jType'
+        '<$_typeParamPrefix${node.name}>${isRequired ? '' : '?'} ${node.name}';
   }
 }
 
 /// Generates the class type param definition. Used only in constructors.
 ///
-/// For example `this.$T` in:
+/// For example `required this.$T` in:
 /// ```dart
 /// class Foo {
 ///   final JObjType<T> $T;
-///   Foo(this.$T, ...) => ...
+///   Foo(..., {required this.$T}) => ...
 /// }
 /// ```
-class _ClassTypeParamDef extends Visitor<TypeParam, String> {
-  const _ClassTypeParamDef();
+class _CtorTypeClassDef extends Visitor<TypeParam, String> {
+  final bool isRequired;
+
+  const _CtorTypeClassDef({required this.isRequired});
 
   @override
   String visit(TypeParam node) {
-    return 'this.$_typeParamPrefix${node.name}';
+    return '${isRequired ? 'required ' : ''} $_jType'
+        '<$_typeParamPrefix${node.name}>${isRequired ? '' : '?'} ${node.name}';
   }
 }
 
@@ -1073,10 +1183,10 @@
 /// void bar(Foo foo) => ...
 /// ```
 class _ParamDef extends Visitor<Param, String> {
-  const _ParamDef(this.resolver);
-
   final Resolver? resolver;
 
+  const _ParamDef(this.resolver);
+
   @override
   String visit(Param node) {
     final type = node.type.accept(_TypeGenerator(resolver));
@@ -1131,3 +1241,135 @@
     return '$_jni.JValue${node.name.capitalize()}($param)';
   }
 }
+
+/// A pair of [StringBuffer]s that can create an expression from the outer layer
+/// inwards.
+///
+/// For example:
+/// ```dart
+/// final buffer = OutsideInBuffer(); // asterisk (*) is used to show the middle
+/// buffer.appendLeft('f('); // f(*
+/// buffer.prependRight('x)'); // f(*x)
+/// buffer.appendLeft('g('); // f(g(*x)
+/// buffer.prependRight('y) + '); // f(g(*y) + x)
+/// buffer.toString(); // f(g(y) + x)
+/// ```
+@visibleForTesting
+class OutsideInBuffer {
+  final StringBuffer _leftBuffer;
+  final StringBuffer _rightBuffer;
+
+  OutsideInBuffer()
+      : _leftBuffer = StringBuffer(),
+        _rightBuffer = StringBuffer();
+
+  void prependRight(Object? object) {
+    final s = object.toString();
+    for (var i = 0; i < s.length; ++i) {
+      _rightBuffer.write(s[s.length - i - 1]);
+    }
+  }
+
+  void appendLeft(Object? object) {
+    _leftBuffer.write(object);
+  }
+
+  @override
+  String toString() {
+    return _leftBuffer.toString() + _rightBuffer.toString().reversed;
+  }
+}
+
+/// The ways to locate each type parameter.
+///
+/// For example in `JArray<JMap<$T, $T>> a`, `T` can be retreived using
+/// ```dart
+/// ((((a.$type as jni.JArrayType).elementType) as $JMapType).K) as jni.JObjType<$T>
+/// ```
+/// and
+/// ```dart
+/// ((((a.$type as jni.JArrayType).elementType) as $JMapType).V) as jni.JObjType<$T>
+/// ```
+class _ParamTypeLocator extends Visitor<Param, Map<String, List<String>>> {
+  final Resolver? resolver;
+
+  _ParamTypeLocator({required this.resolver});
+
+  @override
+  Map<String, List<String>> visit(Param node) {
+    return node.type.accept(_TypeVarLocator(resolver: resolver)).map(
+          (key, value) => MapEntry(
+            key,
+            value
+                .map((e) =>
+                    (e..appendLeft('${node.finalName}.\$type')).toString())
+                .toList(),
+          ),
+        );
+  }
+}
+
+class _TypeVarLocator extends TypeVisitor<Map<String, List<OutsideInBuffer>>> {
+  final Resolver? resolver;
+
+  _TypeVarLocator({required this.resolver});
+
+  @override
+  Map<String, List<OutsideInBuffer>> visitNonPrimitiveType(ReferredType node) {
+    return {};
+  }
+
+  @override
+  Map<String, List<OutsideInBuffer>> visitWildcard(Wildcard node) {
+    // TODO(#141): Support wildcards
+    return super.visitWildcard(node);
+  }
+
+  @override
+  Map<String, List<OutsideInBuffer>> visitTypeVar(TypeVar node) {
+    return {
+      node.name: [
+        OutsideInBuffer(),
+      ],
+    };
+  }
+
+  @override
+  Map<String, List<OutsideInBuffer>> visitDeclaredType(DeclaredType node) {
+    if (node.classDecl == ClassDecl.object) {
+      return {};
+    }
+    final offset = node.classDecl.allTypeParams.length - node.params.length;
+    final result = <String, List<OutsideInBuffer>>{};
+    final prefix = resolver?.resolvePrefix(node.binaryName) ?? '';
+    final typeClass =
+        '$prefix$_typeClassPrefix${node.classDecl.finalName}$_typeClassSuffix';
+    for (var i = 0; i < node.params.length; ++i) {
+      final typeParam = node.classDecl.allTypeParams[i + offset].name;
+      final exprs = node.params[i].accept(this);
+      for (final expr in exprs.entries) {
+        for (final buffer in expr.value) {
+          buffer.appendLeft('(');
+          buffer.prependRight(' as $typeClass).$typeParam');
+          result[expr.key] = (result[expr.key] ?? [])..add(buffer);
+        }
+      }
+    }
+    return result;
+  }
+
+  @override
+  Map<String, List<OutsideInBuffer>> visitArrayType(ArrayType node) {
+    final exprs = node.type.accept(this);
+    for (final e in exprs.values.expand((i) => i)) {
+      e.appendLeft('((');
+      e.prependRight(' as $_jArray$_typeClassSuffix).elementType as $_jType)');
+    }
+    return exprs;
+  }
+
+  @override
+  Map<String, List<OutsideInBuffer>> visitPrimitiveType(PrimitiveType node) {
+    return {};
+  }
+}
diff --git a/pkgs/jnigen/lib/src/bindings/excluder.dart b/pkgs/jnigen/lib/src/bindings/excluder.dart
index 88beefd..1568bd3 100644
--- a/pkgs/jnigen/lib/src/bindings/excluder.dart
+++ b/pkgs/jnigen/lib/src/bindings/excluder.dart
@@ -11,10 +11,10 @@
     !classMember.isPublic && !classMember.isProtected;
 
 class Excluder extends Visitor<Classes, void> {
-  const Excluder(this.config);
-
   final Config config;
 
+  const Excluder(this.config);
+
   @override
   void visit(Classes node) {
     node.decls.removeWhere((_, classDecl) {
@@ -33,10 +33,10 @@
 }
 
 class _ClassExcluder extends Visitor<ClassDecl, void> {
-  _ClassExcluder(this.config);
-
   final Config config;
 
+  _ClassExcluder(this.config);
+
   @override
   void visit(ClassDecl node) {
     node.methods = node.methods.where((method) {
diff --git a/pkgs/jnigen/lib/src/bindings/linker.dart b/pkgs/jnigen/lib/src/bindings/linker.dart
index f4fe617..e50d437 100644
--- a/pkgs/jnigen/lib/src/bindings/linker.dart
+++ b/pkgs/jnigen/lib/src/bindings/linker.dart
@@ -61,6 +61,8 @@
     final superclass = (node.superclass!.type as DeclaredType).classDecl;
     superclass.accept(this);
 
+    node.superCount = superclass.superCount + 1;
+
     final fieldLinker = _FieldLinker(typeLinker);
     for (final field in node.fields) {
       field.classDecl = node;
diff --git a/pkgs/jnigen/lib/src/bindings/renamer.dart b/pkgs/jnigen/lib/src/bindings/renamer.dart
index e9fbda9..4f1c440 100644
--- a/pkgs/jnigen/lib/src/bindings/renamer.dart
+++ b/pkgs/jnigen/lib/src/bindings/renamer.dart
@@ -119,9 +119,10 @@
 }
 
 class Renamer implements Visitor<Classes, void> {
-  Renamer(this.config);
   final Config config;
 
+  Renamer(this.config);
+
   @override
   void visit(Classes node) {
     final classRenamer = _ClassRenamer(config);
@@ -133,10 +134,6 @@
 }
 
 class _ClassRenamer implements Visitor<ClassDecl, void> {
-  _ClassRenamer(
-    this.config,
-  );
-
   final Config config;
   final Map<String, int> classNameCounts = {};
   final Set<ClassDecl> renamed = {...ClassDecl.predefined.values};
@@ -147,6 +144,10 @@
   };
   final Map<ClassDecl, Map<String, int>> methodNumsAfterRenaming = {};
 
+  _ClassRenamer(
+    this.config,
+  );
+
   /// Returns class name as useful in dart.
   ///
   /// Eg -> a.b.X.Y -> X_Y
diff --git a/pkgs/jnigen/lib/src/bindings/resolver.dart b/pkgs/jnigen/lib/src/bindings/resolver.dart
index cc7a45e..b0c8230 100644
--- a/pkgs/jnigen/lib/src/bindings/resolver.dart
+++ b/pkgs/jnigen/lib/src/bindings/resolver.dart
@@ -7,12 +7,6 @@
 import '../logging/logging.dart';
 
 class Resolver {
-  Resolver({
-    required this.importMap,
-    required this.currentClass,
-    this.inputClassNames = const {},
-  });
-
   static const Map<String, String> predefined = {
     'java.lang.String': 'jni.',
   };
@@ -32,6 +26,12 @@
   final Map<String, String> _importedNameToClass = {};
   final Map<String, String> _classToImportedName = {};
 
+  Resolver({
+    required this.importMap,
+    required this.currentClass,
+    this.inputClassNames = const {},
+  });
+
   static String getFileClassName(String binaryName) {
     final dollarSign = binaryName.indexOf('\$');
     if (dollarSign != -1) {
diff --git a/pkgs/jnigen/lib/src/bindings/visitor.dart b/pkgs/jnigen/lib/src/bindings/visitor.dart
index 8454cac..c2bf9e6 100644
--- a/pkgs/jnigen/lib/src/bindings/visitor.dart
+++ b/pkgs/jnigen/lib/src/bindings/visitor.dart
@@ -22,18 +22,21 @@
 }
 
 extension MultiVisitor<T extends Element<T>> on Iterable<Element<T>> {
+  /// Accepts all lazily. Remember to call `.toList()` or similar methods!
   Iterable<R> accept<R>(Visitor<T, R> v) {
     return map((e) => e.accept(v));
   }
 }
 
 extension MultiTypeVisitor<T extends ReferredType> on Iterable<T> {
+  /// Accepts all lazily. Remember to call `.toList()` or similar methods!
   Iterable<R> accept<R>(TypeVisitor<R> v) {
     return map((e) => e.accept(v));
   }
 }
 
 extension MultiTypeUsageVisitor on Iterable<TypeUsage> {
+  /// Accepts all lazily. Remember to call `.toList()` or similar methods!
   Iterable<R> accept<R>(TypeVisitor<R> v) {
     return map((e) => e.type.accept(v));
   }
diff --git a/pkgs/jnigen/lib/src/elements/elements.dart b/pkgs/jnigen/lib/src/elements/elements.dart
index 7347665..4c3ce2a 100644
--- a/pkgs/jnigen/lib/src/elements/elements.dart
+++ b/pkgs/jnigen/lib/src/elements/elements.dart
@@ -97,15 +97,21 @@
 
   String get internalName => binaryName.replaceAll(".", "/");
 
+  /// The number of super classes this type has.
+  ///
+  /// Populated by [Linker].
+  @JsonKey(includeFromJson: false)
+  late final int superCount;
+
   /// Parent's [ClassDecl] obtained from [parentName].
   ///
-  /// Will be populated by [Linker].
+  /// Populated by [Linker].
   @JsonKey(includeFromJson: false)
   late final ClassDecl? parent;
 
   /// Final name of this class.
   ///
-  /// Will be populated by [Renamer].
+  /// Populated by [Renamer].
   @JsonKey(includeFromJson: false)
   late final String finalName;
 
@@ -114,13 +120,13 @@
   /// This is used by C bindings instead of fully qualified name to reduce
   /// the verbosity of generated bindings.
   ///
-  /// Will be populated by [Renamer].
+  /// Populated by [Renamer].
   @JsonKey(includeFromJson: false)
   late final String uniqueName;
 
   /// Type parameters including the ones from its ancestors
   ///
-  /// Will be populated by [Linker].
+  /// Populated by [Linker].
   @JsonKey(includeFromJson: false)
   List<TypeParam> allTypeParams = const [];
 
@@ -135,14 +141,18 @@
     binaryName: 'java.lang.Object',
     packageName: 'java.lang',
     simpleName: 'Object',
-  )..finalName = 'JObject';
+  )
+    ..finalName = 'JObject'
+    ..superCount = 0;
 
   static final string = ClassDecl(
     superclass: TypeUsage.object,
     binaryName: 'java.lang.String',
     packageName: 'java.lang',
     simpleName: 'String',
-  )..finalName = 'JString';
+  )
+    ..finalName = 'JString'
+    ..superCount = 1;
 
   static final predefined = {
     'java.lang.Object': object,
@@ -202,7 +212,7 @@
   @JsonKey(name: "type")
   final Map<String, dynamic> typeJson;
 
-  /// Will be populated in [TypeUsage.fromJson].
+  /// Populated by in [TypeUsage.fromJson].
   @JsonKey(includeFromJson: false)
   late final ReferredType type;
 
@@ -462,12 +472,12 @@
 
   /// The [ClassDecl] where this method is defined.
   ///
-  /// Will be populated by [Linker].
+  /// Populated by [Linker].
   @JsonKey(includeFromJson: false)
   @override
   late ClassDecl classDecl;
 
-  /// Will be populated by [Renamer].
+  /// Populated by [Renamer].
   @JsonKey(includeFromJson: false)
   late String finalName;
 
@@ -513,7 +523,7 @@
   final String name;
   final TypeUsage type;
 
-  /// Will be populated by [Renamer].
+  /// Populated by [Renamer].
   @JsonKey(includeFromJson: false)
   late String finalName;
 
@@ -548,12 +558,12 @@
 
   /// The [ClassDecl] where this field is defined.
   ///
-  /// Will be populated by [Linker].
+  /// Populated by [Linker].
   @JsonKey(includeFromJson: false)
   @override
   late final ClassDecl classDecl;
 
-  /// Will be populated by [Renamer].
+  /// Populated by [Renamer].
   @JsonKey(includeFromJson: false)
   late final String finalName;
 
diff --git a/pkgs/jnigen/pubspec.yaml b/pkgs/jnigen/pubspec.yaml
index 2a3c731..48092a8 100644
--- a/pkgs/jnigen/pubspec.yaml
+++ b/pkgs/jnigen/pubspec.yaml
@@ -3,7 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 name: jnigen
-version: 0.3.0
+version: 0.4.0-dev
 description: Experimental generator for FFI+JNI bindings.
 repository: https://github.com/dart-lang/jnigen/tree/main/jnigen
 
@@ -17,12 +17,13 @@
   args: ^2.3.0
   yaml: ^3.1.0
   logging: ^1.0.2
+  meta: ^1.8.0
   cli_config: ^0.1.0
 
 dev_dependencies:
   lints: ^2.0.0
   jni:
     path: ../jni
-  test: ^1.17.5
+  test: ^1.24.1
   build_runner: ^2.2.0
   json_serializable: ^6.6.0
diff --git a/pkgs/jnigen/test/bindings_test.dart b/pkgs/jnigen/test/bindings_test.dart
index 3c1cd9f..107c24d 100644
--- a/pkgs/jnigen/test/bindings_test.dart
+++ b/pkgs/jnigen/test/bindings_test.dart
@@ -50,6 +50,7 @@
         join(group, 'generics', 'StringStack.java'),
         join(group, 'generics', 'StringValuedMap.java'),
         join(group, 'generics', 'StringKeyedMap.java'),
+        join(group, 'generics', 'StringMap.java'),
         join(group, 'annotations', 'JsonSerializable.java'),
         join(group, 'annotations', 'MyDataClass.java'),
         join(group, 'pkg2', 'C2.java'),
@@ -185,9 +186,18 @@
     expect(() => Example.throwException(), throwsException);
   });
   group('generics', () {
+    test('GrandParent constructor', () {
+      using((arena) {
+        final grandParent = GrandParent('Hello'.toJString()..deletedIn(arena))
+          ..deletedIn(arena);
+        expect(grandParent, isA<GrandParent<JString>>());
+        expect(grandParent.$type, isA<$GrandParentType<JString>>());
+        expect(grandParent.value.toDartString(deleteOriginal: true), 'Hello');
+      });
+    });
     test('MyStack<T>', () {
       using((arena) {
-        final stack = MyStack(JString.type)..deletedIn(arena);
+        final stack = MyStack(T: JString.type)..deletedIn(arena);
         stack.push('Hello'.toJString()..deletedIn(arena));
         stack.push('World'.toJString()..deletedIn(arena));
         expect(stack.pop().toDartString(deleteOriginal: true), 'World');
@@ -196,7 +206,7 @@
     });
     test('MyMap<K, V>', () {
       using((arena) {
-        final map = MyMap(JString.type, Example.type)..deletedIn(arena);
+        final map = MyMap(K: JString.type, V: Example.type)..deletedIn(arena);
         final helloExample = Example.ctor1(1)..deletedIn(arena);
         final worldExample = Example.ctor1(2)..deletedIn(arena);
         map.put('Hello'.toJString()..deletedIn(arena), helloExample);
@@ -230,7 +240,7 @@
       });
       test('StringKeyedMap', () {
         using((arena) {
-          final map = StringKeyedMap(Example.type)..deletedIn(arena);
+          final map = StringKeyedMap(V: Example.type)..deletedIn(arena);
           final example = Example()..deletedIn(arena);
           map.put('Hello'.toJString()..deletedIn(arena), example);
           expect(
@@ -242,7 +252,7 @@
       });
       test('StringValuedMap', () {
         using((arena) {
-          final map = StringValuedMap(Example.type)..deletedIn(arena);
+          final map = StringValuedMap(K: Example.type)..deletedIn(arena);
           final example = Example()..deletedIn(arena);
           map.put(example, 'Hello'.toJString()..deletedIn(arena));
           expect(
@@ -251,11 +261,31 @@
           );
         });
       });
+      test('StringMap', () {
+        using((arena) {
+          final map = StringMap()..deletedIn(arena);
+          map.put('hello'.toJString()..deletedIn(arena),
+              'world'.toJString()..deletedIn(arena));
+          expect(
+            map
+                .get0('hello'.toJString()..deletedIn(arena))
+                .toDartString(deleteOriginal: true),
+            'world',
+          );
+        });
+      });
+    });
+    test('superclass count', () {
+      expect(JObject.type.superCount, 0);
+      expect(MyMap.type(JObject.type, JObject.type).superCount, 1);
+      expect(StringKeyedMap.type(JObject.type).superCount, 2);
+      expect(StringValuedMap.type(JObject.type).superCount, 2);
+      expect(StringMap.type.superCount, 3);
     });
     test('nested generics', () {
       using((arena) {
         final grandParent =
-            GrandParent(JString.type, "!".toJString()..deletedIn(arena))
+            GrandParent(T: JString.type, "!".toJString()..deletedIn(arena))
               ..deletedIn(arena);
         expect(
           grandParent.value.toDartString(deleteOriginal: true),
@@ -270,7 +300,7 @@
         );
 
         final exampleStaticParent = GrandParent.varStaticParent(
-            Example.type, Example()..deletedIn(arena))
+            S: Example.type, Example()..deletedIn(arena))
           ..deletedIn(arena);
         expect(
           (exampleStaticParent.value..deletedIn(arena)).getInternal(),
@@ -290,7 +320,7 @@
         );
 
         final exampleParent = grandParent.varParent(
-            Example.type, Example()..deletedIn(arena))
+            S: Example.type, Example()..deletedIn(arena))
           ..deletedIn(arena);
         expect(
           exampleParent.parentValue
@@ -307,6 +337,99 @@
       });
     });
   });
+  group('Generic type inference', () {
+    test('MyStack.of1', () {
+      using((arena) {
+        final emptyStack = MyStack(T: JString.type)..deletedIn(arena);
+        expect(emptyStack.size(), 0);
+        final stack = MyStack.of1(
+          "Hello".toJString()..deletedIn(arena),
+        )..deletedIn(arena);
+        expect(stack, isA<MyStack<JString>>());
+        expect(stack.$type, isA<$MyStackType<JString>>());
+        expect(
+          stack.pop().toDartString(deleteOriginal: true),
+          "Hello",
+        );
+      });
+    });
+    test('MyStack.of 2 strings', () {
+      using((arena) {
+        final stack = MyStack.of2(
+          "Hello".toJString()..deletedIn(arena),
+          "World".toJString()..deletedIn(arena),
+        )..deletedIn(arena);
+        expect(stack, isA<MyStack<JString>>());
+        expect(stack.$type, isA<$MyStackType<JString>>());
+        expect(
+          stack.pop().toDartString(deleteOriginal: true),
+          "World",
+        );
+        expect(
+          stack.pop().toDartString(deleteOriginal: true),
+          "Hello",
+        );
+      });
+    });
+    test('MyStack.of a string and an array', () {
+      using((arena) {
+        final array = JArray.filled(1, "World".toJString()..deletedIn(arena))
+          ..deletedIn(arena);
+        final stack = MyStack.of2(
+          "Hello".toJString()..deletedIn(arena),
+          array,
+        )..deletedIn(arena);
+        expect(stack, isA<MyStack<JObject>>());
+        expect(stack.$type, isA<$MyStackType<JObject>>());
+        expect(
+          stack
+              .pop()
+              .castTo(JArray.type(JString.type), deleteOriginal: true)[0]
+              .toDartString(deleteOriginal: true),
+          "World",
+        );
+        expect(
+          stack
+              .pop()
+              .castTo(JString.type, deleteOriginal: true)
+              .toDartString(deleteOriginal: true),
+          "Hello",
+        );
+      });
+    });
+    test('MyStack.from array of string', () {
+      using((arena) {
+        final array = JArray.filled(1, "Hello".toJString()..deletedIn(arena))
+          ..deletedIn(arena);
+        final stack = MyStack.fromArray(array)..deletedIn(arena);
+        expect(stack, isA<MyStack<JString>>());
+        expect(stack.$type, isA<$MyStackType<JString>>());
+        expect(
+          stack.pop().toDartString(deleteOriginal: true),
+          "Hello",
+        );
+      });
+    });
+    test('MyStack.fromArrayOfArrayOfGrandParents', () {
+      using((arena) {
+        final firstDimention = JArray.filled(
+          1,
+          GrandParent("Hello".toJString()..deletedIn(arena))..deletedIn(arena),
+        )..deletedIn(arena);
+        final twoDimentionalArray = JArray.filled(1, firstDimention)
+          ..deletedIn(arena);
+        final stack =
+            MyStack.fromArrayOfArrayOfGrandParents(twoDimentionalArray)
+              ..deletedIn(arena);
+        expect(stack, isA<MyStack<JString>>());
+        expect(stack.$type, isA<$MyStackType<JString>>());
+        expect(
+          stack.pop().toDartString(deleteOriginal: true),
+          "Hello",
+        );
+      });
+    });
+  });
   group('Kotlin support', () {
     test('Suspend functions', () async {
       await using((arena) async {
diff --git a/pkgs/jnigen/test/dart_generator_test.dart b/pkgs/jnigen/test/dart_generator_test.dart
new file mode 100644
index 0000000..4ad2eb8
--- /dev/null
+++ b/pkgs/jnigen/test/dart_generator_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:jnigen/src/bindings/dart_generator.dart';
+import 'package:test/test.dart';
+
+void main() {
+  test('OutsideInBuffer', () {
+    final buffer = OutsideInBuffer();
+    buffer.appendLeft('f(');
+    buffer.prependRight('x)');
+    buffer.appendLeft('g(');
+    buffer.prependRight('y) + ');
+    expect(buffer.toString(), 'f(g(y) + x)');
+  });
+}
diff --git a/pkgs/jnigen/test/jackson_core_test/third_party/lib/com/fasterxml/jackson/core/JsonFactory.dart b/pkgs/jnigen/test/jackson_core_test/third_party/lib/com/fasterxml/jackson/core/JsonFactory.dart
index 7ce9e77..2ceb324 100644
--- a/pkgs/jnigen/test/jackson_core_test/third_party/lib/com/fasterxml/jackson/core/JsonFactory.dart
+++ b/pkgs/jnigen/test/jackson_core_test/third_party/lib/com/fasterxml/jackson/core/JsonFactory.dart
@@ -59,9 +59,8 @@
 /// instances.
 ///@author Tatu Saloranta
 class JsonFactory extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   JsonFactory.fromRef(
     jni.JObjectPtr ref,
@@ -155,18 +154,22 @@
   /// processing objects (such as symbol tables parsers use)
   /// and this reuse only works within context of a single
   /// factory instance.
-  JsonFactory()
-      : super.fromRef(
-            jniAccessors.newObjectWithArgs(_classRef, _id_ctor, []).object);
+  factory JsonFactory() {
+    return JsonFactory.fromRef(
+        jniAccessors.newObjectWithArgs(_classRef, _id_ctor, []).object);
+  }
 
   static final _id_ctor1 = jniAccessors.getMethodIDOf(
       _classRef, r"<init>", r"(Lcom/fasterxml/jackson/core/ObjectCodec;)V");
 
   /// from: public void <init>(com.fasterxml.jackson.core.ObjectCodec oc)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  JsonFactory.ctor1(jni.JObject oc)
-      : super.fromRef(jniAccessors
-            .newObjectWithArgs(_classRef, _id_ctor1, [oc.reference]).object);
+  factory JsonFactory.ctor1(
+    jni.JObject oc,
+  ) {
+    return JsonFactory.fromRef(jniAccessors
+        .newObjectWithArgs(_classRef, _id_ctor1, [oc.reference]).object);
+  }
 
   static final _id_ctor2 = jniAccessors.getMethodIDOf(_classRef, r"<init>",
       r"(Lcom/fasterxml/jackson/core/JsonFactory;Lcom/fasterxml/jackson/core/ObjectCodec;)V");
@@ -178,9 +181,13 @@
   ///@param src Original factory to copy settings from
   ///@param codec Databinding-level codec to use, if any
   ///@since 2.2.1
-  JsonFactory.ctor2(JsonFactory src, jni.JObject codec)
-      : super.fromRef(jniAccessors.newObjectWithArgs(
-            _classRef, _id_ctor2, [src.reference, codec.reference]).object);
+  factory JsonFactory.ctor2(
+    JsonFactory src,
+    jni.JObject codec,
+  ) {
+    return JsonFactory.fromRef(jniAccessors.newObjectWithArgs(
+        _classRef, _id_ctor2, [src.reference, codec.reference]).object);
+  }
 
   static final _id_ctor3 = jniAccessors.getMethodIDOf(_classRef, r"<init>",
       r"(Lcom/fasterxml/jackson/core/JsonFactoryBuilder;)V");
@@ -191,9 +198,12 @@
   /// Constructor used by JsonFactoryBuilder for instantiation.
   ///@param b Builder that contains settings to use
   ///@since 2.10
-  JsonFactory.ctor3(jni.JObject b)
-      : super.fromRef(jniAccessors
-            .newObjectWithArgs(_classRef, _id_ctor3, [b.reference]).object);
+  factory JsonFactory.ctor3(
+    jni.JObject b,
+  ) {
+    return JsonFactory.fromRef(jniAccessors
+        .newObjectWithArgs(_classRef, _id_ctor3, [b.reference]).object);
+  }
 
   static final _id_ctor4 = jniAccessors.getMethodIDOf(
       _classRef, r"<init>", r"(Lcom/fasterxml/jackson/core/TSFBuilder;Z)V");
@@ -206,9 +216,13 @@
   /// implementation for json.
   ///@param b Builder that contains settings to use
   ///@param bogus Argument only needed to separate constructor signature; ignored
-  JsonFactory.ctor4(jni.JObject b, bool bogus)
-      : super.fromRef(jniAccessors.newObjectWithArgs(
-            _classRef, _id_ctor4, [b.reference, bogus ? 1 : 0]).object);
+  factory JsonFactory.ctor4(
+    jni.JObject b,
+    bool bogus,
+  ) {
+    return JsonFactory.fromRef(jniAccessors.newObjectWithArgs(
+        _classRef, _id_ctor4, [b.reference, bogus ? 1 : 0]).object);
+  }
 
   static final _id_rebuild = jniAccessors.getMethodIDOf(
       _classRef, r"rebuild", r"()Lcom/fasterxml/jackson/core/TSFBuilder;");
@@ -220,9 +234,10 @@
   /// with settings of this factory.
   ///@return Builder instance to use
   ///@since 2.10
-  jni.JObject rebuild() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_rebuild, jni.JniCallType.objectType, []).object);
+  jni.JObject rebuild() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_rebuild, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_builder = jniAccessors.getStaticMethodIDOf(
       _classRef, r"builder", r"()Lcom/fasterxml/jackson/core/TSFBuilder;");
@@ -238,9 +253,11 @@
   /// NOTE: signature unfortunately does not expose true implementation type; this
   /// will be fixed in 3.0.
   ///@return Builder instance to use
-  static jni.JObject builder() =>
-      const jni.JObjectType().fromRef(jniAccessors.callStaticMethodWithArgs(
-          _classRef, _id_builder, jni.JniCallType.objectType, []).object);
+  static jni.JObject builder() {
+    return const jni.JObjectType().fromRef(jniAccessors
+        .callStaticMethodWithArgs(
+            _classRef, _id_builder, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_copy = jniAccessors.getMethodIDOf(
       _classRef, r"copy", r"()Lcom/fasterxml/jackson/core/JsonFactory;");
@@ -260,9 +277,10 @@
   /// set codec after making the copy.
   ///@return Copy of this factory instance
   ///@since 2.1
-  JsonFactory copy() =>
-      const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_copy, jni.JniCallType.objectType, []).object);
+  JsonFactory copy() {
+    return const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_copy, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_readResolve = jniAccessors.getMethodIDOf(
       _classRef, r"readResolve", r"()Ljava/lang/Object;");
@@ -276,9 +294,10 @@
   ///
   /// Note: must be overridden by sub-classes as well.
   ///@return Newly constructed instance
-  jni.JObject readResolve() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_readResolve, jni.JniCallType.objectType, []).object);
+  jni.JObject readResolve() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_readResolve, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_requiresPropertyOrdering = jniAccessors.getMethodIDOf(
       _classRef, r"requiresPropertyOrdering", r"()Z");
@@ -299,8 +318,10 @@
   ///@return Whether format supported by this factory
   ///   requires Object properties to be ordered.
   ///@since 2.3
-  bool requiresPropertyOrdering() => jniAccessors.callMethodWithArgs(reference,
-      _id_requiresPropertyOrdering, jni.JniCallType.booleanType, []).boolean;
+  bool requiresPropertyOrdering() {
+    return jniAccessors.callMethodWithArgs(reference,
+        _id_requiresPropertyOrdering, jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_canHandleBinaryNatively =
       jniAccessors.getMethodIDOf(_classRef, r"canHandleBinaryNatively", r"()Z");
@@ -318,8 +339,10 @@
   ///@return Whether format supported by this factory
   ///    supports native binary content
   ///@since 2.3
-  bool canHandleBinaryNatively() => jniAccessors.callMethodWithArgs(reference,
-      _id_canHandleBinaryNatively, jni.JniCallType.booleanType, []).boolean;
+  bool canHandleBinaryNatively() {
+    return jniAccessors.callMethodWithArgs(reference,
+        _id_canHandleBinaryNatively, jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_canUseCharArrays =
       jniAccessors.getMethodIDOf(_classRef, r"canUseCharArrays", r"()Z");
@@ -337,8 +360,10 @@
   ///@return Whether access to decoded textual content can be efficiently
   ///   accessed using parser method {@code getTextCharacters()}.
   ///@since 2.4
-  bool canUseCharArrays() => jniAccessors.callMethodWithArgs(
-      reference, _id_canUseCharArrays, jni.JniCallType.booleanType, []).boolean;
+  bool canUseCharArrays() {
+    return jniAccessors.callMethodWithArgs(reference, _id_canUseCharArrays,
+        jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_canParseAsync =
       jniAccessors.getMethodIDOf(_classRef, r"canParseAsync", r"()Z");
@@ -352,28 +377,34 @@
   ///@return Whether this factory supports non-blocking ("async") parsing or
   ///    not (and consequently whether {@code createNonBlockingXxx()} method(s) work)
   ///@since 2.9
-  bool canParseAsync() => jniAccessors.callMethodWithArgs(
-      reference, _id_canParseAsync, jni.JniCallType.booleanType, []).boolean;
+  bool canParseAsync() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_canParseAsync, jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_getFormatReadFeatureType = jniAccessors.getMethodIDOf(
       _classRef, r"getFormatReadFeatureType", r"()Ljava/lang/Class;");
 
   /// from: public java.lang.Class<? extends com.fasterxml.jackson.core.FormatFeature> getFormatReadFeatureType()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  jni.JObject getFormatReadFeatureType() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_getFormatReadFeatureType, jni.JniCallType.objectType, []).object);
+  jni.JObject getFormatReadFeatureType() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_getFormatReadFeatureType,
+        jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_getFormatWriteFeatureType = jniAccessors.getMethodIDOf(
       _classRef, r"getFormatWriteFeatureType", r"()Ljava/lang/Class;");
 
   /// from: public java.lang.Class<? extends com.fasterxml.jackson.core.FormatFeature> getFormatWriteFeatureType()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  jni.JObject getFormatWriteFeatureType() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_getFormatWriteFeatureType,
-          jni.JniCallType.objectType, []).object);
+  jni.JObject getFormatWriteFeatureType() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_getFormatWriteFeatureType,
+        jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_canUseSchema = jniAccessors.getMethodIDOf(_classRef,
       r"canUseSchema", r"(Lcom/fasterxml/jackson/core/FormatSchema;)Z");
@@ -389,11 +420,12 @@
   ///@param schema Schema instance to check
   ///@return Whether parsers and generators constructed by this factory
   ///   can use specified format schema instance
-  bool canUseSchema(jni.JObject schema) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_canUseSchema,
-      jni.JniCallType.booleanType,
-      [schema.reference]).boolean;
+  bool canUseSchema(
+    jni.JObject schema,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_canUseSchema,
+        jni.JniCallType.booleanType, [schema.reference]).boolean;
+  }
 
   static final _id_getFormatName = jniAccessors.getMethodIDOf(
       _classRef, r"getFormatName", r"()Ljava/lang/String;");
@@ -407,9 +439,10 @@
   /// Note: sub-classes should override this method; default
   /// implementation will return null for all sub-classes
   ///@return Name of the format handled by parsers, generators this factory creates
-  jni.JString getFormatName() =>
-      const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_getFormatName, jni.JniCallType.objectType, []).object);
+  jni.JString getFormatName() {
+    return const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_getFormatName, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_hasFormat = jniAccessors.getMethodIDOf(
       _classRef,
@@ -418,9 +451,15 @@
 
   /// from: public com.fasterxml.jackson.core.format.MatchStrength hasFormat(com.fasterxml.jackson.core.format.InputAccessor acc)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  jni.JObject hasFormat(jni.JObject acc) =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_hasFormat, jni.JniCallType.objectType, [acc.reference]).object);
+  jni.JObject hasFormat(
+    jni.JObject acc,
+  ) {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_hasFormat,
+        jni.JniCallType.objectType,
+        [acc.reference]).object);
+  }
 
   static final _id_requiresCustomCodec =
       jniAccessors.getMethodIDOf(_classRef, r"requiresCustomCodec", r"()Z");
@@ -436,8 +475,10 @@
   ///   generators created by this factory; false if a general
   ///   ObjectCodec is enough
   ///@since 2.1
-  bool requiresCustomCodec() => jniAccessors.callMethodWithArgs(reference,
-      _id_requiresCustomCodec, jni.JniCallType.booleanType, []).boolean;
+  bool requiresCustomCodec() {
+    return jniAccessors.callMethodWithArgs(reference, _id_requiresCustomCodec,
+        jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_hasJSONFormat = jniAccessors.getMethodIDOf(
       _classRef,
@@ -446,21 +487,25 @@
 
   /// from: protected com.fasterxml.jackson.core.format.MatchStrength hasJSONFormat(com.fasterxml.jackson.core.format.InputAccessor acc)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  jni.JObject hasJSONFormat(jni.JObject acc) =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_hasJSONFormat,
-          jni.JniCallType.objectType,
-          [acc.reference]).object);
+  jni.JObject hasJSONFormat(
+    jni.JObject acc,
+  ) {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_hasJSONFormat,
+        jni.JniCallType.objectType,
+        [acc.reference]).object);
+  }
 
   static final _id_version = jniAccessors.getMethodIDOf(
       _classRef, r"version", r"()Lcom/fasterxml/jackson/core/Version;");
 
   /// from: public com.fasterxml.jackson.core.Version version()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  jni.JObject version() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_version, jni.JniCallType.objectType, []).object);
+  jni.JObject version() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_version, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_configure = jniAccessors.getMethodIDOf(
       _classRef,
@@ -476,12 +521,16 @@
   ///@param state Whether to enable or disable the feature
   ///@return This factory instance (to allow call chaining)
   ///@deprecated since 2.10 use JsonFactoryBuilder\#configure(JsonFactory.Feature, boolean) instead
-  JsonFactory configure(JsonFactory_Feature f, bool state) =>
-      const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_configure,
-          jni.JniCallType.objectType,
-          [f.reference, state ? 1 : 0]).object);
+  JsonFactory configure(
+    JsonFactory_Feature f,
+    bool state,
+  ) {
+    return const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_configure,
+        jni.JniCallType.objectType,
+        [f.reference, state ? 1 : 0]).object);
+  }
 
   static final _id_enable = jniAccessors.getMethodIDOf(_classRef, r"enable",
       r"(Lcom/fasterxml/jackson/core/JsonFactory$Feature;)Lcom/fasterxml/jackson/core/JsonFactory;");
@@ -494,12 +543,15 @@
   ///@param f Feature to enable
   ///@return This factory instance (to allow call chaining)
   ///@deprecated since 2.10 use JsonFactoryBuilder\#configure(JsonFactory.Feature, boolean) instead
-  JsonFactory enable(JsonFactory_Feature f) =>
-      const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_enable,
-          jni.JniCallType.objectType,
-          [f.reference]).object);
+  JsonFactory enable(
+    JsonFactory_Feature f,
+  ) {
+    return const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_enable,
+        jni.JniCallType.objectType,
+        [f.reference]).object);
+  }
 
   static final _id_disable = jniAccessors.getMethodIDOf(_classRef, r"disable",
       r"(Lcom/fasterxml/jackson/core/JsonFactory$Feature;)Lcom/fasterxml/jackson/core/JsonFactory;");
@@ -512,12 +564,15 @@
   ///@param f Feature to disable
   ///@return This factory instance (to allow call chaining)
   ///@deprecated since 2.10 use JsonFactoryBuilder\#configure(JsonFactory.Feature, boolean) instead
-  JsonFactory disable(JsonFactory_Feature f) =>
-      const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_disable,
-          jni.JniCallType.objectType,
-          [f.reference]).object);
+  JsonFactory disable(
+    JsonFactory_Feature f,
+  ) {
+    return const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_disable,
+        jni.JniCallType.objectType,
+        [f.reference]).object);
+  }
 
   static final _id_isEnabled = jniAccessors.getMethodIDOf(_classRef,
       r"isEnabled", r"(Lcom/fasterxml/jackson/core/JsonFactory$Feature;)Z");
@@ -527,39 +582,48 @@
   /// Checked whether specified parser feature is enabled.
   ///@param f Feature to check
   ///@return True if the specified feature is enabled
-  bool isEnabled(JsonFactory_Feature f) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_isEnabled,
-      jni.JniCallType.booleanType,
-      [f.reference]).boolean;
+  bool isEnabled(
+    JsonFactory_Feature f,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_isEnabled,
+        jni.JniCallType.booleanType, [f.reference]).boolean;
+  }
 
   static final _id_getParserFeatures =
       jniAccessors.getMethodIDOf(_classRef, r"getParserFeatures", r"()I");
 
   /// from: public final int getParserFeatures()
-  int getParserFeatures() => jniAccessors.callMethodWithArgs(
-      reference, _id_getParserFeatures, jni.JniCallType.intType, []).integer;
+  int getParserFeatures() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_getParserFeatures, jni.JniCallType.intType, []).integer;
+  }
 
   static final _id_getGeneratorFeatures =
       jniAccessors.getMethodIDOf(_classRef, r"getGeneratorFeatures", r"()I");
 
   /// from: public final int getGeneratorFeatures()
-  int getGeneratorFeatures() => jniAccessors.callMethodWithArgs(
-      reference, _id_getGeneratorFeatures, jni.JniCallType.intType, []).integer;
+  int getGeneratorFeatures() {
+    return jniAccessors.callMethodWithArgs(reference, _id_getGeneratorFeatures,
+        jni.JniCallType.intType, []).integer;
+  }
 
   static final _id_getFormatParserFeatures =
       jniAccessors.getMethodIDOf(_classRef, r"getFormatParserFeatures", r"()I");
 
   /// from: public int getFormatParserFeatures()
-  int getFormatParserFeatures() => jniAccessors.callMethodWithArgs(reference,
-      _id_getFormatParserFeatures, jni.JniCallType.intType, []).integer;
+  int getFormatParserFeatures() {
+    return jniAccessors.callMethodWithArgs(reference,
+        _id_getFormatParserFeatures, jni.JniCallType.intType, []).integer;
+  }
 
   static final _id_getFormatGeneratorFeatures = jniAccessors.getMethodIDOf(
       _classRef, r"getFormatGeneratorFeatures", r"()I");
 
   /// from: public int getFormatGeneratorFeatures()
-  int getFormatGeneratorFeatures() => jniAccessors.callMethodWithArgs(reference,
-      _id_getFormatGeneratorFeatures, jni.JniCallType.intType, []).integer;
+  int getFormatGeneratorFeatures() {
+    return jniAccessors.callMethodWithArgs(reference,
+        _id_getFormatGeneratorFeatures, jni.JniCallType.intType, []).integer;
+  }
 
   static final _id_configure1 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -574,12 +638,16 @@
   ///@param f Feature to enable/disable
   ///@param state Whether to enable or disable the feature
   ///@return This factory instance (to allow call chaining)
-  JsonFactory configure1(jsonparser_.JsonParser_Feature f, bool state) =>
-      const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_configure1,
-          jni.JniCallType.objectType,
-          [f.reference, state ? 1 : 0]).object);
+  JsonFactory configure1(
+    jsonparser_.JsonParser_Feature f,
+    bool state,
+  ) {
+    return const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_configure1,
+        jni.JniCallType.objectType,
+        [f.reference, state ? 1 : 0]).object);
+  }
 
   static final _id_enable1 = jniAccessors.getMethodIDOf(_classRef, r"enable",
       r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;)Lcom/fasterxml/jackson/core/JsonFactory;");
@@ -591,12 +659,15 @@
   /// (check JsonParser.Feature for list of features)
   ///@param f Feature to enable
   ///@return This factory instance (to allow call chaining)
-  JsonFactory enable1(jsonparser_.JsonParser_Feature f) =>
-      const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_enable1,
-          jni.JniCallType.objectType,
-          [f.reference]).object);
+  JsonFactory enable1(
+    jsonparser_.JsonParser_Feature f,
+  ) {
+    return const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_enable1,
+        jni.JniCallType.objectType,
+        [f.reference]).object);
+  }
 
   static final _id_disable1 = jniAccessors.getMethodIDOf(_classRef, r"disable",
       r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;)Lcom/fasterxml/jackson/core/JsonFactory;");
@@ -608,12 +679,15 @@
   /// (check JsonParser.Feature for list of features)
   ///@param f Feature to disable
   ///@return This factory instance (to allow call chaining)
-  JsonFactory disable1(jsonparser_.JsonParser_Feature f) =>
-      const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_disable1,
-          jni.JniCallType.objectType,
-          [f.reference]).object);
+  JsonFactory disable1(
+    jsonparser_.JsonParser_Feature f,
+  ) {
+    return const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_disable1,
+        jni.JniCallType.objectType,
+        [f.reference]).object);
+  }
 
   static final _id_isEnabled1 = jniAccessors.getMethodIDOf(_classRef,
       r"isEnabled", r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;)Z");
@@ -623,9 +697,12 @@
   /// Method for checking if the specified parser feature is enabled.
   ///@param f Feature to check
   ///@return True if specified feature is enabled
-  bool isEnabled1(jsonparser_.JsonParser_Feature f) =>
-      jniAccessors.callMethodWithArgs(reference, _id_isEnabled1,
-          jni.JniCallType.booleanType, [f.reference]).boolean;
+  bool isEnabled1(
+    jsonparser_.JsonParser_Feature f,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_isEnabled1,
+        jni.JniCallType.booleanType, [f.reference]).boolean;
+  }
 
   static final _id_isEnabled2 = jniAccessors.getMethodIDOf(_classRef,
       r"isEnabled", r"(Lcom/fasterxml/jackson/core/StreamReadFeature;)Z");
@@ -636,8 +713,12 @@
   ///@param f Feature to check
   ///@return True if specified feature is enabled
   ///@since 2.10
-  bool isEnabled2(jni.JObject f) => jniAccessors.callMethodWithArgs(reference,
-      _id_isEnabled2, jni.JniCallType.booleanType, [f.reference]).boolean;
+  bool isEnabled2(
+    jni.JObject f,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_isEnabled2,
+        jni.JniCallType.booleanType, [f.reference]).boolean;
+  }
 
   static final _id_getInputDecorator = jniAccessors.getMethodIDOf(
       _classRef,
@@ -650,9 +731,12 @@
   /// Method for getting currently configured input decorator (if any;
   /// there is no default decorator).
   ///@return InputDecorator configured, if any
-  jni.JObject getInputDecorator() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_getInputDecorator, jni.JniCallType.objectType, []).object);
+  jni.JObject getInputDecorator() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_getInputDecorator,
+        jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_setInputDecorator = jniAccessors.getMethodIDOf(
       _classRef,
@@ -666,12 +750,15 @@
   ///@param d Decorator to configure for this factory, if any ({@code null} if none)
   ///@return This factory instance (to allow call chaining)
   ///@deprecated Since 2.10 use JsonFactoryBuilder\#inputDecorator(InputDecorator) instead
-  JsonFactory setInputDecorator(jni.JObject d) =>
-      const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_setInputDecorator,
-          jni.JniCallType.objectType,
-          [d.reference]).object);
+  JsonFactory setInputDecorator(
+    jni.JObject d,
+  ) {
+    return const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_setInputDecorator,
+        jni.JniCallType.objectType,
+        [d.reference]).object);
+  }
 
   static final _id_configure2 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -686,12 +773,16 @@
   ///@param f Feature to enable/disable
   ///@param state Whether to enable or disable the feature
   ///@return This factory instance (to allow call chaining)
-  JsonFactory configure2(jni.JObject f, bool state) =>
-      const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_configure2,
-          jni.JniCallType.objectType,
-          [f.reference, state ? 1 : 0]).object);
+  JsonFactory configure2(
+    jni.JObject f,
+    bool state,
+  ) {
+    return const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_configure2,
+        jni.JniCallType.objectType,
+        [f.reference, state ? 1 : 0]).object);
+  }
 
   static final _id_enable2 = jniAccessors.getMethodIDOf(_classRef, r"enable",
       r"(Lcom/fasterxml/jackson/core/JsonGenerator$Feature;)Lcom/fasterxml/jackson/core/JsonFactory;");
@@ -703,12 +794,15 @@
   /// (check JsonGenerator.Feature for list of features)
   ///@param f Feature to enable
   ///@return This factory instance (to allow call chaining)
-  JsonFactory enable2(jni.JObject f) =>
-      const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_enable2,
-          jni.JniCallType.objectType,
-          [f.reference]).object);
+  JsonFactory enable2(
+    jni.JObject f,
+  ) {
+    return const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_enable2,
+        jni.JniCallType.objectType,
+        [f.reference]).object);
+  }
 
   static final _id_disable2 = jniAccessors.getMethodIDOf(_classRef, r"disable",
       r"(Lcom/fasterxml/jackson/core/JsonGenerator$Feature;)Lcom/fasterxml/jackson/core/JsonFactory;");
@@ -720,12 +814,15 @@
   /// (check JsonGenerator.Feature for list of features)
   ///@param f Feature to disable
   ///@return This factory instance (to allow call chaining)
-  JsonFactory disable2(jni.JObject f) =>
-      const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_disable2,
-          jni.JniCallType.objectType,
-          [f.reference]).object);
+  JsonFactory disable2(
+    jni.JObject f,
+  ) {
+    return const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_disable2,
+        jni.JniCallType.objectType,
+        [f.reference]).object);
+  }
 
   static final _id_isEnabled3 = jniAccessors.getMethodIDOf(_classRef,
       r"isEnabled", r"(Lcom/fasterxml/jackson/core/JsonGenerator$Feature;)Z");
@@ -735,8 +832,12 @@
   /// Check whether specified generator feature is enabled.
   ///@param f Feature to check
   ///@return Whether specified feature is enabled
-  bool isEnabled3(jni.JObject f) => jniAccessors.callMethodWithArgs(reference,
-      _id_isEnabled3, jni.JniCallType.booleanType, [f.reference]).boolean;
+  bool isEnabled3(
+    jni.JObject f,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_isEnabled3,
+        jni.JniCallType.booleanType, [f.reference]).boolean;
+  }
 
   static final _id_isEnabled4 = jniAccessors.getMethodIDOf(_classRef,
       r"isEnabled", r"(Lcom/fasterxml/jackson/core/StreamWriteFeature;)Z");
@@ -747,8 +848,12 @@
   ///@param f Feature to check
   ///@return Whether specified feature is enabled
   ///@since 2.10
-  bool isEnabled4(jni.JObject f) => jniAccessors.callMethodWithArgs(reference,
-      _id_isEnabled4, jni.JniCallType.booleanType, [f.reference]).boolean;
+  bool isEnabled4(
+    jni.JObject f,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_isEnabled4,
+        jni.JniCallType.booleanType, [f.reference]).boolean;
+  }
 
   static final _id_getCharacterEscapes = jniAccessors.getMethodIDOf(
       _classRef,
@@ -761,9 +866,12 @@
   /// Method for accessing custom escapes factory uses for JsonGenerators
   /// it creates.
   ///@return Configured {@code CharacterEscapes}, if any; {@code null} if none
-  jni.JObject getCharacterEscapes() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_getCharacterEscapes, jni.JniCallType.objectType, []).object);
+  jni.JObject getCharacterEscapes() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_getCharacterEscapes,
+        jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_setCharacterEscapes = jniAccessors.getMethodIDOf(
       _classRef,
@@ -777,12 +885,15 @@
   /// it creates.
   ///@param esc CharaterEscapes to set (or {@code null} for "none")
   ///@return This factory instance (to allow call chaining)
-  JsonFactory setCharacterEscapes(jni.JObject esc) =>
-      const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_setCharacterEscapes,
-          jni.JniCallType.objectType,
-          [esc.reference]).object);
+  JsonFactory setCharacterEscapes(
+    jni.JObject esc,
+  ) {
+    return const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_setCharacterEscapes,
+        jni.JniCallType.objectType,
+        [esc.reference]).object);
+  }
 
   static final _id_getOutputDecorator = jniAccessors.getMethodIDOf(
       _classRef,
@@ -796,9 +907,12 @@
   /// there is no default decorator).
   ///@return OutputDecorator configured for generators factory creates, if any;
   ///    {@code null} if none.
-  jni.JObject getOutputDecorator() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_getOutputDecorator, jni.JniCallType.objectType, []).object);
+  jni.JObject getOutputDecorator() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_getOutputDecorator,
+        jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_setOutputDecorator = jniAccessors.getMethodIDOf(
       _classRef,
@@ -812,12 +926,15 @@
   ///@return This factory instance (to allow call chaining)
   ///@param d Output decorator to use, if any
   ///@deprecated Since 2.10 use JsonFactoryBuilder\#outputDecorator(OutputDecorator) instead
-  JsonFactory setOutputDecorator(jni.JObject d) =>
-      const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_setOutputDecorator,
-          jni.JniCallType.objectType,
-          [d.reference]).object);
+  JsonFactory setOutputDecorator(
+    jni.JObject d,
+  ) {
+    return const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_setOutputDecorator,
+        jni.JniCallType.objectType,
+        [d.reference]).object);
+  }
 
   static final _id_setRootValueSeparator = jniAccessors.getMethodIDOf(
       _classRef,
@@ -832,12 +949,15 @@
   ///@param sep Separator to use, if any; null means that no separator is
   ///   automatically added
   ///@return This factory instance (to allow call chaining)
-  JsonFactory setRootValueSeparator(jni.JString sep) =>
-      const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_setRootValueSeparator,
-          jni.JniCallType.objectType,
-          [sep.reference]).object);
+  JsonFactory setRootValueSeparator(
+    jni.JString sep,
+  ) {
+    return const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_setRootValueSeparator,
+        jni.JniCallType.objectType,
+        [sep.reference]).object);
+  }
 
   static final _id_getRootValueSeparator = jniAccessors.getMethodIDOf(
       _classRef, r"getRootValueSeparator", r"()Ljava/lang/String;");
@@ -846,9 +966,12 @@
   /// The returned object must be deleted after use, by calling the `delete` method.
   ///
   /// @return Root value separator configured, if any
-  jni.JString getRootValueSeparator() =>
-      const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_getRootValueSeparator, jni.JniCallType.objectType, []).object);
+  jni.JString getRootValueSeparator() {
+    return const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_getRootValueSeparator,
+        jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_setCodec = jniAccessors.getMethodIDOf(_classRef, r"setCodec",
       r"(Lcom/fasterxml/jackson/core/ObjectCodec;)Lcom/fasterxml/jackson/core/JsonFactory;");
@@ -863,21 +986,25 @@
   /// of JsonParser and JsonGenerator instances.
   ///@param oc Codec to use
   ///@return This factory instance (to allow call chaining)
-  JsonFactory setCodec(jni.JObject oc) =>
-      const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_setCodec,
-          jni.JniCallType.objectType,
-          [oc.reference]).object);
+  JsonFactory setCodec(
+    jni.JObject oc,
+  ) {
+    return const $JsonFactoryType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_setCodec,
+        jni.JniCallType.objectType,
+        [oc.reference]).object);
+  }
 
   static final _id_getCodec = jniAccessors.getMethodIDOf(
       _classRef, r"getCodec", r"()Lcom/fasterxml/jackson/core/ObjectCodec;");
 
   /// from: public com.fasterxml.jackson.core.ObjectCodec getCodec()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  jni.JObject getCodec() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_getCodec, jni.JniCallType.objectType, []).object);
+  jni.JObject getCodec() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_getCodec, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_createParser = jniAccessors.getMethodIDOf(
       _classRef,
@@ -903,10 +1030,13 @@
   /// the parser, since caller has no access to it.
   ///@param f File that contains JSON content to parse
   ///@since 2.1
-  jsonparser_.JsonParser createParser(jni.JObject f) =>
-      const jsonparser_.$JsonParserType().fromRef(jniAccessors
-          .callMethodWithArgs(reference, _id_createParser,
-              jni.JniCallType.objectType, [f.reference]).object);
+  jsonparser_.JsonParser createParser(
+    jni.JObject f,
+  ) {
+    return const jsonparser_.$JsonParserType().fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_createParser,
+            jni.JniCallType.objectType, [f.reference]).object);
+  }
 
   static final _id_createParser1 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -930,10 +1060,13 @@
   /// the parser, since caller has no access to it.
   ///@param url URL pointing to resource that contains JSON content to parse
   ///@since 2.1
-  jsonparser_.JsonParser createParser1(jni.JObject url) =>
-      const jsonparser_.$JsonParserType().fromRef(jniAccessors
-          .callMethodWithArgs(reference, _id_createParser1,
-              jni.JniCallType.objectType, [url.reference]).object);
+  jsonparser_.JsonParser createParser1(
+    jni.JObject url,
+  ) {
+    return const jsonparser_.$JsonParserType().fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_createParser1,
+            jni.JniCallType.objectType, [url.reference]).object);
+  }
 
   static final _id_createParser2 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -960,10 +1093,13 @@
   /// For other charsets use \#createParser(java.io.Reader).
   ///@param in InputStream to use for reading JSON content to parse
   ///@since 2.1
-  jsonparser_.JsonParser createParser2(jni.JObject in0) =>
-      const jsonparser_.$JsonParserType().fromRef(jniAccessors
-          .callMethodWithArgs(reference, _id_createParser2,
-              jni.JniCallType.objectType, [in0.reference]).object);
+  jsonparser_.JsonParser createParser2(
+    jni.JObject in0,
+  ) {
+    return const jsonparser_.$JsonParserType().fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_createParser2,
+            jni.JniCallType.objectType, [in0.reference]).object);
+  }
 
   static final _id_createParser3 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -983,10 +1119,13 @@
   /// is enabled.
   ///@param r Reader to use for reading JSON content to parse
   ///@since 2.1
-  jsonparser_.JsonParser createParser3(jni.JObject r) =>
-      const jsonparser_.$JsonParserType().fromRef(jniAccessors
-          .callMethodWithArgs(reference, _id_createParser3,
-              jni.JniCallType.objectType, [r.reference]).object);
+  jsonparser_.JsonParser createParser3(
+    jni.JObject r,
+  ) {
+    return const jsonparser_.$JsonParserType().fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_createParser3,
+            jni.JniCallType.objectType, [r.reference]).object);
+  }
 
   static final _id_createParser4 = jniAccessors.getMethodIDOf(_classRef,
       r"createParser", r"([B)Lcom/fasterxml/jackson/core/JsonParser;");
@@ -997,10 +1136,13 @@
   /// Method for constructing parser for parsing
   /// the contents of given byte array.
   ///@since 2.1
-  jsonparser_.JsonParser createParser4(jni.JArray<jni.JByte> data) =>
-      const jsonparser_.$JsonParserType().fromRef(jniAccessors
-          .callMethodWithArgs(reference, _id_createParser4,
-              jni.JniCallType.objectType, [data.reference]).object);
+  jsonparser_.JsonParser createParser4(
+    jni.JArray<jni.JByte> data,
+  ) {
+    return const jsonparser_.$JsonParserType().fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_createParser4,
+            jni.JniCallType.objectType, [data.reference]).object);
+  }
 
   static final _id_createParser5 = jniAccessors.getMethodIDOf(_classRef,
       r"createParser", r"([BII)Lcom/fasterxml/jackson/core/JsonParser;");
@@ -1015,14 +1157,18 @@
   ///@param len Length of contents to parse within buffer
   ///@since 2.1
   jsonparser_.JsonParser createParser5(
-          jni.JArray<jni.JByte> data, int offset, int len) =>
-      const jsonparser_.$JsonParserType().fromRef(jniAccessors
-          .callMethodWithArgs(
-              reference, _id_createParser5, jni.JniCallType.objectType, [
-        data.reference,
-        jni.JValueInt(offset),
-        jni.JValueInt(len)
-      ]).object);
+    jni.JArray<jni.JByte> data,
+    int offset,
+    int len,
+  ) {
+    return const jsonparser_.$JsonParserType().fromRef(jniAccessors
+        .callMethodWithArgs(
+            reference, _id_createParser5, jni.JniCallType.objectType, [
+      data.reference,
+      jni.JValueInt(offset),
+      jni.JValueInt(len)
+    ]).object);
+  }
 
   static final _id_createParser6 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -1035,10 +1181,13 @@
   /// Method for constructing parser for parsing
   /// contents of given String.
   ///@since 2.1
-  jsonparser_.JsonParser createParser6(jni.JString content) =>
-      const jsonparser_.$JsonParserType().fromRef(jniAccessors
-          .callMethodWithArgs(reference, _id_createParser6,
-              jni.JniCallType.objectType, [content.reference]).object);
+  jsonparser_.JsonParser createParser6(
+    jni.JString content,
+  ) {
+    return const jsonparser_.$JsonParserType().fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_createParser6,
+            jni.JniCallType.objectType, [content.reference]).object);
+  }
 
   static final _id_createParser7 = jniAccessors.getMethodIDOf(_classRef,
       r"createParser", r"([C)Lcom/fasterxml/jackson/core/JsonParser;");
@@ -1049,10 +1198,13 @@
   /// Method for constructing parser for parsing
   /// contents of given char array.
   ///@since 2.4
-  jsonparser_.JsonParser createParser7(jni.JArray<jni.JChar> content) =>
-      const jsonparser_.$JsonParserType().fromRef(jniAccessors
-          .callMethodWithArgs(reference, _id_createParser7,
-              jni.JniCallType.objectType, [content.reference]).object);
+  jsonparser_.JsonParser createParser7(
+    jni.JArray<jni.JChar> content,
+  ) {
+    return const jsonparser_.$JsonParserType().fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_createParser7,
+            jni.JniCallType.objectType, [content.reference]).object);
+  }
 
   static final _id_createParser8 = jniAccessors.getMethodIDOf(_classRef,
       r"createParser", r"([CII)Lcom/fasterxml/jackson/core/JsonParser;");
@@ -1063,14 +1215,18 @@
   /// Method for constructing parser for parsing contents of given char array.
   ///@since 2.4
   jsonparser_.JsonParser createParser8(
-          jni.JArray<jni.JChar> content, int offset, int len) =>
-      const jsonparser_.$JsonParserType().fromRef(jniAccessors
-          .callMethodWithArgs(
-              reference, _id_createParser8, jni.JniCallType.objectType, [
-        content.reference,
-        jni.JValueInt(offset),
-        jni.JValueInt(len)
-      ]).object);
+    jni.JArray<jni.JChar> content,
+    int offset,
+    int len,
+  ) {
+    return const jsonparser_.$JsonParserType().fromRef(jniAccessors
+        .callMethodWithArgs(
+            reference, _id_createParser8, jni.JniCallType.objectType, [
+      content.reference,
+      jni.JValueInt(offset),
+      jni.JValueInt(len)
+    ]).object);
+  }
 
   static final _id_createParser9 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -1086,10 +1242,13 @@
   /// If this factory does not support DataInput as source,
   /// will throw UnsupportedOperationException
   ///@since 2.8
-  jsonparser_.JsonParser createParser9(jni.JObject in0) =>
-      const jsonparser_.$JsonParserType().fromRef(jniAccessors
-          .callMethodWithArgs(reference, _id_createParser9,
-              jni.JniCallType.objectType, [in0.reference]).object);
+  jsonparser_.JsonParser createParser9(
+    jni.JObject in0,
+  ) {
+    return const jsonparser_.$JsonParserType().fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_createParser9,
+            jni.JniCallType.objectType, [in0.reference]).object);
+  }
 
   static final _id_createNonBlockingByteArrayParser =
       jniAccessors.getMethodIDOf(_classRef, r"createNonBlockingByteArrayParser",
@@ -1111,10 +1270,11 @@
   /// (and US-ASCII since it is proper subset); other encodings are not supported
   /// at this point.
   ///@since 2.9
-  jsonparser_.JsonParser createNonBlockingByteArrayParser() =>
-      const jsonparser_.$JsonParserType().fromRef(jniAccessors
-          .callMethodWithArgs(reference, _id_createNonBlockingByteArrayParser,
-              jni.JniCallType.objectType, []).object);
+  jsonparser_.JsonParser createNonBlockingByteArrayParser() {
+    return const jsonparser_.$JsonParserType().fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_createNonBlockingByteArrayParser,
+            jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_createGenerator = jniAccessors.getMethodIDOf(
       _classRef,
@@ -1142,12 +1302,16 @@
   ///@param out OutputStream to use for writing JSON content
   ///@param enc Character encoding to use
   ///@since 2.1
-  jni.JObject createGenerator(jni.JObject out, jni.JObject enc) =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_createGenerator,
-          jni.JniCallType.objectType,
-          [out.reference, enc.reference]).object);
+  jni.JObject createGenerator(
+    jni.JObject out,
+    jni.JObject enc,
+  ) {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_createGenerator,
+        jni.JniCallType.objectType,
+        [out.reference, enc.reference]).object);
+  }
 
   static final _id_createGenerator1 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -1162,12 +1326,15 @@
   ///
   /// Note: there are formats that use fixed encoding (like most binary data formats).
   ///@since 2.1
-  jni.JObject createGenerator1(jni.JObject out) =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_createGenerator1,
-          jni.JniCallType.objectType,
-          [out.reference]).object);
+  jni.JObject createGenerator1(
+    jni.JObject out,
+  ) {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_createGenerator1,
+        jni.JniCallType.objectType,
+        [out.reference]).object);
+  }
 
   static final _id_createGenerator2 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -1188,12 +1355,15 @@
   /// Using application needs to close it explicitly.
   ///@since 2.1
   ///@param w Writer to use for writing JSON content
-  jni.JObject createGenerator2(jni.JObject w) =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_createGenerator2,
-          jni.JniCallType.objectType,
-          [w.reference]).object);
+  jni.JObject createGenerator2(
+    jni.JObject w,
+  ) {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_createGenerator2,
+        jni.JniCallType.objectType,
+        [w.reference]).object);
+  }
 
   static final _id_createGenerator3 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -1215,12 +1385,16 @@
   ///@param f File to write contents to
   ///@param enc Character encoding to use
   ///@since 2.1
-  jni.JObject createGenerator3(jni.JObject f, jni.JObject enc) =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_createGenerator3,
-          jni.JniCallType.objectType,
-          [f.reference, enc.reference]).object);
+  jni.JObject createGenerator3(
+    jni.JObject f,
+    jni.JObject enc,
+  ) {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_createGenerator3,
+        jni.JniCallType.objectType,
+        [f.reference, enc.reference]).object);
+  }
 
   static final _id_createGenerator4 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -1233,12 +1407,16 @@
   /// Method for constructing generator for writing content using specified
   /// DataOutput instance.
   ///@since 2.8
-  jni.JObject createGenerator4(jni.JObject out, jni.JObject enc) =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_createGenerator4,
-          jni.JniCallType.objectType,
-          [out.reference, enc.reference]).object);
+  jni.JObject createGenerator4(
+    jni.JObject out,
+    jni.JObject enc,
+  ) {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_createGenerator4,
+        jni.JniCallType.objectType,
+        [out.reference, enc.reference]).object);
+  }
 
   static final _id_createGenerator5 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -1253,12 +1431,15 @@
   ///
   /// Note: there are formats that use fixed encoding (like most binary data formats).
   ///@since 2.8
-  jni.JObject createGenerator5(jni.JObject out) =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_createGenerator5,
-          jni.JniCallType.objectType,
-          [out.reference]).object);
+  jni.JObject createGenerator5(
+    jni.JObject out,
+  ) {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_createGenerator5,
+        jni.JniCallType.objectType,
+        [out.reference]).object);
+  }
 
   static final _id_createJsonParser = jniAccessors.getMethodIDOf(
       _classRef,
@@ -1286,10 +1467,13 @@
   ///@throws IOException if parser initialization fails due to I/O (read) problem
   ///@throws JsonParseException if parser initialization fails due to content decoding problem
   ///@deprecated Since 2.2, use \#createParser(File) instead.
-  jsonparser_.JsonParser createJsonParser(jni.JObject f) =>
-      const jsonparser_.$JsonParserType().fromRef(jniAccessors
-          .callMethodWithArgs(reference, _id_createJsonParser,
-              jni.JniCallType.objectType, [f.reference]).object);
+  jsonparser_.JsonParser createJsonParser(
+    jni.JObject f,
+  ) {
+    return const jsonparser_.$JsonParserType().fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_createJsonParser,
+            jni.JniCallType.objectType, [f.reference]).object);
+  }
 
   static final _id_createJsonParser1 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -1316,10 +1500,13 @@
   ///@throws IOException if parser initialization fails due to I/O (read) problem
   ///@throws JsonParseException if parser initialization fails due to content decoding problem
   ///@deprecated Since 2.2, use \#createParser(URL) instead.
-  jsonparser_.JsonParser createJsonParser1(jni.JObject url) =>
-      const jsonparser_.$JsonParserType().fromRef(jniAccessors
-          .callMethodWithArgs(reference, _id_createJsonParser1,
-              jni.JniCallType.objectType, [url.reference]).object);
+  jsonparser_.JsonParser createJsonParser1(
+    jni.JObject url,
+  ) {
+    return const jsonparser_.$JsonParserType().fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_createJsonParser1,
+            jni.JniCallType.objectType, [url.reference]).object);
+  }
 
   static final _id_createJsonParser2 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -1349,10 +1536,13 @@
   ///@throws IOException if parser initialization fails due to I/O (read) problem
   ///@throws JsonParseException if parser initialization fails due to content decoding problem
   ///@deprecated Since 2.2, use \#createParser(InputStream) instead.
-  jsonparser_.JsonParser createJsonParser2(jni.JObject in0) =>
-      const jsonparser_.$JsonParserType().fromRef(jniAccessors
-          .callMethodWithArgs(reference, _id_createJsonParser2,
-              jni.JniCallType.objectType, [in0.reference]).object);
+  jsonparser_.JsonParser createJsonParser2(
+    jni.JObject in0,
+  ) {
+    return const jsonparser_.$JsonParserType().fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_createJsonParser2,
+            jni.JniCallType.objectType, [in0.reference]).object);
+  }
 
   static final _id_createJsonParser3 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -1375,10 +1565,13 @@
   ///@throws IOException if parser initialization fails due to I/O (read) problem
   ///@throws JsonParseException if parser initialization fails due to content decoding problem
   ///@deprecated Since 2.2, use \#createParser(Reader) instead.
-  jsonparser_.JsonParser createJsonParser3(jni.JObject r) =>
-      const jsonparser_.$JsonParserType().fromRef(jniAccessors
-          .callMethodWithArgs(reference, _id_createJsonParser3,
-              jni.JniCallType.objectType, [r.reference]).object);
+  jsonparser_.JsonParser createJsonParser3(
+    jni.JObject r,
+  ) {
+    return const jsonparser_.$JsonParserType().fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_createJsonParser3,
+            jni.JniCallType.objectType, [r.reference]).object);
+  }
 
   static final _id_createJsonParser4 = jniAccessors.getMethodIDOf(_classRef,
       r"createJsonParser", r"([B)Lcom/fasterxml/jackson/core/JsonParser;");
@@ -1392,10 +1585,13 @@
   ///@throws IOException if parser initialization fails due to I/O (read) problem
   ///@throws JsonParseException if parser initialization fails due to content decoding problem
   ///@deprecated Since 2.2, use \#createParser(byte[]) instead.
-  jsonparser_.JsonParser createJsonParser4(jni.JArray<jni.JByte> data) =>
-      const jsonparser_.$JsonParserType().fromRef(jniAccessors
-          .callMethodWithArgs(reference, _id_createJsonParser4,
-              jni.JniCallType.objectType, [data.reference]).object);
+  jsonparser_.JsonParser createJsonParser4(
+    jni.JArray<jni.JByte> data,
+  ) {
+    return const jsonparser_.$JsonParserType().fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_createJsonParser4,
+            jni.JniCallType.objectType, [data.reference]).object);
+  }
 
   static final _id_createJsonParser5 = jniAccessors.getMethodIDOf(_classRef,
       r"createJsonParser", r"([BII)Lcom/fasterxml/jackson/core/JsonParser;");
@@ -1413,14 +1609,18 @@
   ///@throws JsonParseException if parser initialization fails due to content decoding problem
   ///@deprecated Since 2.2, use \#createParser(byte[],int,int) instead.
   jsonparser_.JsonParser createJsonParser5(
-          jni.JArray<jni.JByte> data, int offset, int len) =>
-      const jsonparser_.$JsonParserType().fromRef(jniAccessors
-          .callMethodWithArgs(
-              reference, _id_createJsonParser5, jni.JniCallType.objectType, [
-        data.reference,
-        jni.JValueInt(offset),
-        jni.JValueInt(len)
-      ]).object);
+    jni.JArray<jni.JByte> data,
+    int offset,
+    int len,
+  ) {
+    return const jsonparser_.$JsonParserType().fromRef(jniAccessors
+        .callMethodWithArgs(
+            reference, _id_createJsonParser5, jni.JniCallType.objectType, [
+      data.reference,
+      jni.JValueInt(offset),
+      jni.JValueInt(len)
+    ]).object);
+  }
 
   static final _id_createJsonParser6 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -1437,10 +1637,13 @@
   ///@throws IOException if parser initialization fails due to I/O (read) problem
   ///@throws JsonParseException if parser initialization fails due to content decoding problem
   ///@deprecated Since 2.2, use \#createParser(String) instead.
-  jsonparser_.JsonParser createJsonParser6(jni.JString content) =>
-      const jsonparser_.$JsonParserType().fromRef(jniAccessors
-          .callMethodWithArgs(reference, _id_createJsonParser6,
-              jni.JniCallType.objectType, [content.reference]).object);
+  jsonparser_.JsonParser createJsonParser6(
+    jni.JString content,
+  ) {
+    return const jsonparser_.$JsonParserType().fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_createJsonParser6,
+            jni.JniCallType.objectType, [content.reference]).object);
+  }
 
   static final _id_createJsonGenerator = jniAccessors.getMethodIDOf(
       _classRef,
@@ -1470,12 +1673,16 @@
   ///@return Generator constructed
   ///@throws IOException if parser initialization fails due to I/O (write) problem
   ///@deprecated Since 2.2, use \#createGenerator(OutputStream, JsonEncoding) instead.
-  jni.JObject createJsonGenerator(jni.JObject out, jni.JObject enc) =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_createJsonGenerator,
-          jni.JniCallType.objectType,
-          [out.reference, enc.reference]).object);
+  jni.JObject createJsonGenerator(
+    jni.JObject out,
+    jni.JObject enc,
+  ) {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_createJsonGenerator,
+        jni.JniCallType.objectType,
+        [out.reference, enc.reference]).object);
+  }
 
   static final _id_createJsonGenerator1 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -1498,12 +1705,15 @@
   ///@return Generator constructed
   ///@throws IOException if parser initialization fails due to I/O (write) problem
   ///@deprecated Since 2.2, use \#createGenerator(Writer) instead.
-  jni.JObject createJsonGenerator1(jni.JObject out) =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_createJsonGenerator1,
-          jni.JniCallType.objectType,
-          [out.reference]).object);
+  jni.JObject createJsonGenerator1(
+    jni.JObject out,
+  ) {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_createJsonGenerator1,
+        jni.JniCallType.objectType,
+        [out.reference]).object);
+  }
 
   static final _id_createJsonGenerator2 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -1521,12 +1731,15 @@
   ///@return Generator constructed
   ///@throws IOException if parser initialization fails due to I/O (write) problem
   ///@deprecated Since 2.2, use \#createGenerator(OutputStream) instead.
-  jni.JObject createJsonGenerator2(jni.JObject out) =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_createJsonGenerator2,
-          jni.JniCallType.objectType,
-          [out.reference]).object);
+  jni.JObject createJsonGenerator2(
+    jni.JObject out,
+  ) {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_createJsonGenerator2,
+        jni.JniCallType.objectType,
+        [out.reference]).object);
+  }
 }
 
 class $JsonFactoryType extends jni.JObjType<JsonFactory> {
@@ -1537,6 +1750,20 @@
 
   @override
   JsonFactory fromRef(jni.JObjectPtr ref) => JsonFactory.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($JsonFactoryType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $JsonFactoryType && other is $JsonFactoryType;
+  }
 }
 
 /// from: com.fasterxml.jackson.core.JsonFactory$Feature
@@ -1544,9 +1771,8 @@
 /// Enumeration that defines all on/off features that can only be
 /// changed for JsonFactory.
 class JsonFactory_Feature extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   JsonFactory_Feature.fromRef(
     jni.JObjectPtr ref,
@@ -1562,10 +1788,11 @@
 
   /// from: static public com.fasterxml.jackson.core.JsonFactory.Feature[] values()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  static jni.JArray<JsonFactory_Feature> values() =>
-      const jni.JArrayType($JsonFactory_FeatureType()).fromRef(jniAccessors
-          .callStaticMethodWithArgs(
-              _classRef, _id_values, jni.JniCallType.objectType, []).object);
+  static jni.JArray<JsonFactory_Feature> values() {
+    return const jni.JArrayType($JsonFactory_FeatureType()).fromRef(jniAccessors
+        .callStaticMethodWithArgs(
+            _classRef, _id_values, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_valueOf = jniAccessors.getStaticMethodIDOf(
       _classRef,
@@ -1574,10 +1801,13 @@
 
   /// from: static public com.fasterxml.jackson.core.JsonFactory.Feature valueOf(java.lang.String name)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  static JsonFactory_Feature valueOf(jni.JString name) =>
-      const $JsonFactory_FeatureType().fromRef(jniAccessors
-          .callStaticMethodWithArgs(_classRef, _id_valueOf,
-              jni.JniCallType.objectType, [name.reference]).object);
+  static JsonFactory_Feature valueOf(
+    jni.JString name,
+  ) {
+    return const $JsonFactory_FeatureType().fromRef(jniAccessors
+        .callStaticMethodWithArgs(_classRef, _id_valueOf,
+            jni.JniCallType.objectType, [name.reference]).object);
+  }
 
   static final _id_collectDefaults =
       jniAccessors.getStaticMethodIDOf(_classRef, r"collectDefaults", r"()I");
@@ -1587,32 +1817,39 @@
   /// Method that calculates bit set (flags) of all features that
   /// are enabled by default.
   ///@return Bit field of features enabled by default
-  static int collectDefaults() => jniAccessors.callStaticMethodWithArgs(
-      _classRef, _id_collectDefaults, jni.JniCallType.intType, []).integer;
+  static int collectDefaults() {
+    return jniAccessors.callStaticMethodWithArgs(
+        _classRef, _id_collectDefaults, jni.JniCallType.intType, []).integer;
+  }
 
   static final _id_enabledByDefault =
       jniAccessors.getMethodIDOf(_classRef, r"enabledByDefault", r"()Z");
 
   /// from: public boolean enabledByDefault()
-  bool enabledByDefault() => jniAccessors.callMethodWithArgs(
-      reference, _id_enabledByDefault, jni.JniCallType.booleanType, []).boolean;
+  bool enabledByDefault() {
+    return jniAccessors.callMethodWithArgs(reference, _id_enabledByDefault,
+        jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_enabledIn =
       jniAccessors.getMethodIDOf(_classRef, r"enabledIn", r"(I)Z");
 
   /// from: public boolean enabledIn(int flags)
-  bool enabledIn(int flags) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_enabledIn,
-      jni.JniCallType.booleanType,
-      [jni.JValueInt(flags)]).boolean;
+  bool enabledIn(
+    int flags,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_enabledIn,
+        jni.JniCallType.booleanType, [jni.JValueInt(flags)]).boolean;
+  }
 
   static final _id_getMask =
       jniAccessors.getMethodIDOf(_classRef, r"getMask", r"()I");
 
   /// from: public int getMask()
-  int getMask() => jniAccessors.callMethodWithArgs(
-      reference, _id_getMask, jni.JniCallType.intType, []).integer;
+  int getMask() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_getMask, jni.JniCallType.intType, []).integer;
+  }
 }
 
 class $JsonFactory_FeatureType extends jni.JObjType<JsonFactory_Feature> {
@@ -1624,4 +1861,19 @@
   @override
   JsonFactory_Feature fromRef(jni.JObjectPtr ref) =>
       JsonFactory_Feature.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($JsonFactory_FeatureType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $JsonFactory_FeatureType &&
+        other is $JsonFactory_FeatureType;
+  }
 }
diff --git a/pkgs/jnigen/test/jackson_core_test/third_party/lib/com/fasterxml/jackson/core/JsonParser.dart b/pkgs/jnigen/test/jackson_core_test/third_party/lib/com/fasterxml/jackson/core/JsonParser.dart
index 1f71c76..e8caa42 100644
--- a/pkgs/jnigen/test/jackson_core_test/third_party/lib/com/fasterxml/jackson/core/JsonParser.dart
+++ b/pkgs/jnigen/test/jackson_core_test/third_party/lib/com/fasterxml/jackson/core/JsonParser.dart
@@ -46,9 +46,8 @@
 /// a JsonFactory instance.
 ///@author Tatu Saloranta
 class JsonParser extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   JsonParser.fromRef(
     jni.JObjectPtr ref,
@@ -83,18 +82,22 @@
 
   /// from: protected void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  JsonParser()
-      : super.fromRef(
-            jniAccessors.newObjectWithArgs(_classRef, _id_ctor, []).object);
+  factory JsonParser() {
+    return JsonParser.fromRef(
+        jniAccessors.newObjectWithArgs(_classRef, _id_ctor, []).object);
+  }
 
   static final _id_ctor1 =
       jniAccessors.getMethodIDOf(_classRef, r"<init>", r"(I)V");
 
   /// from: protected void <init>(int features)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  JsonParser.ctor1(int features)
-      : super.fromRef(jniAccessors.newObjectWithArgs(
-            _classRef, _id_ctor1, [jni.JValueInt(features)]).object);
+  factory JsonParser.ctor1(
+    int features,
+  ) {
+    return JsonParser.fromRef(jniAccessors.newObjectWithArgs(
+        _classRef, _id_ctor1, [jni.JValueInt(features)]).object);
+  }
 
   static final _id_getCodec = jniAccessors.getMethodIDOf(
       _classRef, r"getCodec", r"()Lcom/fasterxml/jackson/core/ObjectCodec;");
@@ -106,9 +109,10 @@
   /// parser, if any. Codec is used by \#readValueAs(Class)
   /// method (and its variants).
   ///@return Codec assigned to this parser, if any; {@code null} if none
-  jni.JObject getCodec() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_getCodec, jni.JniCallType.objectType, []).object);
+  jni.JObject getCodec() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_getCodec, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_setCodec = jniAccessors.getMethodIDOf(
       _classRef, r"setCodec", r"(Lcom/fasterxml/jackson/core/ObjectCodec;)V");
@@ -119,8 +123,12 @@
   /// parser, if any. Codec is used by \#readValueAs(Class)
   /// method (and its variants).
   ///@param oc Codec to assign, if any; {@code null} if none
-  void setCodec(jni.JObject oc) => jniAccessors.callMethodWithArgs(reference,
-      _id_setCodec, jni.JniCallType.voidType, [oc.reference]).check();
+  void setCodec(
+    jni.JObject oc,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_setCodec,
+        jni.JniCallType.voidType, [oc.reference]).check();
+  }
 
   static final _id_getInputSource = jniAccessors.getMethodIDOf(
       _classRef, r"getInputSource", r"()Ljava/lang/Object;");
@@ -142,9 +150,10 @@
   /// In general use of this accessor should be considered as
   /// "last effort", i.e. only used if no other mechanism is applicable.
   ///@return Input source this parser was configured with
-  jni.JObject getInputSource() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_getInputSource, jni.JniCallType.objectType, []).object);
+  jni.JObject getInputSource() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_getInputSource, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_setRequestPayloadOnError = jniAccessors.getMethodIDOf(
       _classRef,
@@ -156,9 +165,15 @@
   /// Sets the payload to be passed if JsonParseException is thrown.
   ///@param payload Payload to pass
   ///@since 2.8
-  void setRequestPayloadOnError(jni.JObject payload) =>
-      jniAccessors.callMethodWithArgs(reference, _id_setRequestPayloadOnError,
-          jni.JniCallType.voidType, [payload.reference]).check();
+  void setRequestPayloadOnError(
+    jni.JObject payload,
+  ) {
+    return jniAccessors.callMethodWithArgs(
+        reference,
+        _id_setRequestPayloadOnError,
+        jni.JniCallType.voidType,
+        [payload.reference]).check();
+  }
 
   static final _id_setRequestPayloadOnError1 = jniAccessors.getMethodIDOf(
       _classRef, r"setRequestPayloadOnError", r"([BLjava/lang/String;)V");
@@ -170,12 +185,15 @@
   ///@param charset Character encoding for (lazily) decoding payload
   ///@since 2.8
   void setRequestPayloadOnError1(
-          jni.JArray<jni.JByte> payload, jni.JString charset) =>
-      jniAccessors.callMethodWithArgs(
-          reference,
-          _id_setRequestPayloadOnError1,
-          jni.JniCallType.voidType,
-          [payload.reference, charset.reference]).check();
+    jni.JArray<jni.JByte> payload,
+    jni.JString charset,
+  ) {
+    return jniAccessors.callMethodWithArgs(
+        reference,
+        _id_setRequestPayloadOnError1,
+        jni.JniCallType.voidType,
+        [payload.reference, charset.reference]).check();
+  }
 
   static final _id_setRequestPayloadOnError2 = jniAccessors.getMethodIDOf(
       _classRef, r"setRequestPayloadOnError", r"(Ljava/lang/String;)V");
@@ -185,9 +203,15 @@
   /// Sets the String request payload
   ///@param payload Payload to pass
   ///@since 2.8
-  void setRequestPayloadOnError2(jni.JString payload) =>
-      jniAccessors.callMethodWithArgs(reference, _id_setRequestPayloadOnError2,
-          jni.JniCallType.voidType, [payload.reference]).check();
+  void setRequestPayloadOnError2(
+    jni.JString payload,
+  ) {
+    return jniAccessors.callMethodWithArgs(
+        reference,
+        _id_setRequestPayloadOnError2,
+        jni.JniCallType.voidType,
+        [payload.reference]).check();
+  }
 
   static final _id_setSchema = jniAccessors.getMethodIDOf(
       _classRef, r"setSchema", r"(Lcom/fasterxml/jackson/core/FormatSchema;)V");
@@ -204,11 +228,12 @@
   /// is thrown.
   ///@param schema Schema to use
   ///@throws UnsupportedOperationException if parser does not support schema
-  void setSchema(jni.JObject schema) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_setSchema,
-      jni.JniCallType.voidType,
-      [schema.reference]).check();
+  void setSchema(
+    jni.JObject schema,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_setSchema,
+        jni.JniCallType.voidType, [schema.reference]).check();
+  }
 
   static final _id_getSchema = jniAccessors.getMethodIDOf(
       _classRef, r"getSchema", r"()Lcom/fasterxml/jackson/core/FormatSchema;");
@@ -220,9 +245,10 @@
   /// Default implementation returns null.
   ///@return Schema in use by this parser, if any; {@code null} if none
   ///@since 2.1
-  jni.JObject getSchema() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_getSchema, jni.JniCallType.objectType, []).object);
+  jni.JObject getSchema() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_getSchema, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_canUseSchema = jniAccessors.getMethodIDOf(_classRef,
       r"canUseSchema", r"(Lcom/fasterxml/jackson/core/FormatSchema;)Z");
@@ -233,11 +259,12 @@
   /// this parser (using \#setSchema).
   ///@param schema Schema to check
   ///@return True if this parser can use given schema; false if not
-  bool canUseSchema(jni.JObject schema) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_canUseSchema,
-      jni.JniCallType.booleanType,
-      [schema.reference]).boolean;
+  bool canUseSchema(
+    jni.JObject schema,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_canUseSchema,
+        jni.JniCallType.booleanType, [schema.reference]).boolean;
+  }
 
   static final _id_requiresCustomCodec =
       jniAccessors.getMethodIDOf(_classRef, r"requiresCustomCodec", r"()Z");
@@ -252,8 +279,10 @@
   ///@return True if format-specific codec is needed with this parser; false if a general
   ///   ObjectCodec is enough
   ///@since 2.1
-  bool requiresCustomCodec() => jniAccessors.callMethodWithArgs(reference,
-      _id_requiresCustomCodec, jni.JniCallType.booleanType, []).boolean;
+  bool requiresCustomCodec() {
+    return jniAccessors.callMethodWithArgs(reference, _id_requiresCustomCodec,
+        jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_canParseAsync =
       jniAccessors.getMethodIDOf(_classRef, r"canParseAsync", r"()Z");
@@ -271,8 +300,10 @@
   /// input is read by blocking
   ///@return True if this is a non-blocking ("asynchronous") parser
   ///@since 2.9
-  bool canParseAsync() => jniAccessors.callMethodWithArgs(
-      reference, _id_canParseAsync, jni.JniCallType.booleanType, []).boolean;
+  bool canParseAsync() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_canParseAsync, jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_getNonBlockingInputFeeder = jniAccessors.getMethodIDOf(
       _classRef,
@@ -287,11 +318,12 @@
   /// parsers that use blocking I/O.
   ///@return Input feeder to use with non-blocking (async) parsing
   ///@since 2.9
-  jni.JObject getNonBlockingInputFeeder() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_getNonBlockingInputFeeder,
-          jni.JniCallType.objectType, []).object);
+  jni.JObject getNonBlockingInputFeeder() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_getNonBlockingInputFeeder,
+        jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_getReadCapabilities = jniAccessors.getMethodIDOf(
       _classRef,
@@ -305,9 +337,12 @@
   /// underlying data format being read (directly or indirectly).
   ///@return Set of read capabilities for content to read via this parser
   ///@since 2.12
-  jni.JObject getReadCapabilities() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_getReadCapabilities, jni.JniCallType.objectType, []).object);
+  jni.JObject getReadCapabilities() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_getReadCapabilities,
+        jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_version = jniAccessors.getMethodIDOf(
       _classRef, r"version", r"()Lcom/fasterxml/jackson/core/Version;");
@@ -319,9 +354,10 @@
   /// Left for sub-classes to implement.
   ///@return Version of this generator (derived from version declared for
   ///   {@code jackson-core} jar that contains the class
-  jni.JObject version() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_version, jni.JniCallType.objectType, []).object);
+  jni.JObject version() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_version, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_close =
       jniAccessors.getMethodIDOf(_classRef, r"close", r"()V");
@@ -342,8 +378,10 @@
   /// java.io.File or java.net.URL and creates
   /// stream or reader it does own them.
   ///@throws IOException if there is either an underlying I/O problem
-  void close() => jniAccessors.callMethodWithArgs(
-      reference, _id_close, jni.JniCallType.voidType, []).check();
+  void close() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_close, jni.JniCallType.voidType, []).check();
+  }
 
   static final _id_isClosed =
       jniAccessors.getMethodIDOf(_classRef, r"isClosed", r"()Z");
@@ -357,8 +395,10 @@
   /// call to \#close or because parser has encountered
   /// end of input.
   ///@return {@code True} if this parser instance has been closed
-  bool isClosed() => jniAccessors.callMethodWithArgs(
-      reference, _id_isClosed, jni.JniCallType.booleanType, []).boolean;
+  bool isClosed() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_isClosed, jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_getParsingContext = jniAccessors.getMethodIDOf(
       _classRef,
@@ -377,9 +417,12 @@
   /// Contexts can also be used for simple xpath-like matching of
   /// input, if so desired.
   ///@return Stream input context (JsonStreamContext) associated with this parser
-  jni.JObject getParsingContext() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_getParsingContext, jni.JniCallType.objectType, []).object);
+  jni.JObject getParsingContext() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_getParsingContext,
+        jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_currentLocation = jniAccessors.getMethodIDOf(_classRef,
       r"currentLocation", r"()Lcom/fasterxml/jackson/core/JsonLocation;");
@@ -399,9 +442,10 @@
   /// to other library)
   ///@return Location of the last processed input unit (byte or character)
   ///@since 2.13
-  jni.JObject currentLocation() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_currentLocation, jni.JniCallType.objectType, []).object);
+  jni.JObject currentLocation() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_currentLocation, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_currentTokenLocation = jniAccessors.getMethodIDOf(_classRef,
       r"currentTokenLocation", r"()Lcom/fasterxml/jackson/core/JsonLocation;");
@@ -421,9 +465,12 @@
   /// to other library)
   ///@return Starting location of the token parser currently points to
   ///@since 2.13 (will eventually replace \#getTokenLocation)
-  jni.JObject currentTokenLocation() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_currentTokenLocation, jni.JniCallType.objectType, []).object);
+  jni.JObject currentTokenLocation() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_currentTokenLocation,
+        jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_getCurrentLocation = jniAccessors.getMethodIDOf(_classRef,
       r"getCurrentLocation", r"()Lcom/fasterxml/jackson/core/JsonLocation;");
@@ -434,9 +481,12 @@
   /// Alias for \#currentLocation(), to be deprecated in later
   /// Jackson 2.x versions (and removed from Jackson 3.0).
   ///@return Location of the last processed input unit (byte or character)
-  jni.JObject getCurrentLocation() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_getCurrentLocation, jni.JniCallType.objectType, []).object);
+  jni.JObject getCurrentLocation() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_getCurrentLocation,
+        jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_getTokenLocation = jniAccessors.getMethodIDOf(_classRef,
       r"getTokenLocation", r"()Lcom/fasterxml/jackson/core/JsonLocation;");
@@ -447,9 +497,12 @@
   /// Alias for \#currentTokenLocation(), to be deprecated in later
   /// Jackson 2.x versions (and removed from Jackson 3.0).
   ///@return Starting location of the token parser currently points to
-  jni.JObject getTokenLocation() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_getTokenLocation, jni.JniCallType.objectType, []).object);
+  jni.JObject getTokenLocation() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_getTokenLocation,
+        jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_currentValue = jniAccessors.getMethodIDOf(
       _classRef, r"currentValue", r"()Ljava/lang/Object;");
@@ -468,9 +521,10 @@
   /// and gets passed through data-binding.
   ///@return "Current value" associated with the current input context (state) of this parser
   ///@since 2.13 (added as replacement for older \#getCurrentValue()
-  jni.JObject currentValue() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_currentValue, jni.JniCallType.objectType, []).object);
+  jni.JObject currentValue() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_currentValue, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_assignCurrentValue = jniAccessors.getMethodIDOf(
       _classRef, r"assignCurrentValue", r"(Ljava/lang/Object;)V");
@@ -483,11 +537,12 @@
   ///</code>
   ///@param v Current value to assign for the current input context of this parser
   ///@since 2.13 (added as replacement for older \#setCurrentValue
-  void assignCurrentValue(jni.JObject v) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_assignCurrentValue,
-      jni.JniCallType.voidType,
-      [v.reference]).check();
+  void assignCurrentValue(
+    jni.JObject v,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_assignCurrentValue,
+        jni.JniCallType.voidType, [v.reference]).check();
+  }
 
   static final _id_getCurrentValue = jniAccessors.getMethodIDOf(
       _classRef, r"getCurrentValue", r"()Ljava/lang/Object;");
@@ -498,9 +553,10 @@
   /// Alias for \#currentValue(), to be deprecated in later
   /// Jackson 2.x versions (and removed from Jackson 3.0).
   ///@return Location of the last processed input unit (byte or character)
-  jni.JObject getCurrentValue() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_getCurrentValue, jni.JniCallType.objectType, []).object);
+  jni.JObject getCurrentValue() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_getCurrentValue, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_setCurrentValue = jniAccessors.getMethodIDOf(
       _classRef, r"setCurrentValue", r"(Ljava/lang/Object;)V");
@@ -510,11 +566,12 @@
   /// Alias for \#assignCurrentValue, to be deprecated in later
   /// Jackson 2.x versions (and removed from Jackson 3.0).
   ///@param v Current value to assign for the current input context of this parser
-  void setCurrentValue(jni.JObject v) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_setCurrentValue,
-      jni.JniCallType.voidType,
-      [v.reference]).check();
+  void setCurrentValue(
+    jni.JObject v,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_setCurrentValue,
+        jni.JniCallType.voidType, [v.reference]).check();
+  }
 
   static final _id_releaseBuffered = jniAccessors.getMethodIDOf(
       _classRef, r"releaseBuffered", r"(Ljava/io/OutputStream;)I");
@@ -532,11 +589,12 @@
   ///    (that is, input can not be sent to OutputStream;
   ///    otherwise number of bytes released (0 if there was nothing to release)
   ///@throws IOException if write to stream threw exception
-  int releaseBuffered(jni.JObject out) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_releaseBuffered,
-      jni.JniCallType.intType,
-      [out.reference]).integer;
+  int releaseBuffered(
+    jni.JObject out,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_releaseBuffered,
+        jni.JniCallType.intType, [out.reference]).integer;
+  }
 
   static final _id_releaseBuffered1 = jniAccessors.getMethodIDOf(
       _classRef, r"releaseBuffered", r"(Ljava/io/Writer;)I");
@@ -555,11 +613,12 @@
   ///    (that is, input can not be sent to Writer;
   ///    otherwise number of chars released (0 if there was nothing to release)
   ///@throws IOException if write using Writer threw exception
-  int releaseBuffered1(jni.JObject w) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_releaseBuffered1,
-      jni.JniCallType.intType,
-      [w.reference]).integer;
+  int releaseBuffered1(
+    jni.JObject w,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_releaseBuffered1,
+        jni.JniCallType.intType, [w.reference]).integer;
+  }
 
   static final _id_enable = jniAccessors.getMethodIDOf(_classRef, r"enable",
       r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;)Lcom/fasterxml/jackson/core/JsonParser;");
@@ -571,9 +630,15 @@
   /// (check Feature for list of features)
   ///@param f Feature to enable
   ///@return This parser, to allow call chaining
-  JsonParser enable(JsonParser_Feature f) =>
-      const $JsonParserType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_enable, jni.JniCallType.objectType, [f.reference]).object);
+  JsonParser enable(
+    JsonParser_Feature f,
+  ) {
+    return const $JsonParserType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_enable,
+        jni.JniCallType.objectType,
+        [f.reference]).object);
+  }
 
   static final _id_disable = jniAccessors.getMethodIDOf(_classRef, r"disable",
       r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;)Lcom/fasterxml/jackson/core/JsonParser;");
@@ -585,9 +650,15 @@
   /// (check Feature for list of features)
   ///@param f Feature to disable
   ///@return This parser, to allow call chaining
-  JsonParser disable(JsonParser_Feature f) =>
-      const $JsonParserType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_disable, jni.JniCallType.objectType, [f.reference]).object);
+  JsonParser disable(
+    JsonParser_Feature f,
+  ) {
+    return const $JsonParserType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_disable,
+        jni.JniCallType.objectType,
+        [f.reference]).object);
+  }
 
   static final _id_configure = jniAccessors.getMethodIDOf(
       _classRef,
@@ -602,12 +673,16 @@
   ///@param f Feature to enable or disable
   ///@param state Whether to enable feature ({@code true}) or disable ({@code false})
   ///@return This parser, to allow call chaining
-  JsonParser configure(JsonParser_Feature f, bool state) =>
-      const $JsonParserType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_configure,
-          jni.JniCallType.objectType,
-          [f.reference, state ? 1 : 0]).object);
+  JsonParser configure(
+    JsonParser_Feature f,
+    bool state,
+  ) {
+    return const $JsonParserType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_configure,
+        jni.JniCallType.objectType,
+        [f.reference, state ? 1 : 0]).object);
+  }
 
   static final _id_isEnabled = jniAccessors.getMethodIDOf(_classRef,
       r"isEnabled", r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;)Z");
@@ -617,11 +692,12 @@
   /// Method for checking whether specified Feature is enabled.
   ///@param f Feature to check
   ///@return {@code True} if feature is enabled; {@code false} otherwise
-  bool isEnabled(JsonParser_Feature f) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_isEnabled,
-      jni.JniCallType.booleanType,
-      [f.reference]).boolean;
+  bool isEnabled(
+    JsonParser_Feature f,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_isEnabled,
+        jni.JniCallType.booleanType, [f.reference]).boolean;
+  }
 
   static final _id_isEnabled1 = jniAccessors.getMethodIDOf(_classRef,
       r"isEnabled", r"(Lcom/fasterxml/jackson/core/StreamReadFeature;)Z");
@@ -632,8 +708,12 @@
   ///@param f Feature to check
   ///@return {@code True} if feature is enabled; {@code false} otherwise
   ///@since 2.10
-  bool isEnabled1(jni.JObject f) => jniAccessors.callMethodWithArgs(reference,
-      _id_isEnabled1, jni.JniCallType.booleanType, [f.reference]).boolean;
+  bool isEnabled1(
+    jni.JObject f,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_isEnabled1,
+        jni.JniCallType.booleanType, [f.reference]).boolean;
+  }
 
   static final _id_getFeatureMask =
       jniAccessors.getMethodIDOf(_classRef, r"getFeatureMask", r"()I");
@@ -643,8 +723,10 @@
   /// Bulk access method for getting state of all standard Features.
   ///@return Bit mask that defines current states of all standard Features.
   ///@since 2.3
-  int getFeatureMask() => jniAccessors.callMethodWithArgs(
-      reference, _id_getFeatureMask, jni.JniCallType.intType, []).integer;
+  int getFeatureMask() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_getFeatureMask, jni.JniCallType.intType, []).integer;
+  }
 
   static final _id_setFeatureMask = jniAccessors.getMethodIDOf(_classRef,
       r"setFeatureMask", r"(I)Lcom/fasterxml/jackson/core/JsonParser;");
@@ -657,12 +739,15 @@
   ///@return This parser, to allow call chaining
   ///@since 2.3
   ///@deprecated Since 2.7, use \#overrideStdFeatures(int, int) instead
-  JsonParser setFeatureMask(int mask) =>
-      const $JsonParserType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_setFeatureMask,
-          jni.JniCallType.objectType,
-          [jni.JValueInt(mask)]).object);
+  JsonParser setFeatureMask(
+    int mask,
+  ) {
+    return const $JsonParserType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_setFeatureMask,
+        jni.JniCallType.objectType,
+        [jni.JValueInt(mask)]).object);
+  }
 
   static final _id_overrideStdFeatures = jniAccessors.getMethodIDOf(_classRef,
       r"overrideStdFeatures", r"(II)Lcom/fasterxml/jackson/core/JsonParser;");
@@ -682,12 +767,16 @@
   ///@param mask Bit mask of features to change
   ///@return This parser, to allow call chaining
   ///@since 2.6
-  JsonParser overrideStdFeatures(int values, int mask) =>
-      const $JsonParserType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_overrideStdFeatures,
-          jni.JniCallType.objectType,
-          [jni.JValueInt(values), jni.JValueInt(mask)]).object);
+  JsonParser overrideStdFeatures(
+    int values,
+    int mask,
+  ) {
+    return const $JsonParserType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_overrideStdFeatures,
+        jni.JniCallType.objectType,
+        [jni.JValueInt(values), jni.JValueInt(mask)]).object);
+  }
 
   static final _id_getFormatFeatures =
       jniAccessors.getMethodIDOf(_classRef, r"getFormatFeatures", r"()I");
@@ -698,8 +787,10 @@
   /// on/off configuration settings.
   ///@return Bit mask that defines current states of all standard FormatFeatures.
   ///@since 2.6
-  int getFormatFeatures() => jniAccessors.callMethodWithArgs(
-      reference, _id_getFormatFeatures, jni.JniCallType.intType, []).integer;
+  int getFormatFeatures() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_getFormatFeatures, jni.JniCallType.intType, []).integer;
+  }
 
   static final _id_overrideFormatFeatures = jniAccessors.getMethodIDOf(
       _classRef,
@@ -719,12 +810,16 @@
   ///@param mask Bit mask of features to change
   ///@return This parser, to allow call chaining
   ///@since 2.6
-  JsonParser overrideFormatFeatures(int values, int mask) =>
-      const $JsonParserType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_overrideFormatFeatures,
-          jni.JniCallType.objectType,
-          [jni.JValueInt(values), jni.JValueInt(mask)]).object);
+  JsonParser overrideFormatFeatures(
+    int values,
+    int mask,
+  ) {
+    return const $JsonParserType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_overrideFormatFeatures,
+        jni.JniCallType.objectType,
+        [jni.JValueInt(values), jni.JValueInt(mask)]).object);
+  }
 
   static final _id_nextToken = jniAccessors.getMethodIDOf(
       _classRef, r"nextToken", r"()Lcom/fasterxml/jackson/core/JsonToken;");
@@ -740,9 +835,11 @@
   ///   to indicate end-of-input
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  jsontoken_.JsonToken nextToken() =>
-      const jsontoken_.$JsonTokenType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_nextToken, jni.JniCallType.objectType, []).object);
+  jsontoken_.JsonToken nextToken() {
+    return const jsontoken_.$JsonTokenType().fromRef(jniAccessors
+        .callMethodWithArgs(
+            reference, _id_nextToken, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_nextValue = jniAccessors.getMethodIDOf(
       _classRef, r"nextValue", r"()Lcom/fasterxml/jackson/core/JsonToken;");
@@ -766,9 +863,11 @@
   ///   available yet)
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  jsontoken_.JsonToken nextValue() =>
-      const jsontoken_.$JsonTokenType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_nextValue, jni.JniCallType.objectType, []).object);
+  jsontoken_.JsonToken nextValue() {
+    return const jsontoken_.$JsonTokenType().fromRef(jniAccessors
+        .callMethodWithArgs(
+            reference, _id_nextValue, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_nextFieldName = jniAccessors.getMethodIDOf(_classRef,
       r"nextFieldName", r"(Lcom/fasterxml/jackson/core/SerializableString;)Z");
@@ -790,11 +889,12 @@
   ///    specified name; {@code false} otherwise (different token or non-matching name)
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  bool nextFieldName(jni.JObject str) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_nextFieldName,
-      jni.JniCallType.booleanType,
-      [str.reference]).boolean;
+  bool nextFieldName(
+    jni.JObject str,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_nextFieldName,
+        jni.JniCallType.booleanType, [str.reference]).boolean;
+  }
 
   static final _id_nextFieldName1 = jniAccessors.getMethodIDOf(
       _classRef, r"nextFieldName", r"()Ljava/lang/String;");
@@ -810,9 +910,10 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   ///@since 2.5
-  jni.JString nextFieldName1() =>
-      const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_nextFieldName1, jni.JniCallType.objectType, []).object);
+  jni.JString nextFieldName1() {
+    return const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_nextFieldName1, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_nextTextValue = jniAccessors.getMethodIDOf(
       _classRef, r"nextTextValue", r"()Ljava/lang/String;");
@@ -833,9 +934,10 @@
   ///   to; or {@code null} if next token is of some other type
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  jni.JString nextTextValue() =>
-      const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_nextTextValue, jni.JniCallType.objectType, []).object);
+  jni.JString nextTextValue() {
+    return const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_nextTextValue, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_nextIntValue =
       jniAccessors.getMethodIDOf(_classRef, r"nextIntValue", r"(I)I");
@@ -859,11 +961,12 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   ///@throws InputCoercionException if integer number does not fit in Java {@code int}
-  int nextIntValue(int defaultValue) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_nextIntValue,
-      jni.JniCallType.intType,
-      [jni.JValueInt(defaultValue)]).integer;
+  int nextIntValue(
+    int defaultValue,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_nextIntValue,
+        jni.JniCallType.intType, [jni.JValueInt(defaultValue)]).integer;
+  }
 
   static final _id_nextLongValue =
       jniAccessors.getMethodIDOf(_classRef, r"nextLongValue", r"(J)J");
@@ -887,11 +990,12 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   ///@throws InputCoercionException if integer number does not fit in Java {@code long}
-  int nextLongValue(int defaultValue) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_nextLongValue,
-      jni.JniCallType.longType,
-      [defaultValue]).long;
+  int nextLongValue(
+    int defaultValue,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_nextLongValue,
+        jni.JniCallType.longType, [defaultValue]).long;
+  }
 
   static final _id_nextBooleanValue = jniAccessors.getMethodIDOf(
       _classRef, r"nextBooleanValue", r"()Ljava/lang/Boolean;");
@@ -915,9 +1019,12 @@
   ///   token parser advanced to; or {@code null} if next token is of some other type
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  jni.JObject nextBooleanValue() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_nextBooleanValue, jni.JniCallType.objectType, []).object);
+  jni.JObject nextBooleanValue() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_nextBooleanValue,
+        jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_skipChildren = jniAccessors.getMethodIDOf(
       _classRef, r"skipChildren", r"()Lcom/fasterxml/jackson/core/JsonParser;");
@@ -940,9 +1047,10 @@
   ///@return This parser, to allow call chaining
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  JsonParser skipChildren() =>
-      const $JsonParserType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_skipChildren, jni.JniCallType.objectType, []).object);
+  JsonParser skipChildren() {
+    return const $JsonParserType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_skipChildren, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_finishToken =
       jniAccessors.getMethodIDOf(_classRef, r"finishToken", r"()V");
@@ -962,8 +1070,10 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   ///@since 2.8
-  void finishToken() => jniAccessors.callMethodWithArgs(
-      reference, _id_finishToken, jni.JniCallType.voidType, []).check();
+  void finishToken() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_finishToken, jni.JniCallType.voidType, []).check();
+  }
 
   static final _id_currentToken = jniAccessors.getMethodIDOf(
       _classRef, r"currentToken", r"()Lcom/fasterxml/jackson/core/JsonToken;");
@@ -980,9 +1090,11 @@
   ///   after end-of-input has been encountered, as well as
   ///   if the current token has been explicitly cleared.
   ///@since 2.8
-  jsontoken_.JsonToken currentToken() =>
-      const jsontoken_.$JsonTokenType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_currentToken, jni.JniCallType.objectType, []).object);
+  jsontoken_.JsonToken currentToken() {
+    return const jsontoken_.$JsonTokenType().fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_currentToken,
+            jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_currentTokenId =
       jniAccessors.getMethodIDOf(_classRef, r"currentTokenId", r"()I");
@@ -998,8 +1110,10 @@
   /// to profile performance before deciding to use this method.
   ///@since 2.8
   ///@return {@code int} matching one of constants from JsonTokenId.
-  int currentTokenId() => jniAccessors.callMethodWithArgs(
-      reference, _id_currentTokenId, jni.JniCallType.intType, []).integer;
+  int currentTokenId() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_currentTokenId, jni.JniCallType.intType, []).integer;
+  }
 
   static final _id_getCurrentToken = jniAccessors.getMethodIDOf(_classRef,
       r"getCurrentToken", r"()Lcom/fasterxml/jackson/core/JsonToken;");
@@ -1011,11 +1125,11 @@
   /// Jackson 2.13 (will be removed from 3.0).
   ///@return Type of the token this parser currently points to,
   ///   if any: null before any tokens have been read, and
-  jsontoken_.JsonToken getCurrentToken() =>
-      const jsontoken_.$JsonTokenType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_getCurrentToken,
-          jni.JniCallType.objectType, []).object);
+  jsontoken_.JsonToken getCurrentToken() {
+    return const jsontoken_.$JsonTokenType().fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_getCurrentToken,
+            jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_getCurrentTokenId =
       jniAccessors.getMethodIDOf(_classRef, r"getCurrentTokenId", r"()I");
@@ -1025,8 +1139,10 @@
   /// Deprecated alias for \#currentTokenId().
   ///@return {@code int} matching one of constants from JsonTokenId.
   ///@deprecated Since 2.12 use \#currentTokenId instead
-  int getCurrentTokenId() => jniAccessors.callMethodWithArgs(
-      reference, _id_getCurrentTokenId, jni.JniCallType.intType, []).integer;
+  int getCurrentTokenId() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_getCurrentTokenId, jni.JniCallType.intType, []).integer;
+  }
 
   static final _id_hasCurrentToken =
       jniAccessors.getMethodIDOf(_classRef, r"hasCurrentToken", r"()Z");
@@ -1041,8 +1157,10 @@
   ///   was just constructed, encountered end-of-input
   ///   and returned null from \#nextToken, or the token
   ///   has been consumed)
-  bool hasCurrentToken() => jniAccessors.callMethodWithArgs(
-      reference, _id_hasCurrentToken, jni.JniCallType.booleanType, []).boolean;
+  bool hasCurrentToken() {
+    return jniAccessors.callMethodWithArgs(reference, _id_hasCurrentToken,
+        jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_hasTokenId =
       jniAccessors.getMethodIDOf(_classRef, r"hasTokenId", r"(I)Z");
@@ -1061,8 +1179,12 @@
   ///@param id Token id to match (from (@link JsonTokenId})
   ///@return {@code True} if the parser current points to specified token
   ///@since 2.5
-  bool hasTokenId(int id) => jniAccessors.callMethodWithArgs(reference,
-      _id_hasTokenId, jni.JniCallType.booleanType, [jni.JValueInt(id)]).boolean;
+  bool hasTokenId(
+    int id,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_hasTokenId,
+        jni.JniCallType.booleanType, [jni.JValueInt(id)]).boolean;
+  }
 
   static final _id_hasToken = jniAccessors.getMethodIDOf(
       _classRef, r"hasToken", r"(Lcom/fasterxml/jackson/core/JsonToken;)Z");
@@ -1081,11 +1203,12 @@
   ///@param t Token to match
   ///@return {@code True} if the parser current points to specified token
   ///@since 2.6
-  bool hasToken(jsontoken_.JsonToken t) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_hasToken,
-      jni.JniCallType.booleanType,
-      [t.reference]).boolean;
+  bool hasToken(
+    jsontoken_.JsonToken t,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_hasToken,
+        jni.JniCallType.booleanType, [t.reference]).boolean;
+  }
 
   static final _id_isExpectedStartArrayToken = jniAccessors.getMethodIDOf(
       _classRef, r"isExpectedStartArrayToken", r"()Z");
@@ -1108,8 +1231,10 @@
   ///@return True if the current token can be considered as a
   ///   start-array marker (such JsonToken\#START_ARRAY);
   ///   {@code false} if not
-  bool isExpectedStartArrayToken() => jniAccessors.callMethodWithArgs(reference,
-      _id_isExpectedStartArrayToken, jni.JniCallType.booleanType, []).boolean;
+  bool isExpectedStartArrayToken() {
+    return jniAccessors.callMethodWithArgs(reference,
+        _id_isExpectedStartArrayToken, jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_isExpectedStartObjectToken = jniAccessors.getMethodIDOf(
       _classRef, r"isExpectedStartObjectToken", r"()Z");
@@ -1122,10 +1247,12 @@
   ///   start-array marker (such JsonToken\#START_OBJECT);
   ///   {@code false} if not
   ///@since 2.5
-  bool isExpectedStartObjectToken() => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_isExpectedStartObjectToken,
-      jni.JniCallType.booleanType, []).boolean;
+  bool isExpectedStartObjectToken() {
+    return jniAccessors.callMethodWithArgs(
+        reference,
+        _id_isExpectedStartObjectToken,
+        jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_isExpectedNumberIntToken = jniAccessors.getMethodIDOf(
       _classRef, r"isExpectedNumberIntToken", r"()Z");
@@ -1141,8 +1268,10 @@
   ///   start-array marker (such JsonToken\#VALUE_NUMBER_INT);
   ///   {@code false} if not
   ///@since 2.12
-  bool isExpectedNumberIntToken() => jniAccessors.callMethodWithArgs(reference,
-      _id_isExpectedNumberIntToken, jni.JniCallType.booleanType, []).boolean;
+  bool isExpectedNumberIntToken() {
+    return jniAccessors.callMethodWithArgs(reference,
+        _id_isExpectedNumberIntToken, jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_isNaN =
       jniAccessors.getMethodIDOf(_classRef, r"isNaN", r"()Z");
@@ -1161,8 +1290,10 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   ///@since 2.9
-  bool isNaN() => jniAccessors.callMethodWithArgs(
-      reference, _id_isNaN, jni.JniCallType.booleanType, []).boolean;
+  bool isNaN() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_isNaN, jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_clearCurrentToken =
       jniAccessors.getMethodIDOf(_classRef, r"clearCurrentToken", r"()V");
@@ -1179,8 +1310,10 @@
   /// Method was added to be used by the optional data binder, since
   /// it has to be able to consume last token used for binding (so that
   /// it will not be used again).
-  void clearCurrentToken() => jniAccessors.callMethodWithArgs(
-      reference, _id_clearCurrentToken, jni.JniCallType.voidType, []).check();
+  void clearCurrentToken() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_clearCurrentToken, jni.JniCallType.voidType, []).check();
+  }
 
   static final _id_getLastClearedToken = jniAccessors.getMethodIDOf(_classRef,
       r"getLastClearedToken", r"()Lcom/fasterxml/jackson/core/JsonToken;");
@@ -1194,11 +1327,11 @@
   /// Will return null if no tokens have been cleared,
   /// or if parser has been closed.
   ///@return Last cleared token, if any; {@code null} otherwise
-  jsontoken_.JsonToken getLastClearedToken() =>
-      const jsontoken_.$JsonTokenType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_getLastClearedToken,
-          jni.JniCallType.objectType, []).object);
+  jsontoken_.JsonToken getLastClearedToken() {
+    return const jsontoken_.$JsonTokenType().fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_getLastClearedToken,
+            jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_overrideCurrentName = jniAccessors.getMethodIDOf(
       _classRef, r"overrideCurrentName", r"(Ljava/lang/String;)V");
@@ -1213,11 +1346,12 @@
   /// Note that use of this method should only be done as sort of last
   /// resort, as it is a work-around for regular operation.
   ///@param name Name to use as the current name; may be null.
-  void overrideCurrentName(jni.JString name) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_overrideCurrentName,
-      jni.JniCallType.voidType,
-      [name.reference]).check();
+  void overrideCurrentName(
+    jni.JString name,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_overrideCurrentName,
+        jni.JniCallType.voidType, [name.reference]).check();
+  }
 
   static final _id_getCurrentName = jniAccessors.getMethodIDOf(
       _classRef, r"getCurrentName", r"()Ljava/lang/String;");
@@ -1229,9 +1363,10 @@
   ///@return Name of the current field in the parsing context
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  jni.JString getCurrentName() =>
-      const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_getCurrentName, jni.JniCallType.objectType, []).object);
+  jni.JString getCurrentName() {
+    return const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_getCurrentName, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_currentName = jniAccessors.getMethodIDOf(
       _classRef, r"currentName", r"()Ljava/lang/String;");
@@ -1248,9 +1383,10 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   ///@since 2.10
-  jni.JString currentName() =>
-      const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_currentName, jni.JniCallType.objectType, []).object);
+  jni.JString currentName() {
+    return const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_currentName, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_getText = jniAccessors.getMethodIDOf(
       _classRef, r"getText", r"()Ljava/lang/String;");
@@ -1266,9 +1402,10 @@
   ///   by \#nextToken() or other iteration methods)
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  jni.JString getText() =>
-      const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_getText, jni.JniCallType.objectType, []).object);
+  jni.JString getText() {
+    return const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_getText, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_getText1 =
       jniAccessors.getMethodIDOf(_classRef, r"getText", r"(Ljava/io/Writer;)I");
@@ -1290,8 +1427,12 @@
   ///   {@code writer}, or
   ///   JsonParseException for decoding problems
   ///@since 2.8
-  int getText1(jni.JObject writer) => jniAccessors.callMethodWithArgs(reference,
-      _id_getText1, jni.JniCallType.intType, [writer.reference]).integer;
+  int getText1(
+    jni.JObject writer,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_getText1,
+        jni.JniCallType.intType, [writer.reference]).integer;
+  }
 
   static final _id_getTextCharacters =
       jniAccessors.getMethodIDOf(_classRef, r"getTextCharacters", r"()[C");
@@ -1326,10 +1467,11 @@
   ///    at offset 0, and not necessarily until the end of buffer)
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  jni.JArray<jni.JChar> getTextCharacters() =>
-      const jni.JArrayType(jni.JCharType()).fromRef(jniAccessors
-          .callMethodWithArgs(reference, _id_getTextCharacters,
-              jni.JniCallType.objectType, []).object);
+  jni.JArray<jni.JChar> getTextCharacters() {
+    return const jni.JArrayType(jni.JCharType()).fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_getTextCharacters,
+            jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_getTextLength =
       jniAccessors.getMethodIDOf(_classRef, r"getTextLength", r"()I");
@@ -1343,8 +1485,10 @@
   ///   textual content of the current token.
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  int getTextLength() => jniAccessors.callMethodWithArgs(
-      reference, _id_getTextLength, jni.JniCallType.intType, []).integer;
+  int getTextLength() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_getTextLength, jni.JniCallType.intType, []).integer;
+  }
 
   static final _id_getTextOffset =
       jniAccessors.getMethodIDOf(_classRef, r"getTextOffset", r"()I");
@@ -1358,8 +1502,10 @@
   ///   textual content of the current token.
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  int getTextOffset() => jniAccessors.callMethodWithArgs(
-      reference, _id_getTextOffset, jni.JniCallType.intType, []).integer;
+  int getTextOffset() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_getTextOffset, jni.JniCallType.intType, []).integer;
+  }
 
   static final _id_hasTextCharacters =
       jniAccessors.getMethodIDOf(_classRef, r"hasTextCharacters", r"()Z");
@@ -1380,8 +1526,10 @@
   ///@return True if parser currently has character array that can
   ///   be efficiently returned via \#getTextCharacters; false
   ///   means that it may or may not exist
-  bool hasTextCharacters() => jniAccessors.callMethodWithArgs(reference,
-      _id_hasTextCharacters, jni.JniCallType.booleanType, []).boolean;
+  bool hasTextCharacters() {
+    return jniAccessors.callMethodWithArgs(reference, _id_hasTextCharacters,
+        jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_getNumberValue = jniAccessors.getMethodIDOf(
       _classRef, r"getNumberValue", r"()Ljava/lang/Number;");
@@ -1399,9 +1547,10 @@
   ///    the current token is not numeric, or if decoding of the value fails
   ///    (invalid format for numbers); plain IOException if underlying
   ///    content read fails (possible if values are extracted lazily)
-  jni.JObject getNumberValue() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_getNumberValue, jni.JniCallType.objectType, []).object);
+  jni.JObject getNumberValue() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_getNumberValue, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_getNumberValueExact = jniAccessors.getMethodIDOf(
       _classRef, r"getNumberValueExact", r"()Ljava/lang/Number;");
@@ -1423,9 +1572,12 @@
   ///    (invalid format for numbers); plain IOException if underlying
   ///    content read fails (possible if values are extracted lazily)
   ///@since 2.12
-  jni.JObject getNumberValueExact() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_getNumberValueExact, jni.JniCallType.objectType, []).object);
+  jni.JObject getNumberValueExact() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_getNumberValueExact,
+        jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_getNumberType = jniAccessors.getMethodIDOf(
       _classRef,
@@ -1442,9 +1594,11 @@
   ///@return Type of current number, if parser points to numeric token; {@code null} otherwise
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  JsonParser_NumberType getNumberType() => const $JsonParser_NumberTypeType()
-      .fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_getNumberType, jni.JniCallType.objectType, []).object);
+  JsonParser_NumberType getNumberType() {
+    return const $JsonParser_NumberTypeType().fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_getNumberType,
+            jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_getByteValue =
       jniAccessors.getMethodIDOf(_classRef, r"getByteValue", r"()B");
@@ -1472,8 +1626,10 @@
   ///   range of {@code [-128, 255]}); otherwise exception thrown
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  int getByteValue() => jniAccessors.callMethodWithArgs(
-      reference, _id_getByteValue, jni.JniCallType.byteType, []).byte;
+  int getByteValue() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_getByteValue, jni.JniCallType.byteType, []).byte;
+  }
 
   static final _id_getShortValue =
       jniAccessors.getMethodIDOf(_classRef, r"getShortValue", r"()S");
@@ -1495,8 +1651,10 @@
   ///   Java 16-bit signed {@code short} range); otherwise exception thrown
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  int getShortValue() => jniAccessors.callMethodWithArgs(
-      reference, _id_getShortValue, jni.JniCallType.shortType, []).short;
+  int getShortValue() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_getShortValue, jni.JniCallType.shortType, []).short;
+  }
 
   static final _id_getIntValue =
       jniAccessors.getMethodIDOf(_classRef, r"getIntValue", r"()I");
@@ -1518,8 +1676,10 @@
   ///   Java 32-bit signed {@code int} range); otherwise exception thrown
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  int getIntValue() => jniAccessors.callMethodWithArgs(
-      reference, _id_getIntValue, jni.JniCallType.intType, []).integer;
+  int getIntValue() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_getIntValue, jni.JniCallType.intType, []).integer;
+  }
 
   static final _id_getLongValue =
       jniAccessors.getMethodIDOf(_classRef, r"getLongValue", r"()J");
@@ -1541,8 +1701,10 @@
   ///   Java 32-bit signed {@code long} range); otherwise exception thrown
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  int getLongValue() => jniAccessors.callMethodWithArgs(
-      reference, _id_getLongValue, jni.JniCallType.longType, []).long;
+  int getLongValue() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_getLongValue, jni.JniCallType.longType, []).long;
+  }
 
   static final _id_getBigIntegerValue = jniAccessors.getMethodIDOf(
       _classRef, r"getBigIntegerValue", r"()Ljava/math/BigInteger;");
@@ -1561,9 +1723,12 @@
   ///     otherwise exception thrown
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  jni.JObject getBigIntegerValue() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_getBigIntegerValue, jni.JniCallType.objectType, []).object);
+  jni.JObject getBigIntegerValue() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_getBigIntegerValue,
+        jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_getFloatValue =
       jniAccessors.getMethodIDOf(_classRef, r"getFloatValue", r"()F");
@@ -1585,8 +1750,10 @@
   ///   Java {@code float} range); otherwise exception thrown
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  double getFloatValue() => jniAccessors.callMethodWithArgs(
-      reference, _id_getFloatValue, jni.JniCallType.floatType, []).float;
+  double getFloatValue() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_getFloatValue, jni.JniCallType.floatType, []).float;
+  }
 
   static final _id_getDoubleValue =
       jniAccessors.getMethodIDOf(_classRef, r"getDoubleValue", r"()D");
@@ -1608,8 +1775,10 @@
   ///   Java {@code double} range); otherwise exception thrown
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  double getDoubleValue() => jniAccessors.callMethodWithArgs(reference,
-      _id_getDoubleValue, jni.JniCallType.doubleType, []).doubleFloat;
+  double getDoubleValue() {
+    return jniAccessors.callMethodWithArgs(reference, _id_getDoubleValue,
+        jni.JniCallType.doubleType, []).doubleFloat;
+  }
 
   static final _id_getDecimalValue = jniAccessors.getMethodIDOf(
       _classRef, r"getDecimalValue", r"()Ljava/math/BigDecimal;");
@@ -1625,9 +1794,10 @@
   ///   otherwise exception thrown
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  jni.JObject getDecimalValue() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_getDecimalValue, jni.JniCallType.objectType, []).object);
+  jni.JObject getDecimalValue() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_getDecimalValue, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_getBooleanValue =
       jniAccessors.getMethodIDOf(_classRef, r"getBooleanValue", r"()Z");
@@ -1645,8 +1815,10 @@
   ///   otherwise throws JsonParseException
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  bool getBooleanValue() => jniAccessors.callMethodWithArgs(
-      reference, _id_getBooleanValue, jni.JniCallType.booleanType, []).boolean;
+  bool getBooleanValue() {
+    return jniAccessors.callMethodWithArgs(reference, _id_getBooleanValue,
+        jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_getEmbeddedObject = jniAccessors.getMethodIDOf(
       _classRef, r"getEmbeddedObject", r"()Ljava/lang/Object;");
@@ -1668,9 +1840,12 @@
   ///   for the current token, if any; {@code null otherwise}
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  jni.JObject getEmbeddedObject() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_getEmbeddedObject, jni.JniCallType.objectType, []).object);
+  jni.JObject getEmbeddedObject() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_getEmbeddedObject,
+        jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_getBinaryValue = jniAccessors.getMethodIDOf(_classRef,
       r"getBinaryValue", r"(Lcom/fasterxml/jackson/core/Base64Variant;)[B");
@@ -1698,10 +1873,13 @@
   ///@return Decoded binary data
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  jni.JArray<jni.JByte> getBinaryValue(jni.JObject bv) =>
-      const jni.JArrayType(jni.JByteType()).fromRef(jniAccessors
-          .callMethodWithArgs(reference, _id_getBinaryValue,
-              jni.JniCallType.objectType, [bv.reference]).object);
+  jni.JArray<jni.JByte> getBinaryValue(
+    jni.JObject bv,
+  ) {
+    return const jni.JArrayType(jni.JByteType()).fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_getBinaryValue,
+            jni.JniCallType.objectType, [bv.reference]).object);
+  }
 
   static final _id_getBinaryValue1 =
       jniAccessors.getMethodIDOf(_classRef, r"getBinaryValue", r"()[B");
@@ -1715,10 +1893,11 @@
   ///@return Decoded binary data
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  jni.JArray<jni.JByte> getBinaryValue1() =>
-      const jni.JArrayType(jni.JByteType()).fromRef(jniAccessors
-          .callMethodWithArgs(reference, _id_getBinaryValue1,
-              jni.JniCallType.objectType, []).object);
+  jni.JArray<jni.JByte> getBinaryValue1() {
+    return const jni.JArrayType(jni.JByteType()).fromRef(jniAccessors
+        .callMethodWithArgs(reference, _id_getBinaryValue1,
+            jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_readBinaryValue = jniAccessors.getMethodIDOf(
       _classRef, r"readBinaryValue", r"(Ljava/io/OutputStream;)I");
@@ -1736,11 +1915,12 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   ///@since 2.1
-  int readBinaryValue(jni.JObject out) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_readBinaryValue,
-      jni.JniCallType.intType,
-      [out.reference]).integer;
+  int readBinaryValue(
+    jni.JObject out,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_readBinaryValue,
+        jni.JniCallType.intType, [out.reference]).integer;
+  }
 
   static final _id_readBinaryValue1 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -1757,9 +1937,13 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   ///@since 2.1
-  int readBinaryValue1(jni.JObject bv, jni.JObject out) =>
-      jniAccessors.callMethodWithArgs(reference, _id_readBinaryValue1,
-          jni.JniCallType.intType, [bv.reference, out.reference]).integer;
+  int readBinaryValue1(
+    jni.JObject bv,
+    jni.JObject out,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_readBinaryValue1,
+        jni.JniCallType.intType, [bv.reference, out.reference]).integer;
+  }
 
   static final _id_getValueAsInt =
       jniAccessors.getMethodIDOf(_classRef, r"getValueAsInt", r"()I");
@@ -1779,8 +1963,10 @@
   ///    otherwise
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  int getValueAsInt() => jniAccessors.callMethodWithArgs(
-      reference, _id_getValueAsInt, jni.JniCallType.intType, []).integer;
+  int getValueAsInt() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_getValueAsInt, jni.JniCallType.intType, []).integer;
+  }
 
   static final _id_getValueAsInt1 =
       jniAccessors.getMethodIDOf(_classRef, r"getValueAsInt", r"(I)I");
@@ -1800,11 +1986,12 @@
   ///@return {@code int} value current token is converted to, if possible; {@code def} otherwise
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  int getValueAsInt1(int def) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_getValueAsInt1,
-      jni.JniCallType.intType,
-      [jni.JValueInt(def)]).integer;
+  int getValueAsInt1(
+    int def,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_getValueAsInt1,
+        jni.JniCallType.intType, [jni.JValueInt(def)]).integer;
+  }
 
   static final _id_getValueAsLong =
       jniAccessors.getMethodIDOf(_classRef, r"getValueAsLong", r"()J");
@@ -1824,8 +2011,10 @@
   ///    otherwise
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  int getValueAsLong() => jniAccessors.callMethodWithArgs(
-      reference, _id_getValueAsLong, jni.JniCallType.longType, []).long;
+  int getValueAsLong() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_getValueAsLong, jni.JniCallType.longType, []).long;
+  }
 
   static final _id_getValueAsLong1 =
       jniAccessors.getMethodIDOf(_classRef, r"getValueAsLong", r"(J)J");
@@ -1845,8 +2034,12 @@
   ///@return {@code long} value current token is converted to, if possible; {@code def} otherwise
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  int getValueAsLong1(int def) => jniAccessors.callMethodWithArgs(
-      reference, _id_getValueAsLong1, jni.JniCallType.longType, [def]).long;
+  int getValueAsLong1(
+    int def,
+  ) {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_getValueAsLong1, jni.JniCallType.longType, [def]).long;
+  }
 
   static final _id_getValueAsDouble =
       jniAccessors.getMethodIDOf(_classRef, r"getValueAsDouble", r"()D");
@@ -1866,8 +2059,10 @@
   ///    otherwise
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  double getValueAsDouble() => jniAccessors.callMethodWithArgs(reference,
-      _id_getValueAsDouble, jni.JniCallType.doubleType, []).doubleFloat;
+  double getValueAsDouble() {
+    return jniAccessors.callMethodWithArgs(reference, _id_getValueAsDouble,
+        jni.JniCallType.doubleType, []).doubleFloat;
+  }
 
   static final _id_getValueAsDouble1 =
       jniAccessors.getMethodIDOf(_classRef, r"getValueAsDouble", r"(D)D");
@@ -1887,11 +2082,12 @@
   ///@return {@code double} value current token is converted to, if possible; {@code def} otherwise
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  double getValueAsDouble1(double def) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_getValueAsDouble1,
-      jni.JniCallType.doubleType,
-      [def]).doubleFloat;
+  double getValueAsDouble1(
+    double def,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_getValueAsDouble1,
+        jni.JniCallType.doubleType, [def]).doubleFloat;
+  }
 
   static final _id_getValueAsBoolean =
       jniAccessors.getMethodIDOf(_classRef, r"getValueAsBoolean", r"()Z");
@@ -1911,8 +2107,10 @@
   ///    otherwise
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  bool getValueAsBoolean() => jniAccessors.callMethodWithArgs(reference,
-      _id_getValueAsBoolean, jni.JniCallType.booleanType, []).boolean;
+  bool getValueAsBoolean() {
+    return jniAccessors.callMethodWithArgs(reference, _id_getValueAsBoolean,
+        jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_getValueAsBoolean1 =
       jniAccessors.getMethodIDOf(_classRef, r"getValueAsBoolean", r"(Z)Z");
@@ -1932,11 +2130,12 @@
   ///@return {@code boolean} value current token is converted to, if possible; {@code def} otherwise
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
-  bool getValueAsBoolean1(bool def) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_getValueAsBoolean1,
-      jni.JniCallType.booleanType,
-      [def ? 1 : 0]).boolean;
+  bool getValueAsBoolean1(
+    bool def,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_getValueAsBoolean1,
+        jni.JniCallType.booleanType, [def ? 1 : 0]).boolean;
+  }
 
   static final _id_getValueAsString = jniAccessors.getMethodIDOf(
       _classRef, r"getValueAsString", r"()Ljava/lang/String;");
@@ -1955,9 +2154,12 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   ///@since 2.1
-  jni.JString getValueAsString() =>
-      const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(reference,
-          _id_getValueAsString, jni.JniCallType.objectType, []).object);
+  jni.JString getValueAsString() {
+    return const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_getValueAsString,
+        jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_getValueAsString1 = jniAccessors.getMethodIDOf(_classRef,
       r"getValueAsString", r"(Ljava/lang/String;)Ljava/lang/String;");
@@ -1977,12 +2179,15 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   ///@since 2.1
-  jni.JString getValueAsString1(jni.JString def) =>
-      const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_getValueAsString1,
-          jni.JniCallType.objectType,
-          [def.reference]).object);
+  jni.JString getValueAsString1(
+    jni.JString def,
+  ) {
+    return const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_getValueAsString1,
+        jni.JniCallType.objectType,
+        [def.reference]).object);
+  }
 
   static final _id_canReadObjectId =
       jniAccessors.getMethodIDOf(_classRef, r"canReadObjectId", r"()Z");
@@ -2000,8 +2205,10 @@
   ///@return {@code True} if the format being read supports native Object Ids;
   ///    {@code false} if not
   ///@since 2.3
-  bool canReadObjectId() => jniAccessors.callMethodWithArgs(
-      reference, _id_canReadObjectId, jni.JniCallType.booleanType, []).boolean;
+  bool canReadObjectId() {
+    return jniAccessors.callMethodWithArgs(reference, _id_canReadObjectId,
+        jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_canReadTypeId =
       jniAccessors.getMethodIDOf(_classRef, r"canReadTypeId", r"()Z");
@@ -2019,8 +2226,10 @@
   ///@return {@code True} if the format being read supports native Type Ids;
   ///    {@code false} if not
   ///@since 2.3
-  bool canReadTypeId() => jniAccessors.callMethodWithArgs(
-      reference, _id_canReadTypeId, jni.JniCallType.booleanType, []).boolean;
+  bool canReadTypeId() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_canReadTypeId, jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_getObjectId = jniAccessors.getMethodIDOf(
       _classRef, r"getObjectId", r"()Ljava/lang/Object;");
@@ -2041,9 +2250,10 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   ///@since 2.3
-  jni.JObject getObjectId() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_getObjectId, jni.JniCallType.objectType, []).object);
+  jni.JObject getObjectId() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_getObjectId, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_getTypeId = jniAccessors.getMethodIDOf(
       _classRef, r"getTypeId", r"()Ljava/lang/Object;");
@@ -2064,9 +2274,10 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   ///@since 2.3
-  jni.JObject getTypeId() =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_getTypeId, jni.JniCallType.objectType, []).object);
+  jni.JObject getTypeId() {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_getTypeId, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_readValueAs = jniAccessors.getMethodIDOf(
       _classRef, r"readValueAs", r"(Ljava/lang/Class;)Ljava/lang/Object;");
@@ -2099,10 +2310,13 @@
   ///@return Java value read from content
   ///@throws IOException if there is either an underlying I/O problem or decoding
   ///    issue at format layer
-  T readValueAs<T extends jni.JObject>(
-          jni.JObjType<T> $T, jni.JObject valueType) =>
-      $T.fromRef(jniAccessors.callMethodWithArgs(reference, _id_readValueAs,
-          jni.JniCallType.objectType, [valueType.reference]).object);
+  $T readValueAs<$T extends jni.JObject>(
+    jni.JObject valueType, {
+    required jni.JObjType<$T> T,
+  }) {
+    return T.fromRef(jniAccessors.callMethodWithArgs(reference, _id_readValueAs,
+        jni.JniCallType.objectType, [valueType.reference]).object);
+  }
 
   static final _id_readValueAs1 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -2134,10 +2348,16 @@
   ///@return Java value read from content
   ///@throws IOException if there is either an underlying I/O problem or decoding
   ///    issue at format layer
-  T readValueAs1<T extends jni.JObject>(
-          jni.JObjType<T> $T, jni.JObject valueTypeRef) =>
-      $T.fromRef(jniAccessors.callMethodWithArgs(reference, _id_readValueAs1,
-          jni.JniCallType.objectType, [valueTypeRef.reference]).object);
+  $T readValueAs1<$T extends jni.JObject>(
+    jni.JObject valueTypeRef, {
+    required jni.JObjType<$T> T,
+  }) {
+    return T.fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_readValueAs1,
+        jni.JniCallType.objectType,
+        [valueTypeRef.reference]).object);
+  }
 
   static final _id_readValuesAs = jniAccessors.getMethodIDOf(
       _classRef, r"readValuesAs", r"(Ljava/lang/Class;)Ljava/util/Iterator;");
@@ -2153,13 +2373,16 @@
   ///@return Iterator for reading multiple Java values from content
   ///@throws IOException if there is either an underlying I/O problem or decoding
   ///    issue at format layer
-  jni.JObject readValuesAs<T extends jni.JObject>(
-          jni.JObjType<T> $T, jni.JObject valueType) =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_readValuesAs,
-          jni.JniCallType.objectType,
-          [valueType.reference]).object);
+  jni.JObject readValuesAs<$T extends jni.JObject>(
+    jni.JObject valueType, {
+    required jni.JObjType<$T> T,
+  }) {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_readValuesAs,
+        jni.JniCallType.objectType,
+        [valueType.reference]).object);
+  }
 
   static final _id_readValuesAs1 = jniAccessors.getMethodIDOf(
       _classRef,
@@ -2177,13 +2400,16 @@
   ///@return Iterator for reading multiple Java values from content
   ///@throws IOException if there is either an underlying I/O problem or decoding
   ///    issue at format layer
-  jni.JObject readValuesAs1<T extends jni.JObject>(
-          jni.JObjType<T> $T, jni.JObject valueTypeRef) =>
-      const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
-          reference,
-          _id_readValuesAs1,
-          jni.JniCallType.objectType,
-          [valueTypeRef.reference]).object);
+  jni.JObject readValuesAs1<$T extends jni.JObject>(
+    jni.JObject valueTypeRef, {
+    required jni.JObjType<$T> T,
+  }) {
+    return const jni.JObjectType().fromRef(jniAccessors.callMethodWithArgs(
+        reference,
+        _id_readValuesAs1,
+        jni.JniCallType.objectType,
+        [valueTypeRef.reference]).object);
+  }
 
   static final _id_readValueAsTree = jniAccessors.getMethodIDOf(
       _classRef, r"readValueAsTree", r"()Ljava/lang/Object;");
@@ -2200,9 +2426,12 @@
   ///@return root of the document, or null if empty or whitespace.
   ///@throws IOException if there is either an underlying I/O problem or decoding
   ///    issue at format layer
-  T readValueAsTree<T extends jni.JObject>(jni.JObjType<T> $T) =>
-      $T.fromRef(jniAccessors.callMethodWithArgs(reference, _id_readValueAsTree,
-          jni.JniCallType.objectType, []).object);
+  $T readValueAsTree<$T extends jni.JObject>({
+    required jni.JObjType<$T> T,
+  }) {
+    return T.fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_readValueAsTree, jni.JniCallType.objectType, []).object);
+  }
 }
 
 class $JsonParserType extends jni.JObjType<JsonParser> {
@@ -2213,15 +2442,28 @@
 
   @override
   JsonParser fromRef(jni.JObjectPtr ref) => JsonParser.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($JsonParserType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $JsonParserType && other is $JsonParserType;
+  }
 }
 
 /// from: com.fasterxml.jackson.core.JsonParser$Feature
 ///
 /// Enumeration that defines all on/off features for parsers.
 class JsonParser_Feature extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   JsonParser_Feature.fromRef(
     jni.JObjectPtr ref,
@@ -2237,10 +2479,11 @@
 
   /// from: static public com.fasterxml.jackson.core.JsonParser.Feature[] values()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  static jni.JArray<JsonParser_Feature> values() =>
-      const jni.JArrayType($JsonParser_FeatureType()).fromRef(jniAccessors
-          .callStaticMethodWithArgs(
-              _classRef, _id_values, jni.JniCallType.objectType, []).object);
+  static jni.JArray<JsonParser_Feature> values() {
+    return const jni.JArrayType($JsonParser_FeatureType()).fromRef(jniAccessors
+        .callStaticMethodWithArgs(
+            _classRef, _id_values, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_valueOf = jniAccessors.getStaticMethodIDOf(
       _classRef,
@@ -2249,10 +2492,13 @@
 
   /// from: static public com.fasterxml.jackson.core.JsonParser.Feature valueOf(java.lang.String name)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  static JsonParser_Feature valueOf(jni.JString name) =>
-      const $JsonParser_FeatureType().fromRef(jniAccessors
-          .callStaticMethodWithArgs(_classRef, _id_valueOf,
-              jni.JniCallType.objectType, [name.reference]).object);
+  static JsonParser_Feature valueOf(
+    jni.JString name,
+  ) {
+    return const $JsonParser_FeatureType().fromRef(jniAccessors
+        .callStaticMethodWithArgs(_classRef, _id_valueOf,
+            jni.JniCallType.objectType, [name.reference]).object);
+  }
 
   static final _id_collectDefaults =
       jniAccessors.getStaticMethodIDOf(_classRef, r"collectDefaults", r"()I");
@@ -2262,32 +2508,39 @@
   /// Method that calculates bit set (flags) of all features that
   /// are enabled by default.
   ///@return Bit mask of all features that are enabled by default
-  static int collectDefaults() => jniAccessors.callStaticMethodWithArgs(
-      _classRef, _id_collectDefaults, jni.JniCallType.intType, []).integer;
+  static int collectDefaults() {
+    return jniAccessors.callStaticMethodWithArgs(
+        _classRef, _id_collectDefaults, jni.JniCallType.intType, []).integer;
+  }
 
   static final _id_enabledByDefault =
       jniAccessors.getMethodIDOf(_classRef, r"enabledByDefault", r"()Z");
 
   /// from: public boolean enabledByDefault()
-  bool enabledByDefault() => jniAccessors.callMethodWithArgs(
-      reference, _id_enabledByDefault, jni.JniCallType.booleanType, []).boolean;
+  bool enabledByDefault() {
+    return jniAccessors.callMethodWithArgs(reference, _id_enabledByDefault,
+        jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_enabledIn =
       jniAccessors.getMethodIDOf(_classRef, r"enabledIn", r"(I)Z");
 
   /// from: public boolean enabledIn(int flags)
-  bool enabledIn(int flags) => jniAccessors.callMethodWithArgs(
-      reference,
-      _id_enabledIn,
-      jni.JniCallType.booleanType,
-      [jni.JValueInt(flags)]).boolean;
+  bool enabledIn(
+    int flags,
+  ) {
+    return jniAccessors.callMethodWithArgs(reference, _id_enabledIn,
+        jni.JniCallType.booleanType, [jni.JValueInt(flags)]).boolean;
+  }
 
   static final _id_getMask =
       jniAccessors.getMethodIDOf(_classRef, r"getMask", r"()I");
 
   /// from: public int getMask()
-  int getMask() => jniAccessors.callMethodWithArgs(
-      reference, _id_getMask, jni.JniCallType.intType, []).integer;
+  int getMask() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_getMask, jni.JniCallType.intType, []).integer;
+  }
 }
 
 class $JsonParser_FeatureType extends jni.JObjType<JsonParser_Feature> {
@@ -2299,6 +2552,21 @@
   @override
   JsonParser_Feature fromRef(jni.JObjectPtr ref) =>
       JsonParser_Feature.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($JsonParser_FeatureType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $JsonParser_FeatureType &&
+        other is $JsonParser_FeatureType;
+  }
 }
 
 /// from: com.fasterxml.jackson.core.JsonParser$NumberType
@@ -2306,9 +2574,8 @@
 /// Enumeration of possible "native" (optimal) types that can be
 /// used for numbers.
 class JsonParser_NumberType extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   JsonParser_NumberType.fromRef(
     jni.JObjectPtr ref,
@@ -2324,10 +2591,11 @@
 
   /// from: static public com.fasterxml.jackson.core.JsonParser.NumberType[] values()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  static jni.JArray<JsonParser_NumberType> values() =>
-      const jni.JArrayType($JsonParser_NumberTypeType()).fromRef(jniAccessors
-          .callStaticMethodWithArgs(
-              _classRef, _id_values, jni.JniCallType.objectType, []).object);
+  static jni.JArray<JsonParser_NumberType> values() {
+    return const jni.JArrayType($JsonParser_NumberTypeType()).fromRef(
+        jniAccessors.callStaticMethodWithArgs(
+            _classRef, _id_values, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_valueOf = jniAccessors.getStaticMethodIDOf(
       _classRef,
@@ -2336,10 +2604,13 @@
 
   /// from: static public com.fasterxml.jackson.core.JsonParser.NumberType valueOf(java.lang.String name)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  static JsonParser_NumberType valueOf(jni.JString name) =>
-      const $JsonParser_NumberTypeType().fromRef(jniAccessors
-          .callStaticMethodWithArgs(_classRef, _id_valueOf,
-              jni.JniCallType.objectType, [name.reference]).object);
+  static JsonParser_NumberType valueOf(
+    jni.JString name,
+  ) {
+    return const $JsonParser_NumberTypeType().fromRef(jniAccessors
+        .callStaticMethodWithArgs(_classRef, _id_valueOf,
+            jni.JniCallType.objectType, [name.reference]).object);
+  }
 }
 
 class $JsonParser_NumberTypeType extends jni.JObjType<JsonParser_NumberType> {
@@ -2351,4 +2622,19 @@
   @override
   JsonParser_NumberType fromRef(jni.JObjectPtr ref) =>
       JsonParser_NumberType.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($JsonParser_NumberTypeType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $JsonParser_NumberTypeType &&
+        other is $JsonParser_NumberTypeType;
+  }
 }
diff --git a/pkgs/jnigen/test/jackson_core_test/third_party/lib/com/fasterxml/jackson/core/JsonToken.dart b/pkgs/jnigen/test/jackson_core_test/third_party/lib/com/fasterxml/jackson/core/JsonToken.dart
index 6f3e8b4..2a88806 100644
--- a/pkgs/jnigen/test/jackson_core_test/third_party/lib/com/fasterxml/jackson/core/JsonToken.dart
+++ b/pkgs/jnigen/test/jackson_core_test/third_party/lib/com/fasterxml/jackson/core/JsonToken.dart
@@ -43,9 +43,8 @@
 /// Enumeration for basic token types used for returning results
 /// of parsing JSON content.
 class JsonToken extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   JsonToken.fromRef(
     jni.JObjectPtr ref,
@@ -61,10 +60,11 @@
 
   /// from: static public com.fasterxml.jackson.core.JsonToken[] values()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  static jni.JArray<JsonToken> values() =>
-      const jni.JArrayType($JsonTokenType()).fromRef(jniAccessors
-          .callStaticMethodWithArgs(
-              _classRef, _id_values, jni.JniCallType.objectType, []).object);
+  static jni.JArray<JsonToken> values() {
+    return const jni.JArrayType($JsonTokenType()).fromRef(jniAccessors
+        .callStaticMethodWithArgs(
+            _classRef, _id_values, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_valueOf = jniAccessors.getStaticMethodIDOf(
       _classRef,
@@ -73,45 +73,55 @@
 
   /// from: static public com.fasterxml.jackson.core.JsonToken valueOf(java.lang.String name)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  static JsonToken valueOf(jni.JString name) =>
-      const $JsonTokenType().fromRef(jniAccessors.callStaticMethodWithArgs(
-          _classRef,
-          _id_valueOf,
-          jni.JniCallType.objectType,
-          [name.reference]).object);
+  static JsonToken valueOf(
+    jni.JString name,
+  ) {
+    return const $JsonTokenType().fromRef(jniAccessors.callStaticMethodWithArgs(
+        _classRef,
+        _id_valueOf,
+        jni.JniCallType.objectType,
+        [name.reference]).object);
+  }
 
   static final _id_id = jniAccessors.getMethodIDOf(_classRef, r"id", r"()I");
 
   /// from: public final int id()
-  int id() => jniAccessors.callMethodWithArgs(
-      reference, _id_id, jni.JniCallType.intType, []).integer;
+  int id() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_id, jni.JniCallType.intType, []).integer;
+  }
 
   static final _id_asString = jniAccessors.getMethodIDOf(
       _classRef, r"asString", r"()Ljava/lang/String;");
 
   /// from: public final java.lang.String asString()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  jni.JString asString() =>
-      const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_asString, jni.JniCallType.objectType, []).object);
+  jni.JString asString() {
+    return const jni.JStringType().fromRef(jniAccessors.callMethodWithArgs(
+        reference, _id_asString, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_asCharArray =
       jniAccessors.getMethodIDOf(_classRef, r"asCharArray", r"()[C");
 
   /// from: public final char[] asCharArray()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  jni.JArray<jni.JChar> asCharArray() => const jni.JArrayType(jni.JCharType())
-      .fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_asCharArray, jni.JniCallType.objectType, []).object);
+  jni.JArray<jni.JChar> asCharArray() {
+    return const jni.JArrayType(jni.JCharType()).fromRef(jniAccessors
+        .callMethodWithArgs(
+            reference, _id_asCharArray, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_asByteArray =
       jniAccessors.getMethodIDOf(_classRef, r"asByteArray", r"()[B");
 
   /// from: public final byte[] asByteArray()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  jni.JArray<jni.JByte> asByteArray() => const jni.JArrayType(jni.JByteType())
-      .fromRef(jniAccessors.callMethodWithArgs(
-          reference, _id_asByteArray, jni.JniCallType.objectType, []).object);
+  jni.JArray<jni.JByte> asByteArray() {
+    return const jni.JArrayType(jni.JByteType()).fromRef(jniAccessors
+        .callMethodWithArgs(
+            reference, _id_asByteArray, jni.JniCallType.objectType, []).object);
+  }
 
   static final _id_isNumeric =
       jniAccessors.getMethodIDOf(_classRef, r"isNumeric", r"()Z");
@@ -120,8 +130,10 @@
   ///
   /// @return {@code True} if this token is {@code VALUE_NUMBER_INT} or {@code VALUE_NUMBER_FLOAT},
   ///   {@code false} otherwise
-  bool isNumeric() => jniAccessors.callMethodWithArgs(
-      reference, _id_isNumeric, jni.JniCallType.booleanType, []).boolean;
+  bool isNumeric() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_isNumeric, jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_isStructStart =
       jniAccessors.getMethodIDOf(_classRef, r"isStructStart", r"()Z");
@@ -135,8 +147,10 @@
   ///@return {@code True} if this token is {@code START_OBJECT} or {@code START_ARRAY},
   ///   {@code false} otherwise
   ///@since 2.3
-  bool isStructStart() => jniAccessors.callMethodWithArgs(
-      reference, _id_isStructStart, jni.JniCallType.booleanType, []).boolean;
+  bool isStructStart() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_isStructStart, jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_isStructEnd =
       jniAccessors.getMethodIDOf(_classRef, r"isStructEnd", r"()Z");
@@ -150,8 +164,10 @@
   ///@return {@code True} if this token is {@code END_OBJECT} or {@code END_ARRAY},
   ///   {@code false} otherwise
   ///@since 2.3
-  bool isStructEnd() => jniAccessors.callMethodWithArgs(
-      reference, _id_isStructEnd, jni.JniCallType.booleanType, []).boolean;
+  bool isStructEnd() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_isStructEnd, jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_isScalarValue =
       jniAccessors.getMethodIDOf(_classRef, r"isScalarValue", r"()Z");
@@ -164,8 +180,10 @@
   /// {@code FIELD_NAME}.
   ///@return {@code True} if this token is a scalar value token (one of
   ///   {@code VALUE_xxx} tokens), {@code false} otherwise
-  bool isScalarValue() => jniAccessors.callMethodWithArgs(
-      reference, _id_isScalarValue, jni.JniCallType.booleanType, []).boolean;
+  bool isScalarValue() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_isScalarValue, jni.JniCallType.booleanType, []).boolean;
+  }
 
   static final _id_isBoolean =
       jniAccessors.getMethodIDOf(_classRef, r"isBoolean", r"()Z");
@@ -174,8 +192,10 @@
   ///
   /// @return {@code True} if this token is {@code VALUE_TRUE} or {@code VALUE_FALSE},
   ///   {@code false} otherwise
-  bool isBoolean() => jniAccessors.callMethodWithArgs(
-      reference, _id_isBoolean, jni.JniCallType.booleanType, []).boolean;
+  bool isBoolean() {
+    return jniAccessors.callMethodWithArgs(
+        reference, _id_isBoolean, jni.JniCallType.booleanType, []).boolean;
+  }
 }
 
 class $JsonTokenType extends jni.JObjType<JsonToken> {
@@ -186,4 +206,18 @@
 
   @override
   JsonToken fromRef(jni.JObjectPtr ref) => JsonToken.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($JsonTokenType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $JsonTokenType && other is $JsonTokenType;
+  }
 }
diff --git a/pkgs/jnigen/test/kotlin_test/lib/kotlin.dart b/pkgs/jnigen/test/kotlin_test/lib/kotlin.dart
index 5d11a17..094aa46 100644
--- a/pkgs/jnigen/test/kotlin_test/lib/kotlin.dart
+++ b/pkgs/jnigen/test/kotlin_test/lib/kotlin.dart
@@ -30,9 +30,8 @@
 
 /// from: com.github.dart_lang.jnigen.SuspendFun
 class SuspendFun extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   SuspendFun.fromRef(
     jni.JObjectPtr ref,
@@ -46,7 +45,9 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  SuspendFun() : super.fromRef(_ctor().object);
+  factory SuspendFun() {
+    return SuspendFun.fromRef(_ctor().object);
+  }
 
   static final _sayHello = jniLookup<
           ffi.NativeFunction<
@@ -82,7 +83,9 @@
 
   /// from: public final java.lang.Object sayHello(java.lang.String string, kotlin.coroutines.Continuation continuation)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  Future<jni.JString> sayHello1(jni.JString string) async {
+  Future<jni.JString> sayHello1(
+    jni.JString string,
+  ) async {
     final $p = ReceivePort();
     final $c = jni.JObject.fromRef(jni.Jni.newPortContinuation($p));
     _sayHello1(reference, string.reference, $c.reference).object;
@@ -103,4 +106,18 @@
 
   @override
   SuspendFun fromRef(jni.JObjectPtr ref) => SuspendFun.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($SuspendFunType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $SuspendFunType && other is $SuspendFunType;
+  }
 }
diff --git a/pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/generics/MyStack.java b/pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/generics/MyStack.java
index fc85a3d..c4e2d06 100644
--- a/pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/generics/MyStack.java
+++ b/pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/generics/MyStack.java
@@ -13,6 +13,38 @@
     stack = new Stack<>();
   }
 
+  public static <T> MyStack<T> fromArray(T[] arr) {
+    var stack = new MyStack<T>();
+    for (int i = 0; i < arr.length; ++i) {
+      stack.push(arr[i]);
+    }
+    return stack;
+  }
+
+  public static <S> MyStack<S> fromArrayOfArrayOfGrandParents(GrandParent<S>[][] arr) {
+    // just for testing
+    var stack = new MyStack<S>();
+    stack.push(arr[0][0].value);
+    return stack;
+  }
+
+  public static <T> MyStack<T> of() {
+    return new MyStack<T>();
+  }
+
+  public static <T> MyStack<T> of(T obj) {
+    var stack = new MyStack<T>();
+    stack.push(obj);
+    return stack;
+  }
+
+  public static <T> MyStack<T> of(T obj, T obj2) {
+    var stack = new MyStack<T>();
+    stack.push(obj);
+    stack.push(obj2);
+    return stack;
+  }
+
   public void push(T item) {
     stack.push(item);
   }
@@ -20,4 +52,8 @@
   public T pop() {
     return stack.pop();
   }
+
+  public int size() {
+    return stack.size();
+  }
 }
diff --git a/pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/generics/StringMap.java b/pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/generics/StringMap.java
new file mode 100644
index 0000000..05f9365
--- /dev/null
+++ b/pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/generics/StringMap.java
@@ -0,0 +1,7 @@
+// Copyright (c) 2023, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.github.dart_lang.jnigen.generics;
+
+public class StringMap extends StringKeyedMap<String> {}
diff --git a/pkgs/jnigen/test/simple_package_test/lib/simple_package.dart b/pkgs/jnigen/test/simple_package_test/lib/simple_package.dart
index aca99d9..c5d1083 100644
--- a/pkgs/jnigen/test/simple_package_test/lib/simple_package.dart
+++ b/pkgs/jnigen/test/simple_package_test/lib/simple_package.dart
@@ -30,9 +30,8 @@
 
 /// from: com.github.dart_lang.jnigen.simple_package.Example
 class Example extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   Example.fromRef(
     jni.JObjectPtr ref,
@@ -89,7 +88,9 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  Example() : super.fromRef(_ctor().object);
+  factory Example() {
+    return Example.fromRef(_ctor().object);
+  }
 
   static final _ctor1 =
       jniLookup<ffi.NativeFunction<jni.JniResult Function(ffi.Int32)>>(
@@ -98,7 +99,11 @@
 
   /// from: public void <init>(int internal)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  Example.ctor1(int internal) : super.fromRef(_ctor1(internal).object);
+  factory Example.ctor1(
+    int internal,
+  ) {
+    return Example.fromRef(_ctor1(internal).object);
+  }
 
   static final _whichExample = jniLookup<
           ffi.NativeFunction<
@@ -107,7 +112,9 @@
       .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
 
   /// from: public int whichExample()
-  int whichExample() => _whichExample(reference).integer;
+  int whichExample() {
+    return _whichExample(reference).integer;
+  }
 
   static final _getAux =
       jniLookup<ffi.NativeFunction<jni.JniResult Function()>>("Example__getAux")
@@ -115,8 +122,9 @@
 
   /// from: static public com.github.dart_lang.jnigen.simple_package.Example.Aux getAux()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  static Example_Aux getAux() =>
-      const $Example_AuxType().fromRef(_getAux().object);
+  static Example_Aux getAux() {
+    return const $Example_AuxType().fromRef(_getAux().object);
+  }
 
   static final _addInts = jniLookup<
               ffi.NativeFunction<jni.JniResult Function(ffi.Int32, ffi.Int32)>>(
@@ -124,7 +132,12 @@
       .asFunction<jni.JniResult Function(int, int)>();
 
   /// from: static public int addInts(int a, int b)
-  static int addInts(int a, int b) => _addInts(a, b).integer;
+  static int addInts(
+    int a,
+    int b,
+  ) {
+    return _addInts(a, b).integer;
+  }
 
   static final _getArr =
       jniLookup<ffi.NativeFunction<jni.JniResult Function()>>("Example__getArr")
@@ -132,8 +145,9 @@
 
   /// from: static public int[] getArr()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  static jni.JArray<jni.JInt> getArr() =>
-      const jni.JArrayType(jni.JIntType()).fromRef(_getArr().object);
+  static jni.JArray<jni.JInt> getArr() {
+    return const jni.JArrayType(jni.JIntType()).fromRef(_getArr().object);
+  }
 
   static final _addAll = jniLookup<
           ffi.NativeFunction<
@@ -141,7 +155,11 @@
       .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
 
   /// from: static public int addAll(int[] arr)
-  static int addAll(jni.JArray<jni.JInt> arr) => _addAll(arr.reference).integer;
+  static int addAll(
+    jni.JArray<jni.JInt> arr,
+  ) {
+    return _addAll(arr.reference).integer;
+  }
 
   static final _getSelf = jniLookup<
           ffi.NativeFunction<
@@ -151,7 +169,9 @@
 
   /// from: public com.github.dart_lang.jnigen.simple_package.Example getSelf()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  Example getSelf() => const $ExampleType().fromRef(_getSelf(reference).object);
+  Example getSelf() {
+    return const $ExampleType().fromRef(_getSelf(reference).object);
+  }
 
   static final _getNum = jniLookup<
           ffi.NativeFunction<
@@ -159,7 +179,9 @@
       .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
 
   /// from: public int getNum()
-  int getNum() => _getNum(reference).integer;
+  int getNum() {
+    return _getNum(reference).integer;
+  }
 
   static final _setNum = jniLookup<
           ffi.NativeFunction<
@@ -168,7 +190,11 @@
       .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>, int)>();
 
   /// from: public void setNum(int num)
-  void setNum(int num) => _setNum(reference, num).check();
+  void setNum(
+    int num,
+  ) {
+    return _setNum(reference, num).check();
+  }
 
   static final _getInternal = jniLookup<
           ffi.NativeFunction<
@@ -177,7 +203,9 @@
       .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
 
   /// from: public int getInternal()
-  int getInternal() => _getInternal(reference).integer;
+  int getInternal() {
+    return _getInternal(reference).integer;
+  }
 
   static final _setInternal = jniLookup<
           ffi.NativeFunction<
@@ -186,7 +214,11 @@
       .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>, int)>();
 
   /// from: public void setInternal(int internal)
-  void setInternal(int internal) => _setInternal(reference, internal).check();
+  void setInternal(
+    int internal,
+  ) {
+    return _setInternal(reference, internal).check();
+  }
 
   static final _throwException =
       jniLookup<ffi.NativeFunction<jni.JniResult Function()>>(
@@ -194,7 +226,9 @@
           .asFunction<jni.JniResult Function()>();
 
   /// from: static public void throwException()
-  static void throwException() => _throwException().check();
+  static void throwException() {
+    return _throwException().check();
+  }
 }
 
 class $ExampleType extends jni.JObjType<Example> {
@@ -206,13 +240,26 @@
 
   @override
   Example fromRef(jni.JObjectPtr ref) => Example.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($ExampleType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $ExampleType && other is $ExampleType;
+  }
 }
 
 /// from: com.github.dart_lang.jnigen.simple_package.Example$Aux
 class Example_Aux extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   Example_Aux.fromRef(
     jni.JObjectPtr ref,
@@ -249,7 +296,11 @@
 
   /// from: public void <init>(boolean value)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  Example_Aux(bool value) : super.fromRef(_ctor(value ? 1 : 0).object);
+  factory Example_Aux(
+    bool value,
+  ) {
+    return Example_Aux.fromRef(_ctor(value ? 1 : 0).object);
+  }
 
   static final _getValue = jniLookup<
           ffi.NativeFunction<
@@ -258,7 +309,9 @@
       .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
 
   /// from: public boolean getValue()
-  bool getValue() => _getValue(reference).boolean;
+  bool getValue() {
+    return _getValue(reference).boolean;
+  }
 
   static final _setValue = jniLookup<
           ffi.NativeFunction<
@@ -267,7 +320,11 @@
       .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>, int)>();
 
   /// from: public void setValue(boolean value)
-  void setValue(bool value) => _setValue(reference, value ? 1 : 0).check();
+  void setValue(
+    bool value,
+  ) {
+    return _setValue(reference, value ? 1 : 0).check();
+  }
 }
 
 class $Example_AuxType extends jni.JObjType<Example_Aux> {
@@ -279,13 +336,26 @@
 
   @override
   Example_Aux fromRef(jni.JObjectPtr ref) => Example_Aux.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($Example_AuxType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $Example_AuxType && other is $Example_AuxType;
+  }
 }
 
 /// from: com.github.dart_lang.jnigen.pkg2.C2
 class C2 extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   C2.fromRef(
     jni.JObjectPtr ref,
@@ -315,7 +385,9 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  C2() : super.fromRef(_ctor().object);
+  factory C2() {
+    return C2.fromRef(_ctor().object);
+  }
 }
 
 class $C2Type extends jni.JObjType<C2> {
@@ -326,13 +398,26 @@
 
   @override
   C2 fromRef(jni.JObjectPtr ref) => C2.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($C2Type).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $C2Type && other is $C2Type;
+  }
 }
 
 /// from: com.github.dart_lang.jnigen.pkg2.Example
 class Example1 extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   Example1.fromRef(
     jni.JObjectPtr ref,
@@ -346,7 +431,9 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  Example1() : super.fromRef(_ctor().object);
+  factory Example1() {
+    return Example1.fromRef(_ctor().object);
+  }
 
   static final _whichExample = jniLookup<
           ffi.NativeFunction<
@@ -355,7 +442,9 @@
       .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
 
   /// from: public int whichExample()
-  int whichExample() => _whichExample(reference).integer;
+  int whichExample() {
+    return _whichExample(reference).integer;
+  }
 }
 
 class $Example1Type extends jni.JObjType<Example1> {
@@ -366,27 +455,40 @@
 
   @override
   Example1 fromRef(jni.JObjectPtr ref) => Example1.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($Example1Type).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $Example1Type && other is $Example1Type;
+  }
 }
 
 /// from: com.github.dart_lang.jnigen.generics.GrandParent
-class GrandParent<T extends jni.JObject> extends jni.JObject {
-  late final jni.JObjType? _$type;
+class GrandParent<$T extends jni.JObject> extends jni.JObject {
   @override
-  jni.JObjType get $type => _$type ??= type($T);
+  late final jni.JObjType $type = type(T);
 
-  final jni.JObjType<T> $T;
+  final jni.JObjType<$T> T;
 
   GrandParent.fromRef(
-    this.$T,
+    this.T,
     jni.JObjectPtr ref,
   ) : super.fromRef(ref);
 
   /// The type which includes information such as the signature of this class.
-  static $GrandParentType<T> type<T extends jni.JObject>(
-    jni.JObjType<T> $T,
+  static $GrandParentType<$T> type<$T extends jni.JObject>(
+    jni.JObjType<$T> T,
   ) {
     return $GrandParentType(
-      $T,
+      T,
     );
   }
 
@@ -409,11 +511,11 @@
 
   /// from: public T value
   /// The returned object must be deleted after use, by calling the `delete` method.
-  T get value => $T.fromRef(_get_value(reference).object);
+  $T get value => T.fromRef(_get_value(reference).object);
 
   /// from: public T value
   /// The returned object must be deleted after use, by calling the `delete` method.
-  set value(T value) => _set_value(reference, value.reference);
+  set value($T value) => _set_value(reference, value.reference);
 
   static final _ctor = jniLookup<
           ffi.NativeFunction<
@@ -423,7 +525,15 @@
 
   /// from: public void <init>(T value)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  GrandParent(this.$T, T value) : super.fromRef(_ctor(value.reference).object);
+  factory GrandParent(
+    $T value, {
+    jni.JObjType<$T>? T,
+  }) {
+    T ??= jni.lowestCommonSuperType([
+      value.$type,
+    ]) as jni.JObjType<$T>;
+    return GrandParent.fromRef(T, _ctor(value.reference).object);
+  }
 
   static final _stringParent = jniLookup<
           ffi.NativeFunction<
@@ -433,9 +543,10 @@
 
   /// from: public com.github.dart_lang.jnigen.generics.GrandParent<T>.Parent<java.lang.String> stringParent()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  GrandParent_Parent<jni.JObject, jni.JString> stringParent() =>
-      const $GrandParent_ParentType(jni.JObjectType(), jni.JStringType())
-          .fromRef(_stringParent(reference).object);
+  GrandParent_Parent<jni.JObject, jni.JString> stringParent() {
+    return const $GrandParent_ParentType(jni.JObjectType(), jni.JStringType())
+        .fromRef(_stringParent(reference).object);
+  }
 
   static final _varParent = jniLookup<
           ffi.NativeFunction<
@@ -447,10 +558,16 @@
 
   /// from: public com.github.dart_lang.jnigen.generics.GrandParent<T>.Parent<S> varParent(S nestedValue)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  GrandParent_Parent<jni.JObject, S> varParent<S extends jni.JObject>(
-          jni.JObjType<S> $S, S nestedValue) =>
-      $GrandParent_ParentType(const jni.JObjectType(), $S)
-          .fromRef(_varParent(reference, nestedValue.reference).object);
+  GrandParent_Parent<jni.JObject, $S> varParent<$S extends jni.JObject>(
+    $S nestedValue, {
+    jni.JObjType<$S>? S,
+  }) {
+    S ??= jni.lowestCommonSuperType([
+      nestedValue.$type,
+    ]) as jni.JObjType<$S>;
+    return $GrandParent_ParentType(const jni.JObjectType(), S)
+        .fromRef(_varParent(reference, nestedValue.reference).object);
+  }
 
   static final _stringStaticParent =
       jniLookup<ffi.NativeFunction<jni.JniResult Function()>>(
@@ -459,9 +576,10 @@
 
   /// from: static public com.github.dart_lang.jnigen.generics.GrandParent.StaticParent<java.lang.String> stringStaticParent()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  static GrandParent_StaticParent<jni.JString> stringStaticParent() =>
-      const $GrandParent_StaticParentType(jni.JStringType())
-          .fromRef(_stringStaticParent().object);
+  static GrandParent_StaticParent<jni.JString> stringStaticParent() {
+    return const $GrandParent_StaticParentType(jni.JStringType())
+        .fromRef(_stringStaticParent().object);
+  }
 
   static final _varStaticParent = jniLookup<
           ffi.NativeFunction<
@@ -471,10 +589,16 @@
 
   /// from: static public com.github.dart_lang.jnigen.generics.GrandParent.StaticParent<S> varStaticParent(S value)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  static GrandParent_StaticParent<S> varStaticParent<S extends jni.JObject>(
-          jni.JObjType<S> $S, S value) =>
-      $GrandParent_StaticParentType($S)
-          .fromRef(_varStaticParent(value.reference).object);
+  static GrandParent_StaticParent<$S> varStaticParent<$S extends jni.JObject>(
+    $S value, {
+    jni.JObjType<$S>? S,
+  }) {
+    S ??= jni.lowestCommonSuperType([
+      value.$type,
+    ]) as jni.JObjType<$S>;
+    return $GrandParent_StaticParentType(S)
+        .fromRef(_varStaticParent(value.reference).object);
+  }
 
   static final _staticParentWithSameType = jniLookup<
               ffi.NativeFunction<
@@ -484,51 +608,67 @@
 
   /// from: public com.github.dart_lang.jnigen.generics.GrandParent.StaticParent<T> staticParentWithSameType()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  GrandParent_StaticParent<T> staticParentWithSameType() =>
-      $GrandParent_StaticParentType($T)
-          .fromRef(_staticParentWithSameType(reference).object);
+  GrandParent_StaticParent<$T> staticParentWithSameType() {
+    return $GrandParent_StaticParentType(T)
+        .fromRef(_staticParentWithSameType(reference).object);
+  }
 }
 
-class $GrandParentType<T extends jni.JObject>
-    extends jni.JObjType<GrandParent<T>> {
-  final jni.JObjType<T> $T;
+class $GrandParentType<$T extends jni.JObject>
+    extends jni.JObjType<GrandParent<$T>> {
+  final jni.JObjType<$T> T;
 
   const $GrandParentType(
-    this.$T,
+    this.T,
   );
 
   @override
   String get signature => r"Lcom/github/dart_lang/jnigen/generics/GrandParent;";
 
   @override
-  GrandParent<T> fromRef(jni.JObjectPtr ref) => GrandParent.fromRef($T, ref);
+  GrandParent<$T> fromRef(jni.JObjectPtr ref) => GrandParent.fromRef(T, ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => Object.hash($GrandParentType, T);
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $GrandParentType &&
+        other is $GrandParentType &&
+        T == other.T;
+  }
 }
 
 /// from: com.github.dart_lang.jnigen.generics.GrandParent$Parent
-class GrandParent_Parent<T extends jni.JObject, S extends jni.JObject>
+class GrandParent_Parent<$T extends jni.JObject, $S extends jni.JObject>
     extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type($T, $S);
+  late final jni.JObjType $type = type(T, S);
 
-  final jni.JObjType<T> $T;
-  final jni.JObjType<S> $S;
+  final jni.JObjType<$T> T;
+  final jni.JObjType<$S> S;
 
   GrandParent_Parent.fromRef(
-    this.$T,
-    this.$S,
+    this.T,
+    this.S,
     jni.JObjectPtr ref,
   ) : super.fromRef(ref);
 
   /// The type which includes information such as the signature of this class.
-  static $GrandParent_ParentType<T, S>
-      type<T extends jni.JObject, S extends jni.JObject>(
-    jni.JObjType<T> $T,
-    jni.JObjType<S> $S,
+  static $GrandParent_ParentType<$T, $S>
+      type<$T extends jni.JObject, $S extends jni.JObject>(
+    jni.JObjType<$T> T,
+    jni.JObjType<$S> S,
   ) {
     return $GrandParent_ParentType(
-      $T,
-      $S,
+      T,
+      S,
     );
   }
 
@@ -552,11 +692,11 @@
 
   /// from: public T parentValue
   /// The returned object must be deleted after use, by calling the `delete` method.
-  T get parentValue => $T.fromRef(_get_parentValue(reference).object);
+  $T get parentValue => T.fromRef(_get_parentValue(reference).object);
 
   /// from: public T parentValue
   /// The returned object must be deleted after use, by calling the `delete` method.
-  set parentValue(T value) => _set_parentValue(reference, value.reference);
+  set parentValue($T value) => _set_parentValue(reference, value.reference);
 
   static final _get_value = jniLookup<
           ffi.NativeFunction<
@@ -577,11 +717,11 @@
 
   /// from: public S value
   /// The returned object must be deleted after use, by calling the `delete` method.
-  S get value => $S.fromRef(_get_value(reference).object);
+  $S get value => S.fromRef(_get_value(reference).object);
 
   /// from: public S value
   /// The returned object must be deleted after use, by calling the `delete` method.
-  set value(S value) => _set_value(reference, value.reference);
+  set value($S value) => _set_value(reference, value.reference);
 
   static final _ctor = jniLookup<
           ffi.NativeFunction<
@@ -593,18 +733,31 @@
 
   /// from: public void <init>(T parentValue, S value)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  GrandParent_Parent(this.$T, this.$S, T parentValue, S value)
-      : super.fromRef(_ctor(parentValue.reference, value.reference).object);
+  factory GrandParent_Parent(
+    $T parentValue,
+    $S value, {
+    jni.JObjType<$T>? T,
+    jni.JObjType<$S>? S,
+  }) {
+    T ??= jni.lowestCommonSuperType([
+      parentValue.$type,
+    ]) as jni.JObjType<$T>;
+    S ??= jni.lowestCommonSuperType([
+      value.$type,
+    ]) as jni.JObjType<$S>;
+    return GrandParent_Parent.fromRef(
+        T, S, _ctor(parentValue.reference, value.reference).object);
+  }
 }
 
-class $GrandParent_ParentType<T extends jni.JObject, S extends jni.JObject>
-    extends jni.JObjType<GrandParent_Parent<T, S>> {
-  final jni.JObjType<T> $T;
-  final jni.JObjType<S> $S;
+class $GrandParent_ParentType<$T extends jni.JObject, $S extends jni.JObject>
+    extends jni.JObjType<GrandParent_Parent<$T, $S>> {
+  final jni.JObjType<$T> T;
+  final jni.JObjType<$S> S;
 
   const $GrandParent_ParentType(
-    this.$T,
-    this.$S,
+    this.T,
+    this.S,
   );
 
   @override
@@ -612,39 +765,55 @@
       r"Lcom/github/dart_lang/jnigen/generics/GrandParent$Parent;";
 
   @override
-  GrandParent_Parent<T, S> fromRef(jni.JObjectPtr ref) =>
-      GrandParent_Parent.fromRef($T, $S, ref);
+  GrandParent_Parent<$T, $S> fromRef(jni.JObjectPtr ref) =>
+      GrandParent_Parent.fromRef(T, S, ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => Object.hash($GrandParent_ParentType, T, S);
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $GrandParent_ParentType &&
+        other is $GrandParent_ParentType &&
+        T == other.T &&
+        S == other.S;
+  }
 }
 
 /// from: com.github.dart_lang.jnigen.generics.GrandParent$Parent$Child
-class GrandParent_Parent_Child<T extends jni.JObject, S extends jni.JObject,
-    U extends jni.JObject> extends jni.JObject {
-  late final jni.JObjType? _$type;
+class GrandParent_Parent_Child<$T extends jni.JObject, $S extends jni.JObject,
+    $U extends jni.JObject> extends jni.JObject {
   @override
-  jni.JObjType get $type => _$type ??= type($T, $S, $U);
+  late final jni.JObjType $type = type(T, S, U);
 
-  final jni.JObjType<T> $T;
-  final jni.JObjType<S> $S;
-  final jni.JObjType<U> $U;
+  final jni.JObjType<$T> T;
+  final jni.JObjType<$S> S;
+  final jni.JObjType<$U> U;
 
   GrandParent_Parent_Child.fromRef(
-    this.$T,
-    this.$S,
-    this.$U,
+    this.T,
+    this.S,
+    this.U,
     jni.JObjectPtr ref,
   ) : super.fromRef(ref);
 
   /// The type which includes information such as the signature of this class.
-  static $GrandParent_Parent_ChildType<T, S, U>
-      type<T extends jni.JObject, S extends jni.JObject, U extends jni.JObject>(
-    jni.JObjType<T> $T,
-    jni.JObjType<S> $S,
-    jni.JObjType<U> $U,
+  static $GrandParent_Parent_ChildType<$T, $S, $U> type<$T extends jni.JObject,
+      $S extends jni.JObject, $U extends jni.JObject>(
+    jni.JObjType<$T> T,
+    jni.JObjType<$S> S,
+    jni.JObjType<$U> U,
   ) {
     return $GrandParent_Parent_ChildType(
-      $T,
-      $S,
-      $U,
+      T,
+      S,
+      U,
     );
   }
 
@@ -668,11 +837,11 @@
 
   /// from: public T grandParentValue
   /// The returned object must be deleted after use, by calling the `delete` method.
-  T get grandParentValue => $T.fromRef(_get_grandParentValue(reference).object);
+  $T get grandParentValue => T.fromRef(_get_grandParentValue(reference).object);
 
   /// from: public T grandParentValue
   /// The returned object must be deleted after use, by calling the `delete` method.
-  set grandParentValue(T value) =>
+  set grandParentValue($T value) =>
       _set_grandParentValue(reference, value.reference);
 
   static final _get_parentValue = jniLookup<
@@ -695,11 +864,11 @@
 
   /// from: public S parentValue
   /// The returned object must be deleted after use, by calling the `delete` method.
-  S get parentValue => $S.fromRef(_get_parentValue(reference).object);
+  $S get parentValue => S.fromRef(_get_parentValue(reference).object);
 
   /// from: public S parentValue
   /// The returned object must be deleted after use, by calling the `delete` method.
-  set parentValue(S value) => _set_parentValue(reference, value.reference);
+  set parentValue($S value) => _set_parentValue(reference, value.reference);
 
   static final _get_value = jniLookup<
           ffi.NativeFunction<
@@ -721,11 +890,11 @@
 
   /// from: public U value
   /// The returned object must be deleted after use, by calling the `delete` method.
-  U get value => $U.fromRef(_get_value(reference).object);
+  $U get value => U.fromRef(_get_value(reference).object);
 
   /// from: public U value
   /// The returned object must be deleted after use, by calling the `delete` method.
-  set value(U value) => _set_value(reference, value.reference);
+  set value($U value) => _set_value(reference, value.reference);
 
   static final _ctor = jniLookup<
           ffi.NativeFunction<
@@ -739,24 +908,44 @@
 
   /// from: public void <init>(T grandParentValue, S parentValue, U value)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  GrandParent_Parent_Child(
-      this.$T, this.$S, this.$U, T grandParentValue, S parentValue, U value)
-      : super.fromRef(_ctor(grandParentValue.reference, parentValue.reference,
+  factory GrandParent_Parent_Child(
+    $T grandParentValue,
+    $S parentValue,
+    $U value, {
+    jni.JObjType<$T>? T,
+    jni.JObjType<$S>? S,
+    jni.JObjType<$U>? U,
+  }) {
+    T ??= jni.lowestCommonSuperType([
+      grandParentValue.$type,
+    ]) as jni.JObjType<$T>;
+    S ??= jni.lowestCommonSuperType([
+      parentValue.$type,
+    ]) as jni.JObjType<$S>;
+    U ??= jni.lowestCommonSuperType([
+      value.$type,
+    ]) as jni.JObjType<$U>;
+    return GrandParent_Parent_Child.fromRef(
+        T,
+        S,
+        U,
+        _ctor(grandParentValue.reference, parentValue.reference,
                 value.reference)
             .object);
+  }
 }
 
-class $GrandParent_Parent_ChildType<T extends jni.JObject,
-        S extends jni.JObject, U extends jni.JObject>
-    extends jni.JObjType<GrandParent_Parent_Child<T, S, U>> {
-  final jni.JObjType<T> $T;
-  final jni.JObjType<S> $S;
-  final jni.JObjType<U> $U;
+class $GrandParent_Parent_ChildType<$T extends jni.JObject,
+        $S extends jni.JObject, $U extends jni.JObject>
+    extends jni.JObjType<GrandParent_Parent_Child<$T, $S, $U>> {
+  final jni.JObjType<$T> T;
+  final jni.JObjType<$S> S;
+  final jni.JObjType<$U> U;
 
   const $GrandParent_Parent_ChildType(
-    this.$T,
-    this.$S,
-    this.$U,
+    this.T,
+    this.S,
+    this.U,
   );
 
   @override
@@ -764,29 +953,46 @@
       r"Lcom/github/dart_lang/jnigen/generics/GrandParent$Parent$Child;";
 
   @override
-  GrandParent_Parent_Child<T, S, U> fromRef(jni.JObjectPtr ref) =>
-      GrandParent_Parent_Child.fromRef($T, $S, $U, ref);
+  GrandParent_Parent_Child<$T, $S, $U> fromRef(jni.JObjectPtr ref) =>
+      GrandParent_Parent_Child.fromRef(T, S, U, ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => Object.hash($GrandParent_Parent_ChildType, T, S, U);
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $GrandParent_Parent_ChildType &&
+        other is $GrandParent_Parent_ChildType &&
+        T == other.T &&
+        S == other.S &&
+        U == other.U;
+  }
 }
 
 /// from: com.github.dart_lang.jnigen.generics.GrandParent$StaticParent
-class GrandParent_StaticParent<S extends jni.JObject> extends jni.JObject {
-  late final jni.JObjType? _$type;
+class GrandParent_StaticParent<$S extends jni.JObject> extends jni.JObject {
   @override
-  jni.JObjType get $type => _$type ??= type($S);
+  late final jni.JObjType $type = type(S);
 
-  final jni.JObjType<S> $S;
+  final jni.JObjType<$S> S;
 
   GrandParent_StaticParent.fromRef(
-    this.$S,
+    this.S,
     jni.JObjectPtr ref,
   ) : super.fromRef(ref);
 
   /// The type which includes information such as the signature of this class.
-  static $GrandParent_StaticParentType<S> type<S extends jni.JObject>(
-    jni.JObjType<S> $S,
+  static $GrandParent_StaticParentType<$S> type<$S extends jni.JObject>(
+    jni.JObjType<$S> S,
   ) {
     return $GrandParent_StaticParentType(
-      $S,
+      S,
     );
   }
 
@@ -810,11 +1016,11 @@
 
   /// from: public S value
   /// The returned object must be deleted after use, by calling the `delete` method.
-  S get value => $S.fromRef(_get_value(reference).object);
+  $S get value => S.fromRef(_get_value(reference).object);
 
   /// from: public S value
   /// The returned object must be deleted after use, by calling the `delete` method.
-  set value(S value) => _set_value(reference, value.reference);
+  set value($S value) => _set_value(reference, value.reference);
 
   static final _ctor = jniLookup<
           ffi.NativeFunction<
@@ -824,16 +1030,23 @@
 
   /// from: public void <init>(S value)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  GrandParent_StaticParent(this.$S, S value)
-      : super.fromRef(_ctor(value.reference).object);
+  factory GrandParent_StaticParent(
+    $S value, {
+    jni.JObjType<$S>? S,
+  }) {
+    S ??= jni.lowestCommonSuperType([
+      value.$type,
+    ]) as jni.JObjType<$S>;
+    return GrandParent_StaticParent.fromRef(S, _ctor(value.reference).object);
+  }
 }
 
-class $GrandParent_StaticParentType<S extends jni.JObject>
-    extends jni.JObjType<GrandParent_StaticParent<S>> {
-  final jni.JObjType<S> $S;
+class $GrandParent_StaticParentType<$S extends jni.JObject>
+    extends jni.JObjType<GrandParent_StaticParent<$S>> {
+  final jni.JObjType<$S> S;
 
   const $GrandParent_StaticParentType(
-    this.$S,
+    this.S,
   );
 
   @override
@@ -841,35 +1054,50 @@
       r"Lcom/github/dart_lang/jnigen/generics/GrandParent$StaticParent;";
 
   @override
-  GrandParent_StaticParent<S> fromRef(jni.JObjectPtr ref) =>
-      GrandParent_StaticParent.fromRef($S, ref);
+  GrandParent_StaticParent<$S> fromRef(jni.JObjectPtr ref) =>
+      GrandParent_StaticParent.fromRef(S, ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => Object.hash($GrandParent_StaticParentType, S);
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $GrandParent_StaticParentType &&
+        other is $GrandParent_StaticParentType &&
+        S == other.S;
+  }
 }
 
 /// from: com.github.dart_lang.jnigen.generics.GrandParent$StaticParent$Child
-class GrandParent_StaticParent_Child<S extends jni.JObject,
-    U extends jni.JObject> extends jni.JObject {
-  late final jni.JObjType? _$type;
+class GrandParent_StaticParent_Child<$S extends jni.JObject,
+    $U extends jni.JObject> extends jni.JObject {
   @override
-  jni.JObjType get $type => _$type ??= type($S, $U);
+  late final jni.JObjType $type = type(S, U);
 
-  final jni.JObjType<S> $S;
-  final jni.JObjType<U> $U;
+  final jni.JObjType<$S> S;
+  final jni.JObjType<$U> U;
 
   GrandParent_StaticParent_Child.fromRef(
-    this.$S,
-    this.$U,
+    this.S,
+    this.U,
     jni.JObjectPtr ref,
   ) : super.fromRef(ref);
 
   /// The type which includes information such as the signature of this class.
-  static $GrandParent_StaticParent_ChildType<S, U>
-      type<S extends jni.JObject, U extends jni.JObject>(
-    jni.JObjType<S> $S,
-    jni.JObjType<U> $U,
+  static $GrandParent_StaticParent_ChildType<$S, $U>
+      type<$S extends jni.JObject, $U extends jni.JObject>(
+    jni.JObjType<$S> S,
+    jni.JObjType<$U> U,
   ) {
     return $GrandParent_StaticParent_ChildType(
-      $S,
-      $U,
+      S,
+      U,
     );
   }
 
@@ -893,11 +1121,11 @@
 
   /// from: public S parentValue
   /// The returned object must be deleted after use, by calling the `delete` method.
-  S get parentValue => $S.fromRef(_get_parentValue(reference).object);
+  $S get parentValue => S.fromRef(_get_parentValue(reference).object);
 
   /// from: public S parentValue
   /// The returned object must be deleted after use, by calling the `delete` method.
-  set parentValue(S value) => _set_parentValue(reference, value.reference);
+  set parentValue($S value) => _set_parentValue(reference, value.reference);
 
   static final _get_value = jniLookup<
           ffi.NativeFunction<
@@ -919,11 +1147,11 @@
 
   /// from: public U value
   /// The returned object must be deleted after use, by calling the `delete` method.
-  U get value => $U.fromRef(_get_value(reference).object);
+  $U get value => U.fromRef(_get_value(reference).object);
 
   /// from: public U value
   /// The returned object must be deleted after use, by calling the `delete` method.
-  set value(U value) => _set_value(reference, value.reference);
+  set value($U value) => _set_value(reference, value.reference);
 
   static final _ctor = jniLookup<
               ffi.NativeFunction<
@@ -936,19 +1164,32 @@
 
   /// from: public void <init>(S parentValue, U value)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  GrandParent_StaticParent_Child(this.$S, this.$U, S parentValue, U value)
-      : super.fromRef(_ctor(parentValue.reference, value.reference).object);
+  factory GrandParent_StaticParent_Child(
+    $S parentValue,
+    $U value, {
+    jni.JObjType<$S>? S,
+    jni.JObjType<$U>? U,
+  }) {
+    S ??= jni.lowestCommonSuperType([
+      parentValue.$type,
+    ]) as jni.JObjType<$S>;
+    U ??= jni.lowestCommonSuperType([
+      value.$type,
+    ]) as jni.JObjType<$U>;
+    return GrandParent_StaticParent_Child.fromRef(
+        S, U, _ctor(parentValue.reference, value.reference).object);
+  }
 }
 
-class $GrandParent_StaticParent_ChildType<S extends jni.JObject,
-        U extends jni.JObject>
-    extends jni.JObjType<GrandParent_StaticParent_Child<S, U>> {
-  final jni.JObjType<S> $S;
-  final jni.JObjType<U> $U;
+class $GrandParent_StaticParent_ChildType<$S extends jni.JObject,
+        $U extends jni.JObject>
+    extends jni.JObjType<GrandParent_StaticParent_Child<$S, $U>> {
+  final jni.JObjType<$S> S;
+  final jni.JObjType<$U> U;
 
   const $GrandParent_StaticParent_ChildType(
-    this.$S,
-    this.$U,
+    this.S,
+    this.U,
   );
 
   @override
@@ -956,33 +1197,51 @@
       r"Lcom/github/dart_lang/jnigen/generics/GrandParent$StaticParent$Child;";
 
   @override
-  GrandParent_StaticParent_Child<S, U> fromRef(jni.JObjectPtr ref) =>
-      GrandParent_StaticParent_Child.fromRef($S, $U, ref);
+  GrandParent_StaticParent_Child<$S, $U> fromRef(jni.JObjectPtr ref) =>
+      GrandParent_StaticParent_Child.fromRef(S, U, ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => Object.hash($GrandParent_StaticParent_ChildType, S, U);
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $GrandParent_StaticParent_ChildType &&
+        other is $GrandParent_StaticParent_ChildType &&
+        S == other.S &&
+        U == other.U;
+  }
 }
 
 /// from: com.github.dart_lang.jnigen.generics.MyMap
-class MyMap<K extends jni.JObject, V extends jni.JObject> extends jni.JObject {
-  late final jni.JObjType? _$type;
+class MyMap<$K extends jni.JObject, $V extends jni.JObject>
+    extends jni.JObject {
   @override
-  jni.JObjType get $type => _$type ??= type($K, $V);
+  late final jni.JObjType $type = type(K, V);
 
-  final jni.JObjType<K> $K;
-  final jni.JObjType<V> $V;
+  final jni.JObjType<$K> K;
+  final jni.JObjType<$V> V;
 
   MyMap.fromRef(
-    this.$K,
-    this.$V,
+    this.K,
+    this.V,
     jni.JObjectPtr ref,
   ) : super.fromRef(ref);
 
   /// The type which includes information such as the signature of this class.
-  static $MyMapType<K, V> type<K extends jni.JObject, V extends jni.JObject>(
-    jni.JObjType<K> $K,
-    jni.JObjType<V> $V,
+  static $MyMapType<$K, $V>
+      type<$K extends jni.JObject, $V extends jni.JObject>(
+    jni.JObjType<$K> K,
+    jni.JObjType<$V> V,
   ) {
     return $MyMapType(
-      $K,
-      $V,
+      K,
+      V,
     );
   }
 
@@ -992,7 +1251,12 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  MyMap(this.$K, this.$V) : super.fromRef(_ctor().object);
+  factory MyMap({
+    required jni.JObjType<$K> K,
+    required jni.JObjType<$V> V,
+  }) {
+    return MyMap.fromRef(K, V, _ctor().object);
+  }
 
   static final _get0 = jniLookup<
           ffi.NativeFunction<
@@ -1004,7 +1268,11 @@
 
   /// from: public V get(K key)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  V get0(K key) => $V.fromRef(_get0(reference, key.reference).object);
+  $V get0(
+    $K key,
+  ) {
+    return V.fromRef(_get0(reference, key.reference).object);
+  }
 
   static final _put = jniLookup<
           ffi.NativeFunction<
@@ -1016,8 +1284,12 @@
 
   /// from: public V put(K key, V value)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  V put(K key, V value) =>
-      $V.fromRef(_put(reference, key.reference, value.reference).object);
+  $V put(
+    $K key,
+    $V value,
+  ) {
+    return V.fromRef(_put(reference, key.reference, value.reference).object);
+  }
 
   static final _entryStack = jniLookup<
           ffi.NativeFunction<
@@ -1027,54 +1299,71 @@
 
   /// from: public com.github.dart_lang.jnigen.generics.MyStack<com.github.dart_lang.jnigen.generics.MyMap<K,V>.MyEntry> entryStack()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  MyStack<MyMap_MyEntry<jni.JObject, jni.JObject>> entryStack() =>
-      const $MyStackType(
-              $MyMap_MyEntryType(jni.JObjectType(), jni.JObjectType()))
-          .fromRef(_entryStack(reference).object);
+  MyStack<MyMap_MyEntry<jni.JObject, jni.JObject>> entryStack() {
+    return const $MyStackType(
+            $MyMap_MyEntryType(jni.JObjectType(), jni.JObjectType()))
+        .fromRef(_entryStack(reference).object);
+  }
 }
 
-class $MyMapType<K extends jni.JObject, V extends jni.JObject>
-    extends jni.JObjType<MyMap<K, V>> {
-  final jni.JObjType<K> $K;
-  final jni.JObjType<V> $V;
+class $MyMapType<$K extends jni.JObject, $V extends jni.JObject>
+    extends jni.JObjType<MyMap<$K, $V>> {
+  final jni.JObjType<$K> K;
+  final jni.JObjType<$V> V;
 
   const $MyMapType(
-    this.$K,
-    this.$V,
+    this.K,
+    this.V,
   );
 
   @override
   String get signature => r"Lcom/github/dart_lang/jnigen/generics/MyMap;";
 
   @override
-  MyMap<K, V> fromRef(jni.JObjectPtr ref) => MyMap.fromRef($K, $V, ref);
+  MyMap<$K, $V> fromRef(jni.JObjectPtr ref) => MyMap.fromRef(K, V, ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => Object.hash($MyMapType, K, V);
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $MyMapType &&
+        other is $MyMapType &&
+        K == other.K &&
+        V == other.V;
+  }
 }
 
 /// from: com.github.dart_lang.jnigen.generics.MyMap$MyEntry
-class MyMap_MyEntry<K extends jni.JObject, V extends jni.JObject>
+class MyMap_MyEntry<$K extends jni.JObject, $V extends jni.JObject>
     extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type($K, $V);
+  late final jni.JObjType $type = type(K, V);
 
-  final jni.JObjType<K> $K;
-  final jni.JObjType<V> $V;
+  final jni.JObjType<$K> K;
+  final jni.JObjType<$V> V;
 
   MyMap_MyEntry.fromRef(
-    this.$K,
-    this.$V,
+    this.K,
+    this.V,
     jni.JObjectPtr ref,
   ) : super.fromRef(ref);
 
   /// The type which includes information such as the signature of this class.
-  static $MyMap_MyEntryType<K, V>
-      type<K extends jni.JObject, V extends jni.JObject>(
-    jni.JObjType<K> $K,
-    jni.JObjType<V> $V,
+  static $MyMap_MyEntryType<$K, $V>
+      type<$K extends jni.JObject, $V extends jni.JObject>(
+    jni.JObjType<$K> K,
+    jni.JObjType<$V> V,
   ) {
     return $MyMap_MyEntryType(
-      $K,
-      $V,
+      K,
+      V,
     );
   }
 
@@ -1097,11 +1386,11 @@
 
   /// from: public K key
   /// The returned object must be deleted after use, by calling the `delete` method.
-  K get key => $K.fromRef(_get_key(reference).object);
+  $K get key => K.fromRef(_get_key(reference).object);
 
   /// from: public K key
   /// The returned object must be deleted after use, by calling the `delete` method.
-  set key(K value) => _set_key(reference, value.reference);
+  set key($K value) => _set_key(reference, value.reference);
 
   static final _get_value = jniLookup<
           ffi.NativeFunction<
@@ -1122,11 +1411,11 @@
 
   /// from: public V value
   /// The returned object must be deleted after use, by calling the `delete` method.
-  V get value => $V.fromRef(_get_value(reference).object);
+  $V get value => V.fromRef(_get_value(reference).object);
 
   /// from: public V value
   /// The returned object must be deleted after use, by calling the `delete` method.
-  set value(V value) => _set_value(reference, value.reference);
+  set value($V value) => _set_value(reference, value.reference);
 
   static final _ctor = jniLookup<
           ffi.NativeFunction<
@@ -1138,18 +1427,31 @@
 
   /// from: public void <init>(K key, V value)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  MyMap_MyEntry(this.$K, this.$V, K key, V value)
-      : super.fromRef(_ctor(key.reference, value.reference).object);
+  factory MyMap_MyEntry(
+    $K key,
+    $V value, {
+    jni.JObjType<$K>? K,
+    jni.JObjType<$V>? V,
+  }) {
+    K ??= jni.lowestCommonSuperType([
+      key.$type,
+    ]) as jni.JObjType<$K>;
+    V ??= jni.lowestCommonSuperType([
+      value.$type,
+    ]) as jni.JObjType<$V>;
+    return MyMap_MyEntry.fromRef(
+        K, V, _ctor(key.reference, value.reference).object);
+  }
 }
 
-class $MyMap_MyEntryType<K extends jni.JObject, V extends jni.JObject>
-    extends jni.JObjType<MyMap_MyEntry<K, V>> {
-  final jni.JObjType<K> $K;
-  final jni.JObjType<V> $V;
+class $MyMap_MyEntryType<$K extends jni.JObject, $V extends jni.JObject>
+    extends jni.JObjType<MyMap_MyEntry<$K, $V>> {
+  final jni.JObjType<$K> K;
+  final jni.JObjType<$V> V;
 
   const $MyMap_MyEntryType(
-    this.$K,
-    this.$V,
+    this.K,
+    this.V,
   );
 
   @override
@@ -1157,29 +1459,45 @@
       r"Lcom/github/dart_lang/jnigen/generics/MyMap$MyEntry;";
 
   @override
-  MyMap_MyEntry<K, V> fromRef(jni.JObjectPtr ref) =>
-      MyMap_MyEntry.fromRef($K, $V, ref);
+  MyMap_MyEntry<$K, $V> fromRef(jni.JObjectPtr ref) =>
+      MyMap_MyEntry.fromRef(K, V, ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => Object.hash($MyMap_MyEntryType, K, V);
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $MyMap_MyEntryType &&
+        other is $MyMap_MyEntryType &&
+        K == other.K &&
+        V == other.V;
+  }
 }
 
 /// from: com.github.dart_lang.jnigen.generics.MyStack
-class MyStack<T extends jni.JObject> extends jni.JObject {
-  late final jni.JObjType? _$type;
+class MyStack<$T extends jni.JObject> extends jni.JObject {
   @override
-  jni.JObjType get $type => _$type ??= type($T);
+  late final jni.JObjType $type = type(T);
 
-  final jni.JObjType<T> $T;
+  final jni.JObjType<$T> T;
 
   MyStack.fromRef(
-    this.$T,
+    this.T,
     jni.JObjectPtr ref,
   ) : super.fromRef(ref);
 
   /// The type which includes information such as the signature of this class.
-  static $MyStackType<T> type<T extends jni.JObject>(
-    jni.JObjType<T> $T,
+  static $MyStackType<$T> type<$T extends jni.JObject>(
+    jni.JObjType<$T> T,
   ) {
     return $MyStackType(
-      $T,
+      T,
     );
   }
 
@@ -1189,7 +1507,102 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  MyStack(this.$T) : super.fromRef(_ctor().object);
+  factory MyStack({
+    required jni.JObjType<$T> T,
+  }) {
+    return MyStack.fromRef(T, _ctor().object);
+  }
+
+  static final _fromArray = jniLookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>)>>("MyStack__fromArray")
+      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+
+  /// from: static public com.github.dart_lang.jnigen.generics.MyStack<T> fromArray(T[] arr)
+  /// The returned object must be deleted after use, by calling the `delete` method.
+  static MyStack<$T> fromArray<$T extends jni.JObject>(
+    jni.JArray<$T> arr, {
+    jni.JObjType<$T>? T,
+  }) {
+    T ??= jni.lowestCommonSuperType([
+      ((arr.$type as jni.JArrayType).elementType as jni.JObjType),
+    ]) as jni.JObjType<$T>;
+    return $MyStackType(T).fromRef(_fromArray(arr.reference).object);
+  }
+
+  static final _fromArrayOfArrayOfGrandParents = jniLookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
+          "MyStack__fromArrayOfArrayOfGrandParents")
+      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+
+  /// from: static public com.github.dart_lang.jnigen.generics.MyStack<S> fromArrayOfArrayOfGrandParents(com.github.dart_lang.jnigen.generics.GrandParent<S>[][] arr)
+  /// The returned object must be deleted after use, by calling the `delete` method.
+  static MyStack<$S> fromArrayOfArrayOfGrandParents<$S extends jni.JObject>(
+    jni.JArray<jni.JArray<GrandParent<$S>>> arr, {
+    jni.JObjType<$S>? S,
+  }) {
+    S ??= jni.lowestCommonSuperType([
+      (((((arr.$type as jni.JArrayType).elementType as jni.JObjType)
+                  as jni.JArrayType)
+              .elementType as jni.JObjType) as $GrandParentType)
+          .T,
+    ]) as jni.JObjType<$S>;
+    return $MyStackType(S)
+        .fromRef(_fromArrayOfArrayOfGrandParents(arr.reference).object);
+  }
+
+  static final _of =
+      jniLookup<ffi.NativeFunction<jni.JniResult Function()>>("MyStack__of")
+          .asFunction<jni.JniResult Function()>();
+
+  /// from: static public com.github.dart_lang.jnigen.generics.MyStack<T> of()
+  /// The returned object must be deleted after use, by calling the `delete` method.
+  static MyStack<$T> of<$T extends jni.JObject>({
+    required jni.JObjType<$T> T,
+  }) {
+    return $MyStackType(T).fromRef(_of().object);
+  }
+
+  static final _of1 = jniLookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(ffi.Pointer<ffi.Void>)>>("MyStack__of1")
+      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+
+  /// from: static public com.github.dart_lang.jnigen.generics.MyStack<T> of(T obj)
+  /// The returned object must be deleted after use, by calling the `delete` method.
+  static MyStack<$T> of1<$T extends jni.JObject>(
+    $T obj, {
+    jni.JObjType<$T>? T,
+  }) {
+    T ??= jni.lowestCommonSuperType([
+      obj.$type,
+    ]) as jni.JObjType<$T>;
+    return $MyStackType(T).fromRef(_of1(obj.reference).object);
+  }
+
+  static final _of2 = jniLookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(ffi.Pointer<ffi.Void>,
+                  ffi.Pointer<ffi.Void>)>>("MyStack__of2")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
+
+  /// from: static public com.github.dart_lang.jnigen.generics.MyStack<T> of(T obj, T obj2)
+  /// The returned object must be deleted after use, by calling the `delete` method.
+  static MyStack<$T> of2<$T extends jni.JObject>(
+    $T obj,
+    $T obj2, {
+    jni.JObjType<$T>? T,
+  }) {
+    T ??= jni.lowestCommonSuperType([
+      obj2.$type,
+      obj.$type,
+    ]) as jni.JObjType<$T>;
+    return $MyStackType(T).fromRef(_of2(obj.reference, obj2.reference).object);
+  }
 
   static final _push = jniLookup<
           ffi.NativeFunction<
@@ -1200,7 +1613,11 @@
               ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
 
   /// from: public void push(T item)
-  void push(T item) => _push(reference, item.reference).check();
+  void push(
+    $T item,
+  ) {
+    return _push(reference, item.reference).check();
+  }
 
   static final _pop = jniLookup<
           ffi.NativeFunction<
@@ -1209,42 +1626,69 @@
 
   /// from: public T pop()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  T pop() => $T.fromRef(_pop(reference).object);
+  $T pop() {
+    return T.fromRef(_pop(reference).object);
+  }
+
+  static final _size = jniLookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(ffi.Pointer<ffi.Void>)>>("MyStack__size")
+      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+
+  /// from: public int size()
+  int size() {
+    return _size(reference).integer;
+  }
 }
 
-class $MyStackType<T extends jni.JObject> extends jni.JObjType<MyStack<T>> {
-  final jni.JObjType<T> $T;
+class $MyStackType<$T extends jni.JObject> extends jni.JObjType<MyStack<$T>> {
+  final jni.JObjType<$T> T;
 
   const $MyStackType(
-    this.$T,
+    this.T,
   );
 
   @override
   String get signature => r"Lcom/github/dart_lang/jnigen/generics/MyStack;";
 
   @override
-  MyStack<T> fromRef(jni.JObjectPtr ref) => MyStack.fromRef($T, ref);
+  MyStack<$T> fromRef(jni.JObjectPtr ref) => MyStack.fromRef(T, ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => Object.hash($MyStackType, T);
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $MyStackType &&
+        other is $MyStackType &&
+        T == other.T;
+  }
 }
 
 /// from: com.github.dart_lang.jnigen.generics.StringKeyedMap
-class StringKeyedMap<V extends jni.JObject> extends MyMap<jni.JString, V> {
-  late final jni.JObjType? _$type;
+class StringKeyedMap<$V extends jni.JObject> extends MyMap<jni.JString, $V> {
   @override
-  jni.JObjType get $type => _$type ??= type($V);
+  late final jni.JObjType $type = type(V);
 
-  final jni.JObjType<V> $V;
+  final jni.JObjType<$V> V;
 
   StringKeyedMap.fromRef(
-    this.$V,
+    this.V,
     jni.JObjectPtr ref,
-  ) : super.fromRef(const jni.JStringType(), $V, ref);
+  ) : super.fromRef(const jni.JStringType(), V, ref);
 
   /// The type which includes information such as the signature of this class.
-  static $StringKeyedMapType<V> type<V extends jni.JObject>(
-    jni.JObjType<V> $V,
+  static $StringKeyedMapType<$V> type<$V extends jni.JObject>(
+    jni.JObjType<$V> V,
   ) {
     return $StringKeyedMapType(
-      $V,
+      V,
     );
   }
 
@@ -1254,16 +1698,19 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  StringKeyedMap(this.$V)
-      : super.fromRef(const jni.JStringType(), $V, _ctor().object);
+  factory StringKeyedMap({
+    required jni.JObjType<$V> V,
+  }) {
+    return StringKeyedMap.fromRef(V, _ctor().object);
+  }
 }
 
-class $StringKeyedMapType<V extends jni.JObject>
-    extends jni.JObjType<StringKeyedMap<V>> {
-  final jni.JObjType<V> $V;
+class $StringKeyedMapType<$V extends jni.JObject>
+    extends jni.JObjType<StringKeyedMap<$V>> {
+  final jni.JObjType<$V> V;
 
   const $StringKeyedMapType(
-    this.$V,
+    this.V,
   );
 
   @override
@@ -1271,15 +1718,76 @@
       r"Lcom/github/dart_lang/jnigen/generics/StringKeyedMap;";
 
   @override
-  StringKeyedMap<V> fromRef(jni.JObjectPtr ref) =>
-      StringKeyedMap.fromRef($V, ref);
+  StringKeyedMap<$V> fromRef(jni.JObjectPtr ref) =>
+      StringKeyedMap.fromRef(V, ref);
+
+  @override
+  jni.JObjType get superType => $MyMapType(const jni.JStringType(), V);
+
+  @override
+  final superCount = 2;
+
+  @override
+  int get hashCode => Object.hash($StringKeyedMapType, V);
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $StringKeyedMapType &&
+        other is $StringKeyedMapType &&
+        V == other.V;
+  }
+}
+
+/// from: com.github.dart_lang.jnigen.generics.StringMap
+class StringMap extends StringKeyedMap<jni.JString> {
+  @override
+  late final jni.JObjType $type = type;
+
+  StringMap.fromRef(
+    jni.JObjectPtr ref,
+  ) : super.fromRef(const jni.JStringType(), ref);
+
+  /// The type which includes information such as the signature of this class.
+  static const type = $StringMapType();
+  static final _ctor =
+      jniLookup<ffi.NativeFunction<jni.JniResult Function()>>("StringMap__ctor")
+          .asFunction<jni.JniResult Function()>();
+
+  /// from: public void <init>()
+  /// The returned object must be deleted after use, by calling the `delete` method.
+  factory StringMap() {
+    return StringMap.fromRef(_ctor().object);
+  }
+}
+
+class $StringMapType extends jni.JObjType<StringMap> {
+  const $StringMapType();
+
+  @override
+  String get signature => r"Lcom/github/dart_lang/jnigen/generics/StringMap;";
+
+  @override
+  StringMap fromRef(jni.JObjectPtr ref) => StringMap.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const $StringKeyedMapType(jni.JStringType());
+
+  @override
+  final superCount = 3;
+
+  @override
+  int get hashCode => ($StringMapType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $StringMapType && other is $StringMapType;
+  }
 }
 
 /// from: com.github.dart_lang.jnigen.generics.StringStack
 class StringStack extends MyStack<jni.JString> {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   StringStack.fromRef(
     jni.JObjectPtr ref,
@@ -1293,7 +1801,9 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  StringStack() : super.fromRef(const jni.JStringType(), _ctor().object);
+  factory StringStack() {
+    return StringStack.fromRef(_ctor().object);
+  }
 }
 
 class $StringStackType extends jni.JObjType<StringStack> {
@@ -1304,27 +1814,40 @@
 
   @override
   StringStack fromRef(jni.JObjectPtr ref) => StringStack.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const $MyStackType(jni.JStringType());
+
+  @override
+  final superCount = 2;
+
+  @override
+  int get hashCode => ($StringStackType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $StringStackType && other is $StringStackType;
+  }
 }
 
 /// from: com.github.dart_lang.jnigen.generics.StringValuedMap
-class StringValuedMap<K extends jni.JObject> extends MyMap<K, jni.JString> {
-  late final jni.JObjType? _$type;
+class StringValuedMap<$K extends jni.JObject> extends MyMap<$K, jni.JString> {
   @override
-  jni.JObjType get $type => _$type ??= type($K);
+  late final jni.JObjType $type = type(K);
 
-  final jni.JObjType<K> $K;
+  final jni.JObjType<$K> K;
 
   StringValuedMap.fromRef(
-    this.$K,
+    this.K,
     jni.JObjectPtr ref,
-  ) : super.fromRef($K, const jni.JStringType(), ref);
+  ) : super.fromRef(K, const jni.JStringType(), ref);
 
   /// The type which includes information such as the signature of this class.
-  static $StringValuedMapType<K> type<K extends jni.JObject>(
-    jni.JObjType<K> $K,
+  static $StringValuedMapType<$K> type<$K extends jni.JObject>(
+    jni.JObjType<$K> K,
   ) {
     return $StringValuedMapType(
-      $K,
+      K,
     );
   }
 
@@ -1334,16 +1857,19 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  StringValuedMap(this.$K)
-      : super.fromRef($K, const jni.JStringType(), _ctor().object);
+  factory StringValuedMap({
+    required jni.JObjType<$K> K,
+  }) {
+    return StringValuedMap.fromRef(K, _ctor().object);
+  }
 }
 
-class $StringValuedMapType<K extends jni.JObject>
-    extends jni.JObjType<StringValuedMap<K>> {
-  final jni.JObjType<K> $K;
+class $StringValuedMapType<$K extends jni.JObject>
+    extends jni.JObjType<StringValuedMap<$K>> {
+  final jni.JObjType<$K> K;
 
   const $StringValuedMapType(
-    this.$K,
+    this.K,
   );
 
   @override
@@ -1351,15 +1877,30 @@
       r"Lcom/github/dart_lang/jnigen/generics/StringValuedMap;";
 
   @override
-  StringValuedMap<K> fromRef(jni.JObjectPtr ref) =>
-      StringValuedMap.fromRef($K, ref);
+  StringValuedMap<$K> fromRef(jni.JObjectPtr ref) =>
+      StringValuedMap.fromRef(K, ref);
+
+  @override
+  jni.JObjType get superType => $MyMapType(K, const jni.JStringType());
+
+  @override
+  final superCount = 2;
+
+  @override
+  int get hashCode => Object.hash($StringValuedMapType, K);
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $StringValuedMapType &&
+        other is $StringValuedMapType &&
+        K == other.K;
+  }
 }
 
 /// from: com.github.dart_lang.jnigen.annotations.JsonSerializable$Case
 class JsonSerializable_Case extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   JsonSerializable_Case.fromRef(
     jni.JObjectPtr ref,
@@ -1374,9 +1915,10 @@
 
   /// from: static public com.github.dart_lang.jnigen.annotations.JsonSerializable.Case[] values()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  static jni.JArray<JsonSerializable_Case> values() =>
-      const jni.JArrayType($JsonSerializable_CaseType())
-          .fromRef(_values().object);
+  static jni.JArray<JsonSerializable_Case> values() {
+    return const jni.JArrayType($JsonSerializable_CaseType())
+        .fromRef(_values().object);
+  }
 
   static final _valueOf = jniLookup<
           ffi.NativeFunction<
@@ -1386,9 +1928,12 @@
 
   /// from: static public com.github.dart_lang.jnigen.annotations.JsonSerializable.Case valueOf(java.lang.String name)
   /// The returned object must be deleted after use, by calling the `delete` method.
-  static JsonSerializable_Case valueOf(jni.JString name) =>
-      const $JsonSerializable_CaseType()
-          .fromRef(_valueOf(name.reference).object);
+  static JsonSerializable_Case valueOf(
+    jni.JString name,
+  ) {
+    return const $JsonSerializable_CaseType()
+        .fromRef(_valueOf(name.reference).object);
+  }
 }
 
 class $JsonSerializable_CaseType extends jni.JObjType<JsonSerializable_Case> {
@@ -1401,13 +1946,27 @@
   @override
   JsonSerializable_Case fromRef(jni.JObjectPtr ref) =>
       JsonSerializable_Case.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($JsonSerializable_CaseType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $JsonSerializable_CaseType &&
+        other is $JsonSerializable_CaseType;
+  }
 }
 
 /// from: com.github.dart_lang.jnigen.annotations.MyDataClass
 class MyDataClass extends jni.JObject {
-  late final jni.JObjType? _$type;
   @override
-  jni.JObjType get $type => _$type ??= type;
+  late final jni.JObjType $type = type;
 
   MyDataClass.fromRef(
     jni.JObjectPtr ref,
@@ -1421,7 +1980,9 @@
 
   /// from: public void <init>()
   /// The returned object must be deleted after use, by calling the `delete` method.
-  MyDataClass() : super.fromRef(_ctor().object);
+  factory MyDataClass() {
+    return MyDataClass.fromRef(_ctor().object);
+  }
 }
 
 class $MyDataClassType extends jni.JObjType<MyDataClass> {
@@ -1433,4 +1994,18 @@
 
   @override
   MyDataClass fromRef(jni.JObjectPtr ref) => MyDataClass.fromRef(ref);
+
+  @override
+  jni.JObjType get superType => const jni.JObjectType();
+
+  @override
+  final superCount = 1;
+
+  @override
+  int get hashCode => ($MyDataClassType).hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    return other.runtimeType == $MyDataClassType && other is $MyDataClassType;
+  }
 }
diff --git a/pkgs/jnigen/test/simple_package_test/src/simple_package.c b/pkgs/jnigen/test/simple_package_test/src/simple_package.c
index e5937df..0e85ae9 100644
--- a/pkgs/jnigen/test/simple_package_test/src/simple_package.c
+++ b/pkgs/jnigen/test/simple_package_test/src/simple_package.c
@@ -1102,6 +1102,97 @@
                      .exception = check_exception()};
 }
 
+jmethodID _m_MyStack__fromArray = NULL;
+FFI_PLUGIN_EXPORT
+JniResult MyStack__fromArray(jobject arr) {
+  load_env();
+  load_class_gr(&_c_MyStack, "com/github/dart_lang/jnigen/generics/MyStack");
+  if (_c_MyStack == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  load_static_method(
+      _c_MyStack, &_m_MyStack__fromArray, "fromArray",
+      "([Ljava/lang/Object;)Lcom/github/dart_lang/jnigen/generics/MyStack;");
+  if (_m_MyStack__fromArray == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  jobject _result = (*jniEnv)->CallStaticObjectMethod(
+      jniEnv, _c_MyStack, _m_MyStack__fromArray, arr);
+  return (JniResult){.result = {.l = to_global_ref(_result)},
+                     .exception = check_exception()};
+}
+
+jmethodID _m_MyStack__fromArrayOfArrayOfGrandParents = NULL;
+FFI_PLUGIN_EXPORT
+JniResult MyStack__fromArrayOfArrayOfGrandParents(jobject arr) {
+  load_env();
+  load_class_gr(&_c_MyStack, "com/github/dart_lang/jnigen/generics/MyStack");
+  if (_c_MyStack == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  load_static_method(
+      _c_MyStack, &_m_MyStack__fromArrayOfArrayOfGrandParents,
+      "fromArrayOfArrayOfGrandParents",
+      "([[Lcom/github/dart_lang/jnigen/generics/GrandParent;)Lcom/github/"
+      "dart_lang/jnigen/generics/MyStack;");
+  if (_m_MyStack__fromArrayOfArrayOfGrandParents == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  jobject _result = (*jniEnv)->CallStaticObjectMethod(
+      jniEnv, _c_MyStack, _m_MyStack__fromArrayOfArrayOfGrandParents, arr);
+  return (JniResult){.result = {.l = to_global_ref(_result)},
+                     .exception = check_exception()};
+}
+
+jmethodID _m_MyStack__of = NULL;
+FFI_PLUGIN_EXPORT
+JniResult MyStack__of() {
+  load_env();
+  load_class_gr(&_c_MyStack, "com/github/dart_lang/jnigen/generics/MyStack");
+  if (_c_MyStack == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  load_static_method(_c_MyStack, &_m_MyStack__of, "of",
+                     "()Lcom/github/dart_lang/jnigen/generics/MyStack;");
+  if (_m_MyStack__of == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  jobject _result =
+      (*jniEnv)->CallStaticObjectMethod(jniEnv, _c_MyStack, _m_MyStack__of);
+  return (JniResult){.result = {.l = to_global_ref(_result)},
+                     .exception = check_exception()};
+}
+
+jmethodID _m_MyStack__of1 = NULL;
+FFI_PLUGIN_EXPORT
+JniResult MyStack__of1(jobject obj) {
+  load_env();
+  load_class_gr(&_c_MyStack, "com/github/dart_lang/jnigen/generics/MyStack");
+  if (_c_MyStack == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  load_static_method(
+      _c_MyStack, &_m_MyStack__of1, "of",
+      "(Ljava/lang/Object;)Lcom/github/dart_lang/jnigen/generics/MyStack;");
+  if (_m_MyStack__of1 == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  jobject _result = (*jniEnv)->CallStaticObjectMethod(jniEnv, _c_MyStack,
+                                                      _m_MyStack__of1, obj);
+  return (JniResult){.result = {.l = to_global_ref(_result)},
+                     .exception = check_exception()};
+}
+
+jmethodID _m_MyStack__of2 = NULL;
+FFI_PLUGIN_EXPORT
+JniResult MyStack__of2(jobject obj, jobject obj2) {
+  load_env();
+  load_class_gr(&_c_MyStack, "com/github/dart_lang/jnigen/generics/MyStack");
+  if (_c_MyStack == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  load_static_method(_c_MyStack, &_m_MyStack__of2, "of",
+                     "(Ljava/lang/Object;Ljava/lang/Object;)Lcom/github/"
+                     "dart_lang/jnigen/generics/MyStack;");
+  if (_m_MyStack__of2 == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  jobject _result = (*jniEnv)->CallStaticObjectMethod(
+      jniEnv, _c_MyStack, _m_MyStack__of2, obj, obj2);
+  return (JniResult){.result = {.l = to_global_ref(_result)},
+                     .exception = check_exception()};
+}
+
 jmethodID _m_MyStack__push = NULL;
 FFI_PLUGIN_EXPORT
 JniResult MyStack__push(jobject self_, jobject item) {
@@ -1131,6 +1222,20 @@
                      .exception = check_exception()};
 }
 
+jmethodID _m_MyStack__size = NULL;
+FFI_PLUGIN_EXPORT
+JniResult MyStack__size(jobject self_) {
+  load_env();
+  load_class_gr(&_c_MyStack, "com/github/dart_lang/jnigen/generics/MyStack");
+  if (_c_MyStack == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  load_method(_c_MyStack, &_m_MyStack__size, "size", "()I");
+  if (_m_MyStack__size == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  int32_t _result = (*jniEnv)->CallIntMethod(jniEnv, self_, _m_MyStack__size);
+  return (JniResult){.result = {.i = _result}, .exception = check_exception()};
+}
+
 // com.github.dart_lang.jnigen.generics.StringKeyedMap
 jclass _c_StringKeyedMap = NULL;
 
@@ -1151,6 +1256,26 @@
                      .exception = check_exception()};
 }
 
+// com.github.dart_lang.jnigen.generics.StringMap
+jclass _c_StringMap = NULL;
+
+jmethodID _m_StringMap__ctor = NULL;
+FFI_PLUGIN_EXPORT
+JniResult StringMap__ctor() {
+  load_env();
+  load_class_gr(&_c_StringMap,
+                "com/github/dart_lang/jnigen/generics/StringMap");
+  if (_c_StringMap == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  load_method(_c_StringMap, &_m_StringMap__ctor, "<init>", "()V");
+  if (_m_StringMap__ctor == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  jobject _result =
+      (*jniEnv)->NewObject(jniEnv, _c_StringMap, _m_StringMap__ctor);
+  return (JniResult){.result = {.l = to_global_ref(_result)},
+                     .exception = check_exception()};
+}
+
 // com.github.dart_lang.jnigen.generics.StringStack
 jclass _c_StringStack = NULL;
 
