Skip to content

Commit

Permalink
Restricts access to vintage reflection classes
Browse files Browse the repository at this point in the history
  • Loading branch information
jqno committed Sep 16, 2024
1 parent 673c6ee commit 29481ba
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import java.lang.reflect.Field;
import java.util.Objects;
import nl.jqno.equalsverifier.internal.reflection.FieldIterable;
import nl.jqno.equalsverifier.internal.reflection.vintage.FieldAccessor;
import nl.jqno.equalsverifier.internal.reflection.FieldProbe;

public final class Util {

Expand Down Expand Up @@ -57,7 +57,7 @@ public static int defaultHashCode(Object x) {
}

private static boolean isRelevant(Field f) {
return FieldAccessor.of(f).canBeModifiedReflectively();
return FieldProbe.of(f).canBeModifiedReflectively();
}

public static void coverThePrivateConstructor(Class<?> type) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import java.lang.reflect.Field;
import java.util.regex.Matcher;
import nl.jqno.equalsverifier.internal.reflection.FieldIterable;
import nl.jqno.equalsverifier.internal.reflection.vintage.ObjectAccessor;
import nl.jqno.equalsverifier.internal.reflection.FieldProbe;

/**
* Formats a string with the contents of one or more objects.
Expand Down Expand Up @@ -83,9 +83,7 @@ private String stringify(Object obj) {

private String stringifyByReflection(Object obj) {
StringBuilder result = new StringBuilder();

Class<?> type = obj.getClass();
ObjectAccessor<?> accessor = ObjectAccessor.of(obj);

result.append("[");
String typeName = type.getSimpleName().replaceAll("\\$\\$DynamicSubclass.*", "");
Expand All @@ -98,7 +96,9 @@ private String stringifyByReflection(Object obj) {
result.append(" ");
result.append(fieldName);
result.append("=");
Object value = accessor.getField(field);

FieldProbe probe = FieldProbe.of(field);
Object value = probe.getValue(obj);
result.append(stringify(value));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,36 @@
import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.lang.ArchRule;
import nl.jqno.equalsverifier.internal.reflection.instantiation.VintageSubjectCreator;
import nl.jqno.equalsverifier.internal.reflection.instantiation.VintageValueProvider;
import nl.jqno.equalsverifier.internal.reflection.vintage.ClassAccessor;
import nl.jqno.equalsverifier.internal.reflection.vintage.FieldAccessor;
import nl.jqno.equalsverifier.internal.reflection.vintage.FieldModifier;
import nl.jqno.equalsverifier.internal.reflection.vintage.ObjectAccessor;
import nl.jqno.equalsverifier.internal.reflection.vintage.PrefabValues;
import nl.jqno.equalsverifier.internal.util.Context;
import nl.jqno.equalsverifier.internal.util.PrefabValuesApi;

@AnalyzeClasses(packages = "nl.jqno.equalsverifier")
public final class ArchitectureTest {

@ArchTest
public static final ArchRule ONLY_VINTAGE_INSTANTIATORS_CAN_USE_VINTAGE_REFLECTION = noClasses()
.that()
.doNotBelongToAnyOf(
VintageSubjectCreator.class,
VintageValueProvider.class,
Context.class,
PrefabValuesApi.class
)
.and()
.resideOutsideOfPackage("nl.jqno.equalsverifier.internal.reflection.vintage..")
.and()
.resideOutsideOfPackage("nl.jqno.equalsverifier.internal.prefabvalues..")
.should()
.accessClassesThat()
.resideInAPackage("nl.jqno.equalsverifier.internal.reflection.vintage..");

@ArchTest
public static final ArchRule DONT_USE_VINTAGE_REFLECTION_DIRECTLY = noClasses()
.that()
Expand Down

0 comments on commit 29481ba

Please sign in to comment.