Language and type utilities with reflection helpers for dynamic operations.
Add this dependency to your build.gradle:
dependencies {
implementation 'io.seqera:lib-lang:1.0.0'
}Runtime generic type resolution from superclass using getGenericType:
import io.seqera.lang.type.TypeHelper
// Generic base class that needs to know its type parameter at runtime
abstract class GenericProcessor<T> {
protected void processData() {
final type = TypeHelper.getGenericType(this, 0) // Get the first generic type parameter
log.debug "Processing data of type: ${type.simpleName}"
// Use the resolved type for operations...
}
}
// Concrete implementations
class StringProcessor extends GenericProcessor<String> {
// TypeHelper.getGenericType(this, 0) returns String.class at runtime
}
class DataProcessor extends GenericProcessor<CustomData> {
// TypeHelper.getGenericType(this, 0) returns CustomData.class at runtime
}Resolve generic type arguments from implemented interfaces using getInterfaceTypeArguments:
import io.seqera.lang.type.TypeHelper
interface Handler<P, R> {
R handle(P params)
}
class StringToIntHandler implements Handler<String, Integer> {
Integer handle(String params) { params.length() }
}
// Get the type arguments for the Handler interface
Type[] types = TypeHelper.getInterfaceTypeArguments(StringToIntHandler, Handler)
// types[0] = String.class (params type)
// types[1] = Integer.class (result type)Extract the raw Class from a Type, handling both Class and ParameterizedType:
import io.seqera.lang.type.TypeHelper
Type[] types = TypeHelper.getInterfaceTypeArguments(MyHandler, Handler)
Class<?> paramsClass = TypeHelper.getRawType(types[0]) // Works with Class or ParameterizedType./gradlew :lib-lang:test