Skip to content

Commit

Permalink
Fix getObjectOrNullUntilSuperclass and setObjectUntilSuperclass (#56)
Browse files Browse the repository at this point in the history
YifePlayte authored Jun 7, 2023
1 parent d535f7e commit cab52d9
Showing 2 changed files with 32 additions and 2 deletions.
4 changes: 4 additions & 0 deletions EzXHelper/api/EzXHelper.api
Original file line number Diff line number Diff line change
@@ -377,6 +377,8 @@ public final class com/github/kyuubiran/ezxhelper/ObjectHelper$Companion {
public final class com/github/kyuubiran/ezxhelper/ObjectUtils {
public static final field INSTANCE Lcom/github/kyuubiran/ezxhelper/ObjectUtils;
public static final fun getObjectOrNull (Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
public static final fun getObjectOrNull (Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object;
public static synthetic fun getObjectOrNull$default (Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;ILjava/lang/Object;)Ljava/lang/Object;
public static final fun getObjectOrNullAs (Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
public static final fun getObjectOrNullUntilSuperclass (Ljava/lang/Object;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
public static synthetic fun getObjectOrNullUntilSuperclass$default (Ljava/lang/Object;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object;
@@ -387,6 +389,8 @@ public final class com/github/kyuubiran/ezxhelper/ObjectUtils {
public static final fun invokeMethodBestMatch (Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;[Ljava/lang/Object;)Ljava/lang/Object;
public static synthetic fun invokeMethodBestMatch$default (Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;[Ljava/lang/Object;ILjava/lang/Object;)Ljava/lang/Object;
public static final fun setObject (Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V
public static final fun setObject (Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Class;)V
public static synthetic fun setObject$default (Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Class;ILjava/lang/Object;)V
public static final fun setObjectUntilSuperclass (Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V
public static synthetic fun setObjectUntilSuperclass$default (Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
}
Original file line number Diff line number Diff line change
@@ -18,6 +18,20 @@ object ObjectUtils {
@Throws(NoSuchFieldException::class)
fun getObjectOrNull(obj: Any, fieldName: String): Any? = obj::class.java.getDeclaredField(fieldName).also { it.isAccessible = true }.get(obj)

/**
* Get the field object by the name in the object.
* @param obj object
* @param fieldName field name
* @param clazz class where the field is declared (optional, defaults to the class of 'obj')
* @return field object or null
* @throws NoSuchFieldException if the field is not found
* @sample com.example.sample.getObjectOrNull
*/
@JvmStatic
@Throws(NoSuchFieldException::class)
fun getObjectOrNull(obj: Any, fieldName: String, clazz: Class<*>? = null): Any? =
(clazz ?: obj::class.java).getDeclaredField(fieldName).also { it.isAccessible = true }.get(obj)

/**
* Get the field object by the name in the object.
* @param obj object
@@ -34,7 +48,7 @@ object ObjectUtils {
if (untilSuperClass?.invoke(clazz) == true) break

try {
return getObjectOrNull(obj, fieldName)
return getObjectOrNull(obj, fieldName, clazz)
} catch (e: NoSuchFieldException) {
clazz = clazz.superclass
}
@@ -79,6 +93,18 @@ object ObjectUtils {
fun setObject(obj: Any, fieldName: String, value: Any?) =
obj::class.java.getDeclaredField(fieldName).also { it.isAccessible = true }.set(obj, value)

/**
* Set the field object by the name in the object.
* @param obj object
* @param fieldName field name
* @param clazz class where the field is declared (optional, defaults to the class of 'obj')
* @throws NoSuchFieldException if the field is not found
*/
@JvmStatic
@Throws(NoSuchFieldException::class)
fun setObject(obj: Any, fieldName: String, value: Any?, clazz: Class<*>? = null) =
(clazz ?: obj::class.java).getDeclaredField(fieldName).also { it.isAccessible = true }.set(obj, value)

/**
* Set the field object by the name in the object.
* @param obj object
@@ -94,7 +120,7 @@ object ObjectUtils {
if (untilSuperClass?.invoke(clazz) == true) break

try {
return setObject(obj, fieldName, value)
return setObject(obj, fieldName, value, clazz)
} catch (e: NoSuchFieldException) {
clazz = clazz.superclass
}

0 comments on commit cab52d9

Please sign in to comment.