From 5f6cf3888ce525b3feab4deda85871414d5df885 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=91=E6=88=9F?= Date: Mon, 26 Apr 2021 08:30:57 +0800 Subject: [PATCH] static final field is not assignable during runtime --- .../testable/agent/handler/OmniClassHandler.java | 3 ++- .../testable/core/model/ConstructionOption.java | 3 +++ .../alibaba/testable/core/tool/OmniConstructor.java | 10 ++++++++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/testable-agent/src/main/java/com/alibaba/testable/agent/handler/OmniClassHandler.java b/testable-agent/src/main/java/com/alibaba/testable/agent/handler/OmniClassHandler.java index d65a68c..787321d 100644 --- a/testable-agent/src/main/java/com/alibaba/testable/agent/handler/OmniClassHandler.java +++ b/testable-agent/src/main/java/com/alibaba/testable/agent/handler/OmniClassHandler.java @@ -27,12 +27,13 @@ public class OmniClassHandler extends BaseClassHandler { private static final String ENABLE_CONFIGURATION = "Lorg/springframework/context/annotation/Configuration;"; private static final String CLASS_ABSTRACT_COLLECTION = "java/util/AbstractCollection"; private static final String CLASS_NUMBER = "java/lang/Number"; + private static final String CLASS_HASH_SET = "java/util/HashSet"; private static final String[] JUNIT_TEST_ANNOTATIONS = new String[] { JUnit4Framework.ANNOTATION_TEST, JUnit5Framework.ANNOTATION_TEST, JUnit5Framework.ANNOTATION_PARAMETERIZED_TEST }; private static final String[] UNREACHABLE_CLASSES = new String[] { - CLASS_ABSTRACT_COLLECTION, CLASS_NUMBER + CLASS_ABSTRACT_COLLECTION, CLASS_NUMBER, CLASS_HASH_SET }; @Override diff --git a/testable-core/src/main/java/com/alibaba/testable/core/model/ConstructionOption.java b/testable-core/src/main/java/com/alibaba/testable/core/model/ConstructionOption.java index c0b7dc8..3bb623f 100644 --- a/testable-core/src/main/java/com/alibaba/testable/core/model/ConstructionOption.java +++ b/testable-core/src/main/java/com/alibaba/testable/core/model/ConstructionOption.java @@ -2,6 +2,9 @@ package com.alibaba.testable.core.model; public enum ConstructionOption { + /** + * allow members with same type nested inside itself be initialized as null + */ ALLOW_NULL_FOR_NESTED_TYPE } diff --git a/testable-core/src/main/java/com/alibaba/testable/core/tool/OmniConstructor.java b/testable-core/src/main/java/com/alibaba/testable/core/tool/OmniConstructor.java index 9686df7..9449ecd 100644 --- a/testable-core/src/main/java/com/alibaba/testable/core/tool/OmniConstructor.java +++ b/testable-core/src/main/java/com/alibaba/testable/core/tool/OmniConstructor.java @@ -60,6 +60,8 @@ public class OmniConstructor { try { if (clazz.isPrimitive()) { return newPrimitive(clazz); + } else if (clazz.equals(Class.class)) { + return (T)Object.class; } else if (clazz.isArray()) { return (T)newArray(clazz.getComponentType(), 0, classPool); } else if (clazz.isEnum()) { @@ -176,8 +178,8 @@ public class OmniConstructor { LogUtil.verbose(classPool.size(), "Verifying %s", type.getName()); classPool.put(type, instance); for (Field f : TypeUtil.getAllFields(type)) { - if (f.getName().startsWith("$")) { - // skip fields e.g. "$jacocoData" + if (f.getName().startsWith("$") || isStaticFinalField(f)) { + // skip static-final fields and fields e.g. "$jacocoData" continue; } f.setAccessible(true); @@ -201,6 +203,10 @@ public class OmniConstructor { classPool.remove(type); } + private static boolean isStaticFinalField(Field field) { + return Modifier.isFinal(field.getModifiers()) && Modifier.isStatic(field.getModifiers()); + } + private static void handleCircleReferenceOfArrayField(Object instance, Class type, Map, Object> classPool) throws IllegalAccessException { if (type.isArray()) {