|
|
@@ -16,18 +16,33 @@ import java.util.function.IntFunction;
|
|
|
import java.util.stream.Stream;
|
|
|
import java.util.stream.StreamSupport;
|
|
|
|
|
|
+/**
|
|
|
+ * Non-portable class for accessing JVM constant pool.
|
|
|
+ *
|
|
|
+ * We use {@code jdk.internal.reflect.ConstantPool.ConstantPool}
|
|
|
+ * retrieved by native method {@code Class#getConstantPool()}
|
|
|
+ * Retrieved object is converted to interface-compatible form using AdapterFactory.
|
|
|
+ */
|
|
|
@UtilityClass
|
|
|
public class CPInspector {
|
|
|
|
|
|
+ /**
|
|
|
+ * Returns constant pool for specified class
|
|
|
+ * It returns well-defined interface, hiding the fact, that different JVM versions can return different objects.
|
|
|
+ *
|
|
|
+ * @param type class to inspect
|
|
|
+ * @return constant pool accessor
|
|
|
+ */
|
|
|
@Meta.UnstableAPI
|
|
|
public static ConstantAdapter11 getConstantPool(Class<?> type) {
|
|
|
return AdapterFactory.getSystem().cast(Li.ADAPTER, MethodUtils.$invoke(Li.GET_CONSTANT_POOL, type));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * Inspects constant pool to return all methods referenced inside class
|
|
|
*
|
|
|
- * @param clazz
|
|
|
- * @return all methods referenced in class' bytecode
|
|
|
+ * @param clazz clazz
|
|
|
+ * @return methods
|
|
|
*/
|
|
|
@Meta.UnstableAPI
|
|
|
public static Stream<Method> getMethods(Class<?> clazz) {
|
|
|
@@ -37,6 +52,13 @@ public class CPInspector {
|
|
|
.map(m -> (Method)m);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Inspects constant pool to return all constructors of given class
|
|
|
+ *
|
|
|
+ * @param clazz clazz
|
|
|
+ * @param <T> clazz
|
|
|
+ * @return constructors
|
|
|
+ */
|
|
|
@SuppressWarnings("unchecked")
|
|
|
@Meta.UnstableAPI
|
|
|
public static <T> Stream<Constructor<T>> getConstructors(Class<T> clazz) {
|
|
|
@@ -47,9 +69,10 @@ public class CPInspector {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * Inspects constant pool to return all fields referenced in given class
|
|
|
*
|
|
|
- * @param clazz
|
|
|
- * @return fields referenced in class' bytecode
|
|
|
+ * @param clazz clazz
|
|
|
+ * @return fields
|
|
|
*/
|
|
|
@Meta.UnstableAPI
|
|
|
public static Stream<Field> getFields(Class<?> clazz) {
|
|
|
@@ -58,9 +81,10 @@ public class CPInspector {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * Inspects constant pool to return all types referenced in given class
|
|
|
*
|
|
|
- * @param clazz
|
|
|
- * @return types referenced in class' bytecode
|
|
|
+ * @param clazz clazz
|
|
|
+ * @return types
|
|
|
*/
|
|
|
@Meta.UnstableAPI
|
|
|
public static Stream<Class<?>> getClasses(Class<?> clazz) {
|
|
|
@@ -69,9 +93,10 @@ public class CPInspector {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * Inspects constant pool to return all string constants referenced in given class
|
|
|
*
|
|
|
- * @param clazz
|
|
|
- * @return string constants referenced in class' bytecode
|
|
|
+ * @param clazz clazz
|
|
|
+ * @return string constants
|
|
|
*/
|
|
|
@Meta.UnstableAPI
|
|
|
public static Stream<String> getStrings(Class<?> clazz) {
|
|
|
@@ -79,6 +104,11 @@ public class CPInspector {
|
|
|
return StreamSupport.stream(new CPSpliterator<>(cp.getSize(), cp::getUTF8At), false);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * ConstanPool interface defined in JDK8.
|
|
|
+ * See: jdk.internal.reflect.ConstantPool
|
|
|
+ */
|
|
|
+ @SuppressWarnings("MissingJavadoc")
|
|
|
public interface ConstantAdapter {
|
|
|
|
|
|
int getSize();
|
|
|
@@ -111,6 +141,11 @@ public class CPInspector {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * ConstanPool interface defined in JDK11.
|
|
|
+ * See: jdk.internal.reflect.ConstantPool
|
|
|
+ */
|
|
|
+ @SuppressWarnings("MissingJavadoc")
|
|
|
public interface ConstantAdapter11 extends ConstantAdapter {
|
|
|
int getClassRefIndexAt(int index);
|
|
|
|