This is an automated email from the ASF dual-hosted git repository.

garydgregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-lang.git


The following commit(s) were added to refs/heads/master by this push:
     new b353b3106 Make object accessibility optional (#1558)
b353b3106 is described below

commit b353b31066b0f0626fcc743039161b2f2be63a1f
Author: Gary Gregory <[email protected]>
AuthorDate: Sun May 10 18:15:11 2026 -0400

    Make object accessibility optional (#1558)
---
 .../commons/lang3/builder/AbstractReflection.java  | 171 +++++++++++++++++++++
 .../commons/lang3/builder/CompareToBuilder.java    |  56 +++++--
 .../commons/lang3/builder/EqualsBuilder.java       |  60 ++++++--
 .../commons/lang3/builder/HashCodeBuilder.java     |  82 ++++++++--
 .../lang3/builder/ReflectionToStringBuilder.java   |   5 +-
 .../commons/lang3/builder/ToStringBuilder.java     |  91 +++++++++--
 .../org/apache/commons/lang3/AbstractLangTest.java |   2 +-
 .../commons/lang3/builder/AbstractBuilderTest.java |  62 ++++++++
 ...ummaryTest.java => AbstractReflectionTest.java} |  26 +---
 ...yTest.java => CompareToBuilderNoForceTest.java} |  28 ++--
 .../lang3/builder/CompareToBuilderTest.java        |  47 +++---
 ...ummaryTest.java => DiffBuilderNoForceTest.java} |  28 ++--
 .../commons/lang3/builder/DiffBuilderTest.java     |   5 +-
 .../lang3/builder/EqualsBuilderNoForceTest.java    |  44 ++++++
 ...uilderReflectJreImplementationNoForceTest.java} |  26 +---
 .../EqualsBuilderReflectJreImplementationTest.java |  13 +-
 .../commons/lang3/builder/EqualsBuilderTest.java   |  61 ++++----
 ...Test.java => JsonToStringStyleNoForceTest.java} |  26 +---
 .../lang3/builder/JsonToStringStyleTest.java       |  14 +-
 ...ultilineRecursiveToStringStyleNoForceTest.java} |  26 +---
 .../MultilineRecursiveToStringStyleTest.java       |  27 ++--
 ...java => RecursiveToStringStyleNoForceTest.java} |  26 +---
 .../lang3/builder/RecursiveToStringStyleTest.java  |   9 +-
 ...ingBuilderCustomImplementationNoForceTest.java} |  26 +---
 ...ionToStringBuilderCustomImplementationTest.java |  10 +-
 ...flectionToStringBuilderExcludeNoForceTest.java} |  26 +---
 ...StringBuilderExcludeNullValuesNoForceTest.java} |  26 +---
 ...ectionToStringBuilderExcludeNullValuesTest.java |  19 ++-
 .../ReflectionToStringBuilderExcludeTest.java      |   7 +-
 ...ngBuilderExcludeWithAnnotationNoForceTest.java} |  26 +---
 ...onToStringBuilderExcludeWithAnnotationTest.java |   5 +-
 ...flectionToStringBuilderIncludeNoForceTest.java} |  26 +---
 .../ReflectionToStringBuilderIncludeTest.java      |   5 +-
 ...flectionToStringBuilderSummaryNoForceTest.java} |  26 +---
 .../ReflectionToStringBuilderSummaryTest.java      |   8 +-
 ...ryTest.java => ToStringBuilderNoForceTest.java} |  26 +---
 .../commons/lang3/builder/ToStringBuilderTest.java |  89 ++++++-----
 37 files changed, 785 insertions(+), 475 deletions(-)

diff --git 
a/src/main/java/org/apache/commons/lang3/builder/AbstractReflection.java 
b/src/main/java/org/apache/commons/lang3/builder/AbstractReflection.java
new file mode 100644
index 000000000..368dc26f6
--- /dev/null
+++ b/src/main/java/org/apache/commons/lang3/builder/AbstractReflection.java
@@ -0,0 +1,171 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.lang3.builder;
+
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.Field;
+import java.util.function.Supplier;
+
+import org.apache.commons.lang3.SystemProperties;
+
+/**
+ * Abstracts reflection access for reflection-based classes in this package.
+ * <p>
+ * See {@link AbstractBuilder#setForceAccessible(boolean)} for details.
+ * </p>
+ *
+ * @since 3.21.0
+ * @see AbstractBuilder#setForceAccessible(boolean)
+ * @see AccessibleObject#setAccessible(boolean)
+ */
+public abstract class AbstractReflection {
+
+    /**
+     * Builds an instance of a subclass of {@link AbstractReflection}.
+     *
+     * @param <B> An AbstractBuilder subclass.
+     */
+    public abstract static class AbstractBuilder<B extends AbstractBuilder<B>> 
implements Supplier<AbstractReflection> {
+
+        /**
+         * Whether the {@link AbstractReflection} subclass will call {@link 
AccessibleObject#setAccessible(boolean) AccessibleObject#setAccessible(true)} on
+         * inaccessible fields.
+         */
+        private boolean forceAccessible = getForceAccessible();
+
+        /**
+         * Constructs a new instance for a subclass.
+         */
+        AbstractBuilder() {
+            // Empty.
+        }
+
+        /**
+         * Returns {@code this} instance typed as its subclass.
+         *
+         * @return {@code this} instance typed as its subclass.
+         */
+        @SuppressWarnings("unchecked")
+        protected B asThis() {
+            return (B) this;
+        }
+
+        /**
+         * Whether the {@link AbstractReflection} subclass will call {@link 
AccessibleObject#setAccessible(boolean) AccessibleObject#setAccessible(true)} on
+         * inaccessible fields.
+         * <p>
+         * In general, controls whether the instances built by this builder 
will force the accessible flag for reflection.
+         * </p>
+         * <p>
+         * Defaults to {@code getForceAccessible()}, which defaults to true 
for compatibility.
+         * </p>
+         * <p>
+         * This default is read from the system property {@code 
"AbstractReflection.forceAccessible"}, which defaults to true for compatibility.
+         * </p>
+         * <p>
+         * The parsing rules are as {@link Boolean#parseBoolean(String)}.
+         * </p>
+         * <p>
+         * See subclassses for specific behavior.
+         * </p>
+         *
+         * @param forceAccessible Whether to force accessibility by calling 
{@link AccessibleObject#setAccessible(boolean)
+         *                        AccessibleObject#setAccessible(true)}.
+         * @return {@code this} instance.
+         * @see AccessibleObject#setAccessible(boolean)
+         */
+        public B setForceAccessible(final boolean forceAccessible) {
+            this.forceAccessible = forceAccessible;
+            return asThis();
+        }
+    }
+
+    /**
+     * Tests whether the system property {@code 
"AbstractReflection.forceAccessible"} is set to true.
+     * <p>
+     * The parsing rules are as {@link Boolean#parseBoolean(String)}.
+     * </p>
+     * <p>
+     * If the property is not set, return true.
+     * </p>
+     *
+     * @return whether the system property {@code 
"AbstractReflection.forceAccessible"} is set to true with true as the default.
+     * @see Boolean#parseBoolean(String)
+     */
+    static boolean getForceAccessible() {
+        return SystemProperties.getBoolean(AbstractReflection.class, 
"forceAccessible", () -> true);
+    }
+
+    /**
+     * If {@code forceAccessible} flag is true, each field in the given array 
is made accessible by calling {@link AccessibleObject#setAccessible(boolean)
+     * AccessibleObject#setAccessible(true)} but <em>only</em> if a field is 
not already accessible.
+     *
+     * @param forceAccessible Whether to call {@link 
AccessibleObject#setAccessible(boolean)} if a field is not already accessible.
+     * @param fields          The fields to set.
+     * @throws SecurityException Thrown if {@code forceAccessible} flag is 
true and the request is denied.
+     * @see AccessibleObject#setAccessible(boolean)
+     * @see SecurityManager#checkPermission
+     */
+    static void setAccessible(final boolean forceAccessible, final Field... 
fields) {
+        if (forceAccessible) {
+            for (final Field field : fields) {
+                // Test to avoid the permission check if there is a security 
manager.
+                if (field != null && !field.isAccessible()) {
+                    field.setAccessible(true);
+                }
+            }
+        }
+    }
+
+    /**
+     * Whether to call {@link AccessibleObject#setAccessible(boolean) 
AccessibleObject#setAccessible(true)} on inaccessible fields.
+     */
+    private final boolean forceAccessible;
+
+    /**
+     * Constructs a new instance.
+     *
+     * @param <T>     The type to build.
+     * @param builder The builder.
+     */
+    <T extends AbstractBuilder<T>> AbstractReflection(final AbstractBuilder<T> 
builder) {
+        this.forceAccessible = builder.forceAccessible;
+    }
+
+    /**
+     * Tests whether fields should be made accessible with {@link 
AccessibleObject#setAccessible(boolean)}.
+     *
+     * @return whether fields should be made accessible with {@link 
AccessibleObject#setAccessible(boolean)}.
+     */
+    protected boolean isForceAccessible() {
+        return forceAccessible;
+    }
+
+    /**
+     * If {@code forceAccessible} flag is true, each field in the given array 
is made accessible by calling {@link AccessibleObject#setAccessible(boolean)
+     * AccessibleObject#setAccessible(true)} but <em>only</em> if a field is 
not already accessible.
+     *
+     * @param fields The fields to set.
+     * @throws SecurityException Thrown if {@code forceAccessible} flag is 
true and the request is denied.
+     * @see AccessibleObject#setAccessible(boolean)
+     * @see SecurityManager#checkPermission
+     */
+    void setAccessible(final Field... fields) {
+        setAccessible(isForceAccessible(), fields);
+    }
+}
diff --git 
a/src/main/java/org/apache/commons/lang3/builder/CompareToBuilder.java 
b/src/main/java/org/apache/commons/lang3/builder/CompareToBuilder.java
index 9a3b419ab..512b6b33a 100644
--- a/src/main/java/org/apache/commons/lang3/builder/CompareToBuilder.java
+++ b/src/main/java/org/apache/commons/lang3/builder/CompareToBuilder.java
@@ -16,7 +16,6 @@
  */
 package org.apache.commons.lang3.builder;
 
-import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.util.Collection;
@@ -94,7 +93,35 @@
  * @see HashCodeBuilder
  * @since 1.0
  */
-public class CompareToBuilder implements Builder<Integer> {
+public class CompareToBuilder extends AbstractReflection implements 
Builder<Integer> {
+
+    /**
+     * Builds instances of CompareToBuilder.
+     */
+    public static class Builder extends AbstractBuilder<Builder> {
+
+        /**
+         * Constructs a new Builder instance.
+         */
+        private Builder() {
+            // empty
+        }
+
+        @Override
+        public CompareToBuilder get() {
+            return new CompareToBuilder(this);
+        }
+
+    }
+
+    /**
+     * Constructs a new Builder.
+     *
+     * @return a new Builder.
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
 
     /**
      * Appends to {@code builder} the comparison of {@code lhs}
@@ -106,6 +133,7 @@ public class CompareToBuilder implements Builder<Integer> {
      * @param builder  {@link CompareToBuilder} to append to
      * @param useTransients  whether to compare transient fields
      * @param excludeFields  fields to exclude
+     * @param forceAccessible Whether to set fields' accessible flags
      */
     private static void reflectionAppend(
         final Object lhs,
@@ -113,16 +141,19 @@ private static void reflectionAppend(
         final Class<?> clazz,
         final CompareToBuilder builder,
         final boolean useTransients,
-        final String[] excludeFields) {
+        final String[] excludeFields,
+        final boolean forceAccessible) {
 
         final Field[] fields = clazz.getDeclaredFields();
-        AccessibleObject.setAccessible(fields, true);
+        setAccessible(forceAccessible, fields);
         for (int i = 0; i < fields.length && builder.comparison == 0; i++) {
             final Field field = fields[i];
-            if (!ArrayUtils.contains(excludeFields, field.getName())
-                && !field.getName().contains("$")
+            final String name = field.getName();
+            if (!ArrayUtils.contains(excludeFields, name)
+                && !name.contains("$")
                 && (useTransients || 
!Modifier.isTransient(field.getModifiers()))
-                && !Modifier.isStatic(field.getModifiers())) {
+                && !Modifier.isStatic(field.getModifiers())
+                && field.isAccessible()) {
                 // IllegalAccessException can't happen. Would get a Security 
exception instead.
                 // Throw a runtime exception in case the impossible happens.
                 builder.append(Reflection.getUnchecked(field, lhs), 
Reflection.getUnchecked(field, rhs));
@@ -230,22 +261,20 @@ public static int reflectionCompare(
         final boolean compareTransients,
         final Class<?> reflectUpToClass,
         final String... excludeFields) {
-
         if (lhs == rhs) {
             return 0;
         }
         Objects.requireNonNull(lhs, "lhs");
         Objects.requireNonNull(rhs, "rhs");
-
         Class<?> lhsClazz = lhs.getClass();
         if (!lhsClazz.isInstance(rhs)) {
             throw new ClassCastException();
         }
         final CompareToBuilder compareToBuilder = new CompareToBuilder();
-        reflectionAppend(lhs, rhs, lhsClazz, compareToBuilder, 
compareTransients, excludeFields);
+        reflectionAppend(lhs, rhs, lhsClazz, compareToBuilder, 
compareTransients, excludeFields, AbstractReflection.getForceAccessible());
         while (lhsClazz.getSuperclass() != null && lhsClazz != 
reflectUpToClass) {
             lhsClazz = lhsClazz.getSuperclass();
-            reflectionAppend(lhs, rhs, lhsClazz, compareToBuilder, 
compareTransients, excludeFields);
+            reflectionAppend(lhs, rhs, lhsClazz, compareToBuilder, 
compareTransients, excludeFields, AbstractReflection.getForceAccessible());
         }
         return compareToBuilder.toComparison();
     }
@@ -329,9 +358,14 @@ public static int reflectionCompare(final Object lhs, 
final Object rhs, final St
      * {@link #toComparison} to get the result.</p>
      */
     public CompareToBuilder() {
+        super(builder());
         comparison = 0;
     }
 
+    private CompareToBuilder(final Builder builder) {
+        super(builder);
+    }
+
     /**
      * Appends to the {@code builder} the comparison of
      * two {@code booleans}s.
diff --git a/src/main/java/org/apache/commons/lang3/builder/EqualsBuilder.java 
b/src/main/java/org/apache/commons/lang3/builder/EqualsBuilder.java
index d4bbdf558..04de844bf 100644
--- a/src/main/java/org/apache/commons/lang3/builder/EqualsBuilder.java
+++ b/src/main/java/org/apache/commons/lang3/builder/EqualsBuilder.java
@@ -16,7 +16,6 @@
  */
 package org.apache.commons.lang3.builder;
 
-import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
@@ -86,7 +85,35 @@
  *
  * @since 1.0
  */
-public class EqualsBuilder implements Builder<Boolean> {
+public class EqualsBuilder extends AbstractReflection implements 
Builder<Boolean> {
+
+    /**
+     * Builds instances of CompareToBuilder.
+     */
+    public static class Builder extends AbstractBuilder<Builder> {
+
+        /**
+         * Constructs a new Builder instance.
+         */
+        private Builder() {
+            // empty
+        }
+
+        @Override
+        public EqualsBuilder get() {
+            return new EqualsBuilder(this);
+        }
+
+    }
+
+    /**
+     * Constructs a new Builder.
+     *
+     * @return a new Builder.
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
 
     /**
      * A registry of objects used by reflection methods to detect cyclical 
object references and avoid infinite loops.
@@ -155,7 +182,7 @@ static boolean isRegistered(final Object lhs, final Object 
rhs) {
     }
 
     /**
-     * This method uses reflection to determine if the two {@link Object}s
+     * Uses reflection to determine if the two {@link Object}s
      * are equal.
      *
      * <p>It uses {@code AccessibleObject.setAccessible} to gain access to 
private
@@ -181,7 +208,7 @@ public static boolean reflectionEquals(final Object lhs, 
final Object rhs, final
     }
 
     /**
-     * This method uses reflection to determine if the two {@link Object}s
+     * Uses reflection to determine if the two {@link Object}s
      * are equal.
      *
      * <p>It uses {@code AccessibleObject.setAccessible} to gain access to 
private
@@ -235,7 +262,7 @@ public static boolean reflectionEquals(final Object lhs, 
final Object rhs, final
     }
 
     /**
-     * This method uses reflection to determine if the two {@link Object}s
+     * Uses reflection to determine if the two {@link Object}s
      * are equal.
      *
      * <p>It uses {@code AccessibleObject.setAccessible} to gain access to 
private
@@ -268,7 +295,7 @@ public static boolean reflectionEquals(final Object lhs, 
final Object rhs, final
     }
 
     /**
-     * This method uses reflection to determine if the two {@link Object}s
+     * Uses reflection to determine if the two {@link Object}s
      * are equal.
      *
      * <p>It uses {@code AccessibleObject.setAccessible} to gain access to 
private
@@ -293,7 +320,7 @@ public static boolean reflectionEquals(final Object lhs, 
final Object rhs, final
     }
 
     /**
-     * This method uses reflection to determine if the two {@link Object}s
+     * Uses reflection to determine if the two {@link Object}s
      * are equal.
      *
      * <p>It uses {@code AccessibleObject.setAccessible} to gain access to 
private
@@ -371,11 +398,16 @@ private static void unregister(final Object lhs, final 
Object rhs) {
      * @see Object#equals(Object)
      */
     public EqualsBuilder() {
+        super(builder());
         // set up default classes to bypass reflection for
         bypassReflectionClasses = new ArrayList<>(1);
         bypassReflectionClasses.add(String.class); //hashCode field being lazy 
but not transient
     }
 
+    private EqualsBuilder(Builder builder) {
+        super(builder);
+    }
+
     /**
      * Test if two {@code booleans}s are equal.
      *
@@ -961,9 +993,8 @@ public EqualsBuilder reflectionAppend(final Object lhs, 
final Object rhs) {
         try {
             if (testClass.isArray()) {
                 append(lhs, rhs);
-            } else //If either class is being excluded, call normal object 
equals method on lhsClass.
-            if (bypassReflectionClasses != null
-                    && (bypassReflectionClasses.contains(lhsClass) || 
bypassReflectionClasses.contains(rhsClass))) {
+            } else // If either class is being excluded, call normal object 
equals method on lhsClass.
+            if (bypassReflectionClasses != null && 
(bypassReflectionClasses.contains(lhsClass) || 
bypassReflectionClasses.contains(rhsClass))) {
                 isEquals = lhs.equals(rhs);
             } else {
                 reflectionAppend(lhs, rhs, testClass);
@@ -991,19 +1022,14 @@ public EqualsBuilder reflectionAppend(final Object lhs, 
final Object rhs) {
      * @param rhs  the right-hand side object
      * @param clazz  the class to append details of
      */
-    private void reflectionAppend(
-        final Object lhs,
-        final Object rhs,
-        final Class<?> clazz) {
-
+    private void reflectionAppend(final Object lhs, final Object rhs, final 
Class<?> clazz) {
         if (isRegistered(lhs, rhs)) {
             return;
         }
-
         try {
             register(lhs, rhs);
             final Field[] fields = clazz.getDeclaredFields();
-            AccessibleObject.setAccessible(fields, true);
+            setAccessible(fields);
             for (int i = 0; i < fields.length && isEquals; i++) {
                 final Field field = fields[i];
                 if (!ArrayUtils.contains(excludeFields, field.getName())
diff --git 
a/src/main/java/org/apache/commons/lang3/builder/HashCodeBuilder.java 
b/src/main/java/org/apache/commons/lang3/builder/HashCodeBuilder.java
index 89610d298..d5737b7d6 100644
--- a/src/main/java/org/apache/commons/lang3/builder/HashCodeBuilder.java
+++ b/src/main/java/org/apache/commons/lang3/builder/HashCodeBuilder.java
@@ -17,7 +17,6 @@
 
 package org.apache.commons.lang3.builder;
 
-import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.util.Collection;
@@ -102,7 +101,53 @@
  *
  * @since 1.0
  */
-public class HashCodeBuilder implements Builder<Integer> {
+public class HashCodeBuilder extends AbstractReflection implements 
Builder<Integer> {
+
+    /**
+     * Builds instances of CompareToBuilder.
+     */
+    public static class Builder extends AbstractBuilder<Builder> {
+
+        private int initialOddNumber;
+
+        private int multiplierOddNumber;
+
+        /**
+         * Constructs a new Builder instance.
+         */
+        private Builder() {
+            // empty
+        }
+
+        @Override
+        public HashCodeBuilder get() {
+            return new HashCodeBuilder(this);
+        }
+
+
+        /**
+         * Sets an odd number used as the initial value.
+         *
+         * @param initialOddNumber an odd number used as the initial value.
+         * @return {@code this} instance.
+         */
+        public Builder setInitialOddNumber(final int initialOddNumber) {
+            this.initialOddNumber = initialOddNumber;
+            return asThis();
+        }
+
+        /**
+         * Sets an odd number used as the multiplier.
+         *
+         * @param multiplierOddNumber an odd number used as the multiplier.
+         * @return {@code this} instance.
+         */
+        public Builder setMultiplierOddNumber(final int multiplierOddNumber) {
+            this.multiplierOddNumber = multiplierOddNumber;
+            return asThis();
+        }
+
+    }
 
     /**
      * The default initial value to use in reflection hash code building.
@@ -121,6 +166,15 @@ public class HashCodeBuilder implements Builder<Integer> {
      */
     private static final ThreadLocal<Set<IDKey>> REGISTRY = 
ThreadLocal.withInitial(HashSet::new);
 
+    /**
+     * Constructs a new Builder.
+     *
+     * @return a new Builder.
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
     /*
      * NOTE: we cannot store the actual objects in a HashSet, as that would 
use the very hashCode()
      * we are in the process of calculating.
@@ -175,9 +229,10 @@ static boolean isRegistered(final Object value) {
      *            whether to use transient fields
      * @param excludeFields
      *            Collection of String field names to exclude from use in 
calculation of hash code
+     * @param setAccessible Whether to set fields' accessible flags
      */
     private static void reflectionAppend(final Object object, final Class<?> 
clazz, final HashCodeBuilder builder, final boolean useTransients,
-            final String[] excludeFields) {
+            final String[] excludeFields, final boolean setAccessible) {
         if (isRegistered(object)) {
             return;
         }
@@ -185,7 +240,7 @@ private static void reflectionAppend(final Object object, 
final Class<?> clazz,
             register(object);
             // The elements in the returned array are not sorted and are not 
in any particular order.
             final Field[] fields = ArraySorter.sort(clazz.getDeclaredFields(), 
Comparator.comparing(Field::getName));
-            AccessibleObject.setAccessible(fields, true);
+            setAccessible(setAccessible, fields);
             for (final Field field : fields) {
                 if (!ArrayUtils.contains(excludeFields, field.getName())
                     && !field.getName().contains("$")
@@ -340,10 +395,10 @@ public static <T> int reflectionHashCode(final int 
initialNonZeroOddNumber, fina
         Objects.requireNonNull(object, "object");
         final HashCodeBuilder builder = new 
HashCodeBuilder(initialNonZeroOddNumber, multiplierNonZeroOddNumber);
         Class<?> clazz = object.getClass();
-        reflectionAppend(object, clazz, builder, testTransients, 
excludeFields);
+        reflectionAppend(object, clazz, builder, testTransients, 
excludeFields, true);
         while (clazz.getSuperclass() != null && clazz != reflectUpToClass) {
             clazz = clazz.getSuperclass();
-            reflectionAppend(object, clazz, builder, testTransients, 
excludeFields);
+            reflectionAppend(object, clazz, builder, testTransients, 
excludeFields, true);
         }
         return builder.toHashCode();
     }
@@ -504,10 +559,16 @@ private static void unregister(final Object value) {
      * Uses two hard coded choices for the constants needed to build a {@code 
hashCode}.
      */
     public HashCodeBuilder() {
-        constant = 37;
-        total = 17;
+        this(builder().setInitialOddNumber(17).setMultiplierOddNumber(37));
     }
 
+    private HashCodeBuilder(Builder builder) {
+        super(builder);
+        Validate.isTrue(builder.initialOddNumber % 2 != 0, "HashCodeBuilder 
requires an odd initial value");
+        Validate.isTrue(builder.multiplierOddNumber % 2 != 0, "HashCodeBuilder 
requires an odd multiplier");
+        constant = builder.multiplierOddNumber;
+        total = builder.initialOddNumber;    }
+
     /**
      * Two randomly chosen, odd numbers must be passed in. Ideally these 
should be different for each class,
      * however this is not vital.
@@ -524,10 +585,7 @@ public HashCodeBuilder() {
      *             if the number is even
      */
     public HashCodeBuilder(final int initialOddNumber, final int 
multiplierOddNumber) {
-        Validate.isTrue(initialOddNumber % 2 != 0, "HashCodeBuilder requires 
an odd initial value");
-        Validate.isTrue(multiplierOddNumber % 2 != 0, "HashCodeBuilder 
requires an odd multiplier");
-        constant = multiplierOddNumber;
-        total = initialOddNumber;
+        
this(builder().setInitialOddNumber(initialOddNumber).setMultiplierOddNumber(multiplierOddNumber));
     }
 
     /**
diff --git 
a/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java 
b/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java
index 418e96fd1..b38f3d7c4 100644
--- 
a/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java
+++ 
b/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java
@@ -17,7 +17,6 @@
 
 package org.apache.commons.lang3.builder;
 
-import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.util.Arrays;
@@ -646,14 +645,14 @@ protected void appendFieldsIn(final Class<?> clazz) {
         }
         // The elements in the returned array are not sorted and are not in 
any particular order.
         final Field[] fields = ArraySorter.sort(clazz.getDeclaredFields(), 
Comparator.comparing(Field::getName));
-        AccessibleObject.setAccessible(fields, true);
+        setAccessible(fields);
         for (final Field field : fields) {
             final String fieldName = field.getName();
             if (accept(field)) {
                 try {
                     // Warning: Field.get(Object) creates wrappers objects
                     // for primitive types.
-                    final Object fieldValue = getValue(field);
+                    final Object fieldValue = field.isAccessible() ? 
getValue(field) : null;
                     if (!excludeNullValues || fieldValue != null) {
                         this.append(fieldName, fieldValue, 
!field.isAnnotationPresent(ToStringSummary.class));
                     }
diff --git 
a/src/main/java/org/apache/commons/lang3/builder/ToStringBuilder.java 
b/src/main/java/org/apache/commons/lang3/builder/ToStringBuilder.java
index 379fef134..cea81a557 100644
--- a/src/main/java/org/apache/commons/lang3/builder/ToStringBuilder.java
+++ b/src/main/java/org/apache/commons/lang3/builder/ToStringBuilder.java
@@ -87,13 +87,80 @@
  *
  * @since 1.0
  */
-public class ToStringBuilder implements Builder<String> {
+public class ToStringBuilder extends AbstractReflection implements 
Builder<String> {
+
+    /**
+     * Builds instances of CompareToBuilder.
+     *
+     * @since 3.21.0
+     */
+    public static class Builder extends AbstractBuilder<Builder> {
+
+        private Object object;
+        private ToStringStyle style;
+        private StringBuffer buffer;
+
+        /**
+         * Constructs a new Builder instance.
+         */
+        private Builder() {
+            // empty
+        }
+
+        @Override
+        public ToStringBuilder get() {
+            return new ToStringBuilder(this);
+        }
+
+        /**
+         * Sets the {@link StringBuffer} to populate, may be null.
+         *
+         * @param buffer the {@link StringBuffer} to populate, may be null
+         * @return {@code this} builder instance.
+         */
+        public Builder setBuffer(final StringBuffer buffer) {
+            this.buffer = buffer;
+            return asThis();
+        }
+
+        /**
+         * Sets the Object to build a {@code toString} for, not recommended to 
be null.
+         *
+         * @param object the Object to build a {@code toString} for, not 
recommended to be null.
+         * @return {@code this} builder instance.
+         */
+        public Builder setObject(final Object object) {
+            this.object = object;
+            return asThis();
+        }
+
+        /**
+         * Sets the style of the {@code toString} to create, null uses the 
default style.
+         *
+         * @param style the style of the {@code toString} to create, null uses 
the default style
+         * @return {@code this} builder instance.
+         */
+        public Builder setStyle(final ToStringStyle style) {
+            this.style = style;
+            return asThis();
+        }
+    }
 
     /**
      * The default style of output to use, not null.
      */
     private static volatile ToStringStyle defaultStyle = 
ToStringStyle.DEFAULT_STYLE;
 
+    /**
+     * Constructs a new Builder.
+     *
+     * @return a new Builder.
+     * @since 3.21.0
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
     /**
      * Gets the default {@link ToStringStyle} to use.
      *
@@ -210,6 +277,14 @@ public static void setDefaultStyle(final ToStringStyle 
style) {
      */
     private final ToStringStyle style;
 
+    private ToStringBuilder(final Builder builder) {
+        super(builder);
+        this.style = builder.style != null ? builder.style : getDefaultStyle();
+        this.buffer = builder.buffer != null ? builder.buffer : new 
StringBuffer(512);
+        this.object = builder.object;
+        style.appendStart(buffer, object);
+    }
+
     /**
      * Constructs a builder for the specified object using the default output 
style.
      *
@@ -244,18 +319,8 @@ public ToStringBuilder(final Object object, final 
ToStringStyle style) {
      * @param style  the style of the {@code toString} to create, null uses 
the default style
      * @param buffer  the {@link StringBuffer} to populate, may be null
      */
-    public ToStringBuilder(final Object object, ToStringStyle style, 
StringBuffer buffer) {
-        if (style == null) {
-            style = getDefaultStyle();
-        }
-        if (buffer == null) {
-            buffer = new StringBuffer(512);
-        }
-        this.buffer = buffer;
-        this.style = style;
-        this.object = object;
-
-        style.appendStart(buffer, object);
+    public ToStringBuilder(final Object object, final ToStringStyle style, 
final StringBuffer buffer) {
+        this(builder().setObject(object).setStyle(style).setBuffer(buffer));
     }
 
     /**
diff --git a/src/test/java/org/apache/commons/lang3/AbstractLangTest.java 
b/src/test/java/org/apache/commons/lang3/AbstractLangTest.java
index 8be8f69dd..84373105b 100644
--- a/src/test/java/org/apache/commons/lang3/AbstractLangTest.java
+++ b/src/test/java/org/apache/commons/lang3/AbstractLangTest.java
@@ -14,6 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package org.apache.commons.lang3;
 
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -34,5 +35,4 @@ public void after() {
         assertTrue(ToStringStyle.getRegistry().isEmpty(), "Expected null, 
actual: " + ToStringStyle.getRegistry());
         // TODO Do more to make sure memory is not retained, maybe like Log4j 
checks for it.
     }
-
 }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/AbstractBuilderTest.java 
b/src/test/java/org/apache/commons/lang3/builder/AbstractBuilderTest.java
new file mode 100644
index 000000000..86ae9e070
--- /dev/null
+++ b/src/test/java/org/apache/commons/lang3/builder/AbstractBuilderTest.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.lang3.builder;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.Objects;
+import java.util.function.Supplier;
+
+import org.apache.commons.lang3.AbstractLangTest;
+
+/**
+ * Helps test this package.
+ */
+class AbstractBuilderTest extends AbstractLangTest {
+
+    /**
+     * Delegates to {@link AbstractReflection#getForceAccessible()}.
+     *
+     * @return {@link AbstractReflection#getForceAccessible()}.
+     */
+    protected static boolean accessibleFlag() {
+        return AbstractReflection.getForceAccessible();
+    }
+
+    /**
+     * Helps test reflection classes.
+     *
+     * @param string An input string.
+     * @return The given string or "<null>".
+     */
+    protected static String accessibleString(final String string) {
+        return accessibleFlag() ? string : "<null>";
+    }
+
+    protected static void assertEqualsIfAccessible(final Object expected, 
final Object actual) {
+        assertEquals(accessibleFlag(), Objects.equals(expected, actual));
+    }
+
+    protected static void assertTrueIfAccessible(final boolean test) {
+        assertEquals(accessibleFlag(), test);
+    }
+
+    protected static void assertTrueIfAccessible(final boolean test, final 
Supplier<String> messageSupplier) {
+        assertEquals(accessibleFlag(), test, messageSupplier);
+    }
+}
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
 b/src/test/java/org/apache/commons/lang3/builder/AbstractReflectionTest.java
similarity index 55%
copy from 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
copy to 
src/test/java/org/apache/commons/lang3/builder/AbstractReflectionTest.java
index be0f5227c..e0428310d 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
+++ b/src/test/java/org/apache/commons/lang3/builder/AbstractReflectionTest.java
@@ -6,7 +6,7 @@
  * (the "License"); you may not use this file except in compliance with
  * the License.  You may obtain a copy of the License at
  *
- *      https://www.apache.org/licenses/LICENSE-2.0
+ *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,25 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.apache.commons.lang3.AbstractLangTest;
-import org.junit.jupiter.api.Test;
-
-class ReflectionToStringBuilderSummaryTest extends AbstractLangTest {
 
-    @SuppressWarnings("unused")
-    private final String stringField = "string";
-
-    @ToStringSummary
-    private final String summaryString = "summary";
+package org.apache.commons.lang3.builder;
 
-    @Test
-    void testSummary() {
-        assertEquals("[stringField=string,summaryString=<String>]",
-                new ReflectionToStringBuilder(this, 
ToStringStyle.NO_CLASS_NAME_STYLE).build());
-    }
+/**
+ * Helps test no forced access.
+ */
+public class AbstractReflectionTest {
 
+    static final String FORCE_ACCESSIBLE = 
"AbstractReflection.forceAccessible";
 }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/CompareToBuilderNoForceTest.java
similarity index 55%
copy from 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
copy to 
src/test/java/org/apache/commons/lang3/builder/CompareToBuilderNoForceTest.java
index be0f5227c..14fe8a8ea 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/CompareToBuilderNoForceTest.java
@@ -6,7 +6,7 @@
  * (the "License"); you may not use this file except in compliance with
  * the License.  You may obtain a copy of the License at
  *
- *      https://www.apache.org/licenses/LICENSE-2.0
+ *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,25 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.apache.commons.lang3.AbstractLangTest;
-import org.junit.jupiter.api.Test;
-
-class ReflectionToStringBuilderSummaryTest extends AbstractLangTest {
 
-    @SuppressWarnings("unused")
-    private final String stringField = "string";
-
-    @ToStringSummary
-    private final String summaryString = "summary";
+package org.apache.commons.lang3.builder;
 
-    @Test
-    void testSummary() {
-        assertEquals("[stringField=string,summaryString=<String>]",
-                new ReflectionToStringBuilder(this, 
ToStringStyle.NO_CLASS_NAME_STYLE).build());
-    }
+import org.junitpioneer.jupiter.SetSystemProperty;
 
+/**
+ * Like {@link CompareToBuilderTest} with force accessible disabled.
+ */
+@SetSystemProperty(key = AbstractReflectionTest.FORCE_ACCESSIBLE, value = 
"false")
+public class CompareToBuilderNoForceTest extends CompareToBuilderTest {
+    // empty
 }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/CompareToBuilderTest.java 
b/src/test/java/org/apache/commons/lang3/builder/CompareToBuilderTest.java
index d00a98706..43540c486 100644
--- a/src/test/java/org/apache/commons/lang3/builder/CompareToBuilderTest.java
+++ b/src/test/java/org/apache/commons/lang3/builder/CompareToBuilderTest.java
@@ -24,13 +24,12 @@
 import java.math.BigInteger;
 import java.util.Objects;
 
-import org.apache.commons.lang3.AbstractLangTest;
 import org.junit.jupiter.api.Test;
 
 /**
  * Tests {@link CompareToBuilder}.
  */
-class CompareToBuilderTest extends AbstractLangTest {
+class CompareToBuilderTest extends AbstractBuilderTest {
 
     static class TestObject implements Comparable<TestObject> {
         private int a;
@@ -114,9 +113,10 @@ static class TestTransientSubObject extends TestObject {
      * @param z an object to compare
      * @param testTransients Whether to include transients in the comparison
      * @param excludeFields fields to exclude
+     * @param expectAccessibleFactor Whether accessibility is expected.
      */
-    private void assertReflectionCompareContract(final Object x, final Object 
y, final Object z, final boolean testTransients, final String[] excludeFields) {
-
+    private void assertReflectionCompareContract(final Object x, final Object 
y, final Object z, final boolean testTransients, final String[] excludeFields,
+            final boolean expectAccessibleFactor) {
         // signum
         assertEquals(reflectionCompareSignum(x, y, testTransients, 
excludeFields), -reflectionCompareSignum(y, x, testTransients, excludeFields));
 
@@ -132,7 +132,14 @@ private void assertReflectionCompareContract(final Object 
x, final Object y, fin
         }
 
         // strongly recommended but not strictly required
-        assertTrue(CompareToBuilder.reflectionCompare(x, y, testTransients) == 
0 == EqualsBuilder.reflectionEquals(x, y, testTransients));
+        // assertTrue(CompareToBuilder.reflectionCompare(x, y, testTransients) 
== 0 == EqualsBuilder.reflectionEquals(x, y, testTransients));
+        //assertTrueIfAccessible(CompareToBuilder.reflectionCompare(x, y, 
testTransients) == 0 == EqualsBuilder.reflectionEquals(x, y, testTransients));
+        final boolean actual = CompareToBuilder.reflectionCompare(x, y, 
testTransients) == 0 == EqualsBuilder.reflectionEquals(x, y, testTransients);
+        if (accessibleFlag()) {
+            assertEqualsIfAccessible(expectAccessibleFactor, actual);
+        } else {
+            assertEqualsIfAccessible(accessibleFlag() || 
expectAccessibleFactor, actual);
+        }
     }
 
     private void assertXYZCompareOrder(final Object x, final Object y, final 
Object z, final boolean testTransients, final String[] excludeFields) {
@@ -140,13 +147,13 @@ private void assertXYZCompareOrder(final Object x, final 
Object y, final Object
         assertEquals(0, CompareToBuilder.reflectionCompare(y, y, 
testTransients, null, excludeFields));
         assertEquals(0, CompareToBuilder.reflectionCompare(z, z, 
testTransients, null, excludeFields));
 
-        assertTrue(0 > CompareToBuilder.reflectionCompare(x, y, 
testTransients, null, excludeFields));
-        assertTrue(0 > CompareToBuilder.reflectionCompare(x, z, 
testTransients, null, excludeFields));
-        assertTrue(0 > CompareToBuilder.reflectionCompare(y, z, 
testTransients, null, excludeFields));
+        assertTrueIfAccessible(0 > CompareToBuilder.reflectionCompare(x, y, 
testTransients, null, excludeFields));
+        assertTrueIfAccessible(0 > CompareToBuilder.reflectionCompare(x, z, 
testTransients, null, excludeFields));
+        assertTrueIfAccessible(0 > CompareToBuilder.reflectionCompare(y, z, 
testTransients, null, excludeFields));
 
-        assertTrue(0 < CompareToBuilder.reflectionCompare(y, x, 
testTransients, null, excludeFields));
-        assertTrue(0 < CompareToBuilder.reflectionCompare(z, x, 
testTransients, null, excludeFields));
-        assertTrue(0 < CompareToBuilder.reflectionCompare(z, y, 
testTransients, null, excludeFields));
+        assertTrueIfAccessible(0 < CompareToBuilder.reflectionCompare(y, x, 
testTransients, null, excludeFields));
+        assertTrueIfAccessible(0 < CompareToBuilder.reflectionCompare(z, x, 
testTransients, null, excludeFields));
+        assertTrueIfAccessible(0 < CompareToBuilder.reflectionCompare(z, y, 
testTransients, null, excludeFields));
     }
 
     /**
@@ -1022,8 +1029,8 @@ void testReflectionCompare() {
         assertEquals(0, CompareToBuilder.reflectionCompare(o1, o1));
         assertEquals(0, CompareToBuilder.reflectionCompare(o1, o2));
         o2.setA(5);
-        assertTrue(CompareToBuilder.reflectionCompare(o1, o2) < 0);
-        assertTrue(CompareToBuilder.reflectionCompare(o2, o1) > 0);
+        assertTrueIfAccessible(CompareToBuilder.reflectionCompare(o1, o2) < 0);
+        assertTrueIfAccessible(CompareToBuilder.reflectionCompare(o2, o1) > 0);
     }
 
     @Test
@@ -1052,14 +1059,14 @@ private void testReflectionHierarchyCompare(final 
boolean testTransients, final
         final TestSubObject tso2 = new TestSubObject(2, 2);
         final TestSubObject tso3 = new TestSubObject(3, 3);
 
-        assertReflectionCompareContract(to1, to1, to1, false, excludeFields);
-        assertReflectionCompareContract(to1, to2, to3, false, excludeFields);
-        assertReflectionCompareContract(tso1, tso1, tso1, false, 
excludeFields);
-        assertReflectionCompareContract(tso1, tso2, tso3, false, 
excludeFields);
-        assertReflectionCompareContract("1", "2", "3", false, excludeFields);
+        assertReflectionCompareContract(to1, to1, to1, false, excludeFields, 
accessibleFlag());
+        assertReflectionCompareContract(to1, to2, to3, false, excludeFields, 
true);
+        assertReflectionCompareContract(tso1, tso1, tso1, false, 
excludeFields, accessibleFlag());
+        assertReflectionCompareContract(tso1, tso2, tso3, false, 
excludeFields, true);
+        assertReflectionCompareContract("1", "2", "3", false, excludeFields, 
true);
 
-        assertTrue(0 != CompareToBuilder.reflectionCompare(tso1, new 
TestSubObject(1, 0), testTransients));
-        assertTrue(0 != CompareToBuilder.reflectionCompare(tso1, new 
TestSubObject(0, 1), testTransients));
+        assertTrueIfAccessible(0 != CompareToBuilder.reflectionCompare(tso1, 
new TestSubObject(1, 0), testTransients));
+        assertTrueIfAccessible(0 != CompareToBuilder.reflectionCompare(tso1, 
new TestSubObject(0, 1), testTransients));
 
         // root class
         assertXYZCompareOrder(to1, to2, to3, true, null);
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
 b/src/test/java/org/apache/commons/lang3/builder/DiffBuilderNoForceTest.java
similarity index 55%
copy from 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
copy to 
src/test/java/org/apache/commons/lang3/builder/DiffBuilderNoForceTest.java
index be0f5227c..933b08881 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
+++ b/src/test/java/org/apache/commons/lang3/builder/DiffBuilderNoForceTest.java
@@ -6,7 +6,7 @@
  * (the "License"); you may not use this file except in compliance with
  * the License.  You may obtain a copy of the License at
  *
- *      https://www.apache.org/licenses/LICENSE-2.0
+ *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,25 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.apache.commons.lang3.AbstractLangTest;
-import org.junit.jupiter.api.Test;
-
-class ReflectionToStringBuilderSummaryTest extends AbstractLangTest {
 
-    @SuppressWarnings("unused")
-    private final String stringField = "string";
-
-    @ToStringSummary
-    private final String summaryString = "summary";
+package org.apache.commons.lang3.builder;
 
-    @Test
-    void testSummary() {
-        assertEquals("[stringField=string,summaryString=<String>]",
-                new ReflectionToStringBuilder(this, 
ToStringStyle.NO_CLASS_NAME_STYLE).build());
-    }
+import org.junitpioneer.jupiter.SetSystemProperty;
 
+/**
+ * Like {@link DiffBuilderTest} with force accessible disabled.
+ */
+@SetSystemProperty(key = AbstractReflectionTest.FORCE_ACCESSIBLE, value = 
"false")
+public class DiffBuilderNoForceTest extends DiffBuilderTest {
+    // empty
 }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/DiffBuilderTest.java 
b/src/test/java/org/apache/commons/lang3/builder/DiffBuilderTest.java
index 5a8797133..ba81a6b3a 100644
--- a/src/test/java/org/apache/commons/lang3/builder/DiffBuilderTest.java
+++ b/src/test/java/org/apache/commons/lang3/builder/DiffBuilderTest.java
@@ -26,14 +26,13 @@
 
 import java.util.List;
 
-import org.apache.commons.lang3.AbstractLangTest;
 import org.apache.commons.lang3.ArrayUtils;
 import org.junit.jupiter.api.Test;
 
 /**
  * Tests {@link DiffBuilder}.
  */
-class DiffBuilderTest extends AbstractLangTest {
+class DiffBuilderTest extends AbstractBuilderTest {
 
     /**
      * Test fixture.
@@ -549,7 +548,7 @@ void testSimilarObjectIgnoresAppends() {
         final TypeTestClass testClass1 = new TypeTestClass();
         final TypeTestClass testClass2 = new TypeTestClass();
         final DiffResult<TypeTestClass> list = new DiffBuilder<>(testClass1, 
testClass2, SHORT_STYLE).append("ignored", false, true).build();
-        assertEquals(0, list.getNumberOfDiffs());
+        assertEquals(accessibleFlag() ? 0 : 1, list.getNumberOfDiffs());
     }
 
     @Test
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/EqualsBuilderNoForceTest.java 
b/src/test/java/org/apache/commons/lang3/builder/EqualsBuilderNoForceTest.java
new file mode 100644
index 000000000..61aa9ab64
--- /dev/null
+++ 
b/src/test/java/org/apache/commons/lang3/builder/EqualsBuilderNoForceTest.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.lang3.builder;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+import java.util.HashMap;
+
+import org.junit.jupiter.api.Test;
+import org.junitpioneer.jupiter.SetSystemProperty;
+
+/**
+ * Like {@link EqualsBuilderTest} with force accessible disabled.
+ */
+@SetSystemProperty(key = AbstractReflectionTest.FORCE_ACCESSIBLE, value = 
"false")
+public class EqualsBuilderNoForceTest extends EqualsBuilderTest {
+
+    @Test
+    void testReflectionOnCustomArrayList() {
+        assertFalse(EqualsBuilder.reflectionEquals(new TestArrayList(1, "2", 
"3", "4"), new TestArrayList(1, "2", "3", "4")));
+        assertFalse(EqualsBuilder.reflectionEquals(new TestArrayList(1, "2", 
"3", "4"), new TestArrayList(2, "2", "3", "4")));
+    }
+
+    @Test
+    void testReflectionOnCustomHashMap() {
+        assertFalse(EqualsBuilder.reflectionEquals(new TestHashMap(1, new 
HashMap<>()), new TestHashMap(1, new HashMap<>())));
+        assertFalse(EqualsBuilder.reflectionEquals(new TestHashMap(1, new 
HashMap<>()), new TestHashMap(2, new HashMap<>())));
+    }
+}
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/EqualsBuilderReflectJreImplementationNoForceTest.java
similarity index 59%
copy from 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
copy to 
src/test/java/org/apache/commons/lang3/builder/EqualsBuilderReflectJreImplementationNoForceTest.java
index be0f5227c..a5cecf882 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/EqualsBuilderReflectJreImplementationNoForceTest.java
@@ -14,25 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.apache.commons.lang3.AbstractLangTest;
-import org.junit.jupiter.api.Test;
-
-class ReflectionToStringBuilderSummaryTest extends AbstractLangTest {
 
-    @SuppressWarnings("unused")
-    private final String stringField = "string";
-
-    @ToStringSummary
-    private final String summaryString = "summary";
+package org.apache.commons.lang3.builder;
 
-    @Test
-    void testSummary() {
-        assertEquals("[stringField=string,summaryString=<String>]",
-                new ReflectionToStringBuilder(this, 
ToStringStyle.NO_CLASS_NAME_STYLE).build());
-    }
+import org.junitpioneer.jupiter.SetSystemProperty;
 
+/**
+ * Like {@link EqualsBuilderReflectJreImplementationTest} with force 
accessible disabled.
+ */
+@SetSystemProperty(key = AbstractReflectionTest.FORCE_ACCESSIBLE, value = 
"false")
+public class EqualsBuilderReflectJreImplementationNoForceTest extends 
EqualsBuilderReflectJreImplementationTest {
+    // TODO Override failing methods with new assertions
 }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/EqualsBuilderReflectJreImplementationTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/EqualsBuilderReflectJreImplementationTest.java
index 787735628..929ea2af4 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/EqualsBuilderReflectJreImplementationTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/EqualsBuilderReflectJreImplementationTest.java
@@ -47,14 +47,13 @@
 import java.util.List;
 import java.util.function.Supplier;
 
-import org.apache.commons.lang3.AbstractLangTest;
 import org.apache.commons.lang3.stream.IntStreams;
 import org.junit.jupiter.api.Test;
 
 /**
  * Tests that {@link EqualsBuilder} works using reflection when types that 
implement JRE interfaces like TemporalAccessor, TemporalAmout, and CharSequence 
work.
  */
-class EqualsBuilderReflectJreImplementationTest extends AbstractLangTest {
+class EqualsBuilderReflectJreImplementationTest extends AbstractBuilderTest {
 
     static class MyCharSequence implements CharSequence {
 
@@ -268,16 +267,16 @@ void testRecursive() {
         final MyClass o2 = new MyClass(new MyCharSequence("5"), new 
MyTemporal("6"), new MyTemporalAccessor("7"), new MyTemporalAmount("8"));
         final MyClass o2Bis = new MyClass(new MyCharSequence("5"), new 
MyTemporal("6"), new MyTemporalAccessor("7"), new MyTemporalAmount("8"));
         // MyTemporal
-        assertTrue(new EqualsBuilder().setTestRecursive(true).append(new 
MyTemporal("1"), new MyTemporal("1")).isEquals());
+        assertTrueIfAccessible(new 
EqualsBuilder().setTestRecursive(true).append(new MyTemporal("1"), new 
MyTemporal("1")).isEquals());
         // MyTemporalAccessor
-        assertTrue(new EqualsBuilder().setTestRecursive(true).append(new 
MyTemporalAccessor("1"), new MyTemporalAccessor("1")).isEquals());
+        assertTrueIfAccessible(new 
EqualsBuilder().setTestRecursive(true).append(new MyTemporalAccessor("1"), new 
MyTemporalAccessor("1")).isEquals());
         // MyCharSequence
-        assertTrue(new EqualsBuilder().setTestRecursive(true).append(new 
MyCharSequence("1"), new MyCharSequence("1")).isEquals());
+        assertTrueIfAccessible(new 
EqualsBuilder().setTestRecursive(true).append(new MyCharSequence("1"), new 
MyCharSequence("1")).isEquals());
         // MyClass
         assertTrue(new EqualsBuilder().setTestRecursive(true).append(o1, 
o1).isEquals(), o1::toString);
-        assertTrue(new EqualsBuilder().setTestRecursive(true).append(o1, 
o1Bis).isEquals(), o1::toString);
+        assertTrueIfAccessible(new 
EqualsBuilder().setTestRecursive(true).append(o1, o1Bis).isEquals(), 
o1::toString);
         assertTrue(new EqualsBuilder().setTestRecursive(true).append(o2, 
o2).isEquals(), o2::toString);
-        assertTrue(new EqualsBuilder().setTestRecursive(true).append(o2, 
o2Bis).isEquals(), o2::toString);
+        assertTrueIfAccessible(new 
EqualsBuilder().setTestRecursive(true).append(o2, o2Bis).isEquals(), 
o2::toString);
         assertFalse(new EqualsBuilder().setTestRecursive(true).append(o1, 
o2).isEquals());
         assertFalse(new EqualsBuilder().setTestRecursive(true).append(o2, 
o1).isEquals());
     }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/EqualsBuilderTest.java 
b/src/test/java/org/apache/commons/lang3/builder/EqualsBuilderTest.java
index 414881178..e1ff81ed4 100644
--- a/src/test/java/org/apache/commons/lang3/builder/EqualsBuilderTest.java
+++ b/src/test/java/org/apache/commons/lang3/builder/EqualsBuilderTest.java
@@ -31,14 +31,13 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.commons.lang3.AbstractLangTest;
 import org.apache.commons.lang3.reflect.MethodUtils;
 import org.junit.jupiter.api.Test;
 
 /**
  * Tests {@link EqualsBuilder}.
  */
-class EqualsBuilderTest extends AbstractLangTest {
+class EqualsBuilderTest extends AbstractBuilderTest {
 
     public static class TestACanEqualB {
         private final int a;
@@ -607,7 +606,7 @@ void testCyclicalObjectReferences() {
         x3.setObjectReference(refX3);
         refX3.setObjectReference(x3);
 
-        assertEquals(x1, x2);
+        assertTrueIfAccessible(x1.equals(x2));
         assertNotEquals(x1, x3);
         assertNotEquals(x2, x3);
     }
@@ -1097,7 +1096,7 @@ void testObjectRecursive() {
         final TestRecursiveObject oNull = new TestRecursiveObject(null, null, 
2);
 
         assertTrue(new EqualsBuilder().setTestRecursive(true).append(o1A, 
o1A).isEquals());
-        assertTrue(new EqualsBuilder().setTestRecursive(true).append(o1A, 
o1B).isEquals());
+        assertTrueIfAccessible(new 
EqualsBuilder().setTestRecursive(true).append(o1A, o1B).isEquals());
 
         assertFalse(new EqualsBuilder().setTestRecursive(true).append(o1A, 
o2).isEquals());
 
@@ -1120,10 +1119,10 @@ void testObjectRecursiveCycle() {
         o2.setCycle(i2);
 
         assertTrue(new EqualsBuilder().setTestRecursive(true).append(o1A, 
o1A).isEquals());
-        assertTrue(new EqualsBuilder().setTestRecursive(true).append(o1A, 
o1B).isEquals());
+        assertTrueIfAccessible(new 
EqualsBuilder().setTestRecursive(true).append(o1A, o1B).isEquals());
         assertFalse(new EqualsBuilder().setTestRecursive(true).append(o1A, 
o2).isEquals());
 
-        assertTrue(EqualsBuilder.reflectionEquals(o1A, o1B, false, null, 
true));
+        assertTrueIfAccessible(EqualsBuilder.reflectionEquals(o1A, o1B, false, 
null, true));
         assertFalse(EqualsBuilder.reflectionEquals(o1A, o2, false, null, 
true));
     }
 
@@ -1134,7 +1133,7 @@ void testObjectRecursiveCycleSelfreference() {
         final TestRecursiveCycleObject o2 = new TestRecursiveCycleObject(2);
 
         assertTrue(new EqualsBuilder().setTestRecursive(true).append(o1A, 
o1A).isEquals());
-        assertTrue(new EqualsBuilder().setTestRecursive(true).append(o1A, 
o1B).isEquals());
+        assertTrueIfAccessible(new 
EqualsBuilder().setTestRecursive(true).append(o1A, o1B).isEquals());
         assertFalse(new EqualsBuilder().setTestRecursive(true).append(o1A, 
o2).isEquals());
     }
 
@@ -1144,8 +1143,8 @@ void testObjectRecursiveGenericInteger() {
         final TestRecursiveGenericObject<Integer> o1B = new 
TestRecursiveGenericObject<>(1);
         final TestRecursiveGenericObject<Integer> o2 = new 
TestRecursiveGenericObject<>(2);
 
-        assertTrue(new EqualsBuilder().setTestRecursive(true).append(o1A, 
o1B).isEquals());
-        assertTrue(new EqualsBuilder().setTestRecursive(true).append(o1B, 
o1A).isEquals());
+        assertTrueIfAccessible(new 
EqualsBuilder().setTestRecursive(true).append(o1A, o1B).isEquals());
+        assertTrueIfAccessible(new 
EqualsBuilder().setTestRecursive(true).append(o1B, o1A).isEquals());
 
         assertFalse(new EqualsBuilder().setTestRecursive(true).append(o1B, 
o2).isEquals());
     }
@@ -1161,8 +1160,8 @@ void testObjectRecursiveGenericString() {
         // To trigger bug reported in LANG-1356, call hashCode only on string 
in instance o1_a
         s1A.hashCode();
 
-        assertTrue(new EqualsBuilder().setTestRecursive(true).append(o1A, 
o1B).isEquals());
-        assertTrue(new EqualsBuilder().setTestRecursive(true).append(o1B, 
o1A).isEquals());
+        assertTrueIfAccessible(new 
EqualsBuilder().setTestRecursive(true).append(o1A, o1B).isEquals());
+        assertTrueIfAccessible(new 
EqualsBuilder().setTestRecursive(true).append(o1B, o1A).isEquals());
 
         assertFalse(new EqualsBuilder().setTestRecursive(true).append(o1B, 
o2).isEquals());
     }
@@ -1204,7 +1203,7 @@ void testReflectionAppend() {
         assertFalse(new EqualsBuilder().reflectionAppend(o1, 
o2).reflectionAppend(o1, o1).build());
 
         o2.setA(4);
-        assertTrue(new EqualsBuilder().reflectionAppend(o1, o2).build());
+        assertTrueIfAccessible(new EqualsBuilder().reflectionAppend(o1, 
o2).build());
 
         assertFalse(new EqualsBuilder().reflectionAppend(o1, this).build());
 
@@ -1242,7 +1241,7 @@ void testReflectionEquals() {
         assertTrue(EqualsBuilder.reflectionEquals(o1, o1));
         assertFalse(EqualsBuilder.reflectionEquals(o1, o2));
         o2.setA(4);
-        assertTrue(EqualsBuilder.reflectionEquals(o1, o2));
+        assertTrueIfAccessible(EqualsBuilder.reflectionEquals(o1, o2));
 
         assertFalse(EqualsBuilder.reflectionEquals(o1, this));
 
@@ -1279,12 +1278,10 @@ private void 
testReflectionEqualsEquivalenceRelationship(
         // reflection test
         assertTrue(EqualsBuilder.reflectionEquals(to, to, testTransients));
         assertTrue(EqualsBuilder.reflectionEquals(to2, to2, testTransients));
-
         // symmetry test
-        assertTrue(EqualsBuilder.reflectionEquals(to, toBis, testTransients) 
&& EqualsBuilder.reflectionEquals(toBis, to, testTransients));
-
+        assertTrueIfAccessible(EqualsBuilder.reflectionEquals(to, toBis, 
testTransients) && EqualsBuilder.reflectionEquals(toBis, to, testTransients));
         // transitive test
-        assertTrue(
+        assertEquals(accessibleFlag(),
                 EqualsBuilder.reflectionEquals(to, toBis, testTransients)
                         && EqualsBuilder.reflectionEquals(toBis, toTer, 
testTransients)
                         && EqualsBuilder.reflectionEquals(to, toTer, 
testTransients));
@@ -1294,8 +1291,8 @@ private void testReflectionEqualsEquivalenceRelationship(
         if (oToChange instanceof TestSubObject) {
             ((TestSubObject) oToChange).setB(((TestSubObject) to).getB());
         }
-        assertTrue(EqualsBuilder.reflectionEquals(oToChange, to, 
testTransients));
-        assertTrue(EqualsBuilder.reflectionEquals(oToChange, to, 
testTransients));
+        assertTrueIfAccessible(EqualsBuilder.reflectionEquals(oToChange, to, 
testTransients));
+        assertTrueIfAccessible(EqualsBuilder.reflectionEquals(oToChange, to, 
testTransients));
         oToChange.setA(to.getA() + 1);
         if (oToChange instanceof TestSubObject) {
             ((TestSubObject) oToChange).setB(((TestSubObject) to).getB() + 1);
@@ -1329,7 +1326,7 @@ void testReflectionEqualsExcludeFields() {
         assertFalse(EqualsBuilder.reflectionEquals(x1, x2, "three"));
 
         // equal if both differing fields excluded
-        assertTrue(EqualsBuilder.reflectionEquals(x1, x2, "two", "three"));
+        assertTrueIfAccessible(EqualsBuilder.reflectionEquals(x1, x2, "two", 
"three"));
 
         // still equal as long as both differing fields are among excluded
         assertTrue(EqualsBuilder.reflectionEquals(x1, x2, "one", "two", 
"three"));
@@ -1346,8 +1343,8 @@ void testReflectionHierarchyEquals() {
         testReflectionHierarchyEquals(false);
         testReflectionHierarchyEquals(true);
         // Transients
-        assertTrue(EqualsBuilder.reflectionEquals(new TestTTLeafObject(1, 2, 
3, 4), new TestTTLeafObject(1, 2, 3, 4), true));
-        assertTrue(EqualsBuilder.reflectionEquals(new TestTTLeafObject(1, 2, 
3, 4), new TestTTLeafObject(1, 2, 3, 4), false));
+        assertTrueIfAccessible(EqualsBuilder.reflectionEquals(new 
TestTTLeafObject(1, 2, 3, 4), new TestTTLeafObject(1, 2, 3, 4), true));
+        assertTrueIfAccessible(EqualsBuilder.reflectionEquals(new 
TestTTLeafObject(1, 2, 3, 4), new TestTTLeafObject(1, 2, 3, 4), false));
         assertFalse(EqualsBuilder.reflectionEquals(new TestTTLeafObject(1, 0, 
0, 4), new TestTTLeafObject(1, 2, 3, 4), true));
         assertFalse(EqualsBuilder.reflectionEquals(new TestTTLeafObject(1, 2, 
3, 4), new TestTTLeafObject(1, 2, 3, 0), true));
         assertFalse(EqualsBuilder.reflectionEquals(new TestTTLeafObject(0, 2, 
3, 4), new TestTTLeafObject(1, 2, 3, 4), true));
@@ -1374,7 +1371,7 @@ private void testReflectionHierarchyEquals(final boolean 
testTransients) {
 
         // same values
         assertTrue(EqualsBuilder.reflectionEquals(ttlo, ttlo, testTransients));
-        assertTrue(EqualsBuilder.reflectionEquals(new TestSubObject(1, 10), 
new TestSubObject(1, 10), testTransients));
+        assertTrueIfAccessible(EqualsBuilder.reflectionEquals(new 
TestSubObject(1, 10), new TestSubObject(1, 10), testTransients));
         // same super values, diff sub values
         assertFalse(EqualsBuilder.reflectionEquals(new TestSubObject(1, 10), 
new TestSubObject(1, 11), testTransients));
         assertFalse(EqualsBuilder.reflectionEquals(new TestSubObject(1, 11), 
new TestSubObject(1, 10), testTransients));
@@ -1383,17 +1380,17 @@ private void testReflectionHierarchyEquals(final 
boolean testTransients) {
         assertFalse(EqualsBuilder.reflectionEquals(new TestSubObject(1, 10), 
new TestSubObject(0, 10), testTransients));
 
         // mix super and sub types: equals
-        assertTrue(EqualsBuilder.reflectionEquals(to1, teso, testTransients));
-        assertTrue(EqualsBuilder.reflectionEquals(teso, to1, testTransients));
+        assertTrueIfAccessible(EqualsBuilder.reflectionEquals(to1, teso, 
testTransients));
+        assertTrueIfAccessible(EqualsBuilder.reflectionEquals(teso, to1, 
testTransients));
 
-        assertTrue(EqualsBuilder.reflectionEquals(to1, ttso, false)); // Force 
testTransients = false for this assert
-        assertTrue(EqualsBuilder.reflectionEquals(ttso, to1, false)); // Force 
testTransients = false for this assert
+        assertTrueIfAccessible(EqualsBuilder.reflectionEquals(to1, ttso, 
false)); // Force testTransients = false for this assert
+        assertTrueIfAccessible(EqualsBuilder.reflectionEquals(ttso, to1, 
false)); // Force testTransients = false for this assert
 
-        assertTrue(EqualsBuilder.reflectionEquals(to1, tttso, false)); // 
Force testTransients = false for this assert
-        assertTrue(EqualsBuilder.reflectionEquals(tttso, to1, false)); // 
Force testTransients = false for this assert
+        assertTrueIfAccessible(EqualsBuilder.reflectionEquals(to1, tttso, 
false)); // Force testTransients = false for this assert
+        assertTrueIfAccessible(EqualsBuilder.reflectionEquals(tttso, to1, 
false)); // Force testTransients = false for this assert
 
-        assertTrue(EqualsBuilder.reflectionEquals(ttso, tttso, false)); // 
Force testTransients = false for this assert
-        assertTrue(EqualsBuilder.reflectionEquals(tttso, ttso, false)); // 
Force testTransients = false for this assert
+        assertTrueIfAccessible(EqualsBuilder.reflectionEquals(ttso, tttso, 
false)); // Force testTransients = false for this assert
+        assertTrueIfAccessible(EqualsBuilder.reflectionEquals(tttso, ttso, 
false)); // Force testTransients = false for this assert
 
         // mix super and sub types: NOT equals
         assertFalse(EqualsBuilder.reflectionEquals(new TestObject(0), new 
TestEmptySubObject(1), testTransients));
@@ -1502,7 +1499,7 @@ void testToEqualsExclude() {
         one = new TestObjectEqualsExclude(1, 2);
         two = new TestObjectEqualsExclude(2, 2);
 
-        assertTrue(EqualsBuilder.reflectionEquals(one, two));
+        assertTrueIfAccessible(EqualsBuilder.reflectionEquals(one, two));
     }
 
     /**
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/JsonToStringStyleNoForceTest.java
similarity index 59%
copy from 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
copy to 
src/test/java/org/apache/commons/lang3/builder/JsonToStringStyleNoForceTest.java
index be0f5227c..b3d3033b0 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/JsonToStringStyleNoForceTest.java
@@ -14,25 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.apache.commons.lang3.AbstractLangTest;
-import org.junit.jupiter.api.Test;
-
-class ReflectionToStringBuilderSummaryTest extends AbstractLangTest {
 
-    @SuppressWarnings("unused")
-    private final String stringField = "string";
-
-    @ToStringSummary
-    private final String summaryString = "summary";
+package org.apache.commons.lang3.builder;
 
-    @Test
-    void testSummary() {
-        assertEquals("[stringField=string,summaryString=<String>]",
-                new ReflectionToStringBuilder(this, 
ToStringStyle.NO_CLASS_NAME_STYLE).build());
-    }
+import org.junitpioneer.jupiter.SetSystemProperty;
 
+/**
+ * Like {@link JsonToStringStyleTest} with force accessible disabled.
+ */
+@SetSystemProperty(key = AbstractReflectionTest.FORCE_ACCESSIBLE, value = 
"false")
+public class JsonToStringStyleNoForceTest extends JsonToStringStyleTest {
+    // TODO Override failing methods with new assertions
 }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/JsonToStringStyleTest.java 
b/src/test/java/org/apache/commons/lang3/builder/JsonToStringStyleTest.java
index 5b55e2b1d..3925cdd63 100644
--- a/src/test/java/org/apache/commons/lang3/builder/JsonToStringStyleTest.java
+++ b/src/test/java/org/apache/commons/lang3/builder/JsonToStringStyleTest.java
@@ -28,7 +28,6 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.commons.lang3.AbstractLangTest;
 import org.apache.commons.lang3.builder.ToStringStyleTest.Person;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
@@ -37,7 +36,7 @@
 /**
  * Tests {@link JsonToStringStyleTest}.
  */
-class JsonToStringStyleTest extends AbstractLangTest {
+class JsonToStringStyleTest extends AbstractBuilderTest {
 
     static class AcademyClass {
         Teacher teacher;
@@ -214,9 +213,9 @@ void testArrayEnum() {
 
         teacher.setHobbies(hobbies);
 
-        assertEquals(teacher.toString(), 
"{\"hobbies\":[\"BOOK\",\"SPORT\",\"MUSIC\"]}");
+        assertEqualsIfAccessible(teacher.toString(), 
"{\"hobbies\":[\"BOOK\",\"SPORT\",\"MUSIC\"]}");
         teacher.setHobbies(new Hobby[0]);
-        assertEquals(teacher.toString(), "{\"hobbies\":[]}");
+        assertEqualsIfAccessible(teacher.toString(), "{\"hobbies\":[]}");
         teacher.setHobbies(null);
         assertEquals(teacher.toString(), "{\"hobbies\":null}");
     }
@@ -295,7 +294,8 @@ void testCombineListAndEnum() {
         academyClass.setStudents(students);
         academyClass.setTeacher(teacher);
 
-        assertEquals(academyClass.toString(), 
"{\"students\":[{\"hobbies\":[\"BOOK\",\"MUSIC\"]},{\"hobbies\":[]},{\"hobbies\":[\"BOOK\"]}],\"teacher\":{\"hobbies\":[\"BOOK\",\"SPORT\",\"MUSIC\"]}}");
+        assertEqualsIfAccessible(academyClass.toString(),
+                
"{\"students\":[{\"hobbies\":[\"BOOK\",\"MUSIC\"]},{\"hobbies\":[]},{\"hobbies\":[\"BOOK\"]}],\"teacher\":{\"hobbies\":[\"BOOK\",\"SPORT\",\"MUSIC\"]}}");
     }
 
     @Test
@@ -368,9 +368,9 @@ void testList() {
 
         student.setHobbies(objects);
 
-        assertEquals(student.toString(), 
"{\"hobbies\":[\"BOOK\",\"SPORT\",\"MUSIC\"]}");
+        assertEqualsIfAccessible(student.toString(), 
"{\"hobbies\":[\"BOOK\",\"SPORT\",\"MUSIC\"]}");
         student.setHobbies(new ArrayList<>());
-        assertEquals(student.toString(), "{\"hobbies\":[]}");
+        assertEqualsIfAccessible(student.toString(), "{\"hobbies\":[]}");
         student.setHobbies(null);
         assertEquals(student.toString(), "{\"hobbies\":null}");
     }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/MultilineRecursiveToStringStyleNoForceTest.java
similarity index 59%
copy from 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
copy to 
src/test/java/org/apache/commons/lang3/builder/MultilineRecursiveToStringStyleNoForceTest.java
index be0f5227c..d03c2d574 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/MultilineRecursiveToStringStyleNoForceTest.java
@@ -14,25 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.apache.commons.lang3.AbstractLangTest;
-import org.junit.jupiter.api.Test;
-
-class ReflectionToStringBuilderSummaryTest extends AbstractLangTest {
 
-    @SuppressWarnings("unused")
-    private final String stringField = "string";
-
-    @ToStringSummary
-    private final String summaryString = "summary";
+package org.apache.commons.lang3.builder;
 
-    @Test
-    void testSummary() {
-        assertEquals("[stringField=string,summaryString=<String>]",
-                new ReflectionToStringBuilder(this, 
ToStringStyle.NO_CLASS_NAME_STYLE).build());
-    }
+import org.junitpioneer.jupiter.SetSystemProperty;
 
+/**
+ * Like {@link MultilineRecursiveToStringStyleTest} with force accessible 
disabled.
+ */
+@SetSystemProperty(key = AbstractReflectionTest.FORCE_ACCESSIBLE, value = 
"false")
+public class MultilineRecursiveToStringStyleNoForceTest extends 
MultilineRecursiveToStringStyleTest {
+    // TODO Override failing methods with new assertions
 }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/MultilineRecursiveToStringStyleTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/MultilineRecursiveToStringStyleTest.java
index 4d4d7f57a..a0bb2ece2 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/MultilineRecursiveToStringStyleTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/MultilineRecursiveToStringStyleTest.java
@@ -22,12 +22,11 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.lang3.AbstractLangTest;
 import org.junit.jupiter.api.Test;
 
 /**
  */
-class MultilineRecursiveToStringStyleTest extends AbstractLangTest {
+class MultilineRecursiveToStringStyleTest extends AbstractBuilderTest {
 
     static class Account {
         Customer owner;
@@ -110,7 +109,7 @@ public void boolArray() {
                 + "    false," + LS
                 + "    true" + LS
                 + "  }");
-        assertEquals(exp, toString(wa));
+        assertEqualsIfAccessible(exp, toString(wa));
     }
 
     @Test
@@ -123,7 +122,7 @@ public void byteArray() {
                 + "    1," + LS
                 + "    2" + LS
                 + "  }");
-        assertEquals(exp, toString(wa));
+        assertEqualsIfAccessible(exp, toString(wa));
     }
 
     @Test
@@ -136,7 +135,7 @@ public void charArray() {
                 + "    a," + LS
                 + "    A" + LS
                 + "  }");
-        assertEquals(exp, toString(wa));
+        assertEqualsIfAccessible(exp, toString(wa));
     }
 
     @Test
@@ -149,7 +148,7 @@ public void doubleArray() {
                 + "    1.0," + LS
                 + "    2.0" + LS
                 + "  }");
-        assertEquals(exp, toString(wa));
+        assertEqualsIfAccessible(exp, toString(wa));
     }
 
     @Test
@@ -162,7 +161,7 @@ public void floatArray() {
                 + "    1.0," + LS
                 + "    2.0" + LS
                 + "  }");
-        assertEquals(exp, toString(wa));
+        assertEqualsIfAccessible(exp, toString(wa));
     }
 
     private String getClassPrefix(final Object object) {
@@ -193,7 +192,7 @@ public void intArray() {
                 + "    1," + LS
                 + "    2" + LS
                 + "  }");
-        assertEquals(exp, toString(wa));
+        assertEqualsIfAccessible(exp, toString(wa));
     }
 
     @Test
@@ -206,7 +205,7 @@ public void longArray() {
                 + "    1," + LS
                 + "    2" + LS
                 + "  }");
-        assertEquals(exp, toString(wa));
+        assertEqualsIfAccessible(exp, toString(wa));
     }
 
     @Test
@@ -229,7 +228,7 @@ public void nestedAndArray() {
                         + "    ]" + LS
                         + "  }" + LS
                         + "]";
-        assertEquals(expected, toString(acc));
+        assertEqualsIfAccessible(expected, toString(acc));
     }
 
     @Test
@@ -244,7 +243,7 @@ public void nestedElements() {
                    + "  ]," + LS
                    + "  name=Douglas Adams" + LS
                 + "]";
-        assertEquals(exp, toString(customer));
+        assertEqualsIfAccessible(exp, toString(customer));
     }
 
     @Test
@@ -264,7 +263,7 @@ public void shortArray() {
                 + "    1," + LS
                 + "    2" + LS
                 + "  }");
-        assertEquals(exp, toString(wa));
+        assertEqualsIfAccessible(exp, toString(wa));
     }
 
     @Test
@@ -274,7 +273,7 @@ public void simpleObject() {
                         + "  amount=100.0," + LS
                         + "  date=2014.10.15" + LS
                         + "]";
-        assertEquals(expected, toString(tx));
+        assertEqualsIfAccessible(expected, toString(tx));
     }
 
     @Test
@@ -287,7 +286,7 @@ public void stringArray() {
                 + "    a," + LS
                 + "    A" + LS
                 + "  }");
-        assertEquals(exp, toString(wa));
+        assertEqualsIfAccessible(exp, toString(wa));
     }
 
     @Test
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/RecursiveToStringStyleNoForceTest.java
similarity index 59%
copy from 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
copy to 
src/test/java/org/apache/commons/lang3/builder/RecursiveToStringStyleNoForceTest.java
index be0f5227c..5900ef6a5 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/RecursiveToStringStyleNoForceTest.java
@@ -14,25 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.apache.commons.lang3.AbstractLangTest;
-import org.junit.jupiter.api.Test;
-
-class ReflectionToStringBuilderSummaryTest extends AbstractLangTest {
 
-    @SuppressWarnings("unused")
-    private final String stringField = "string";
-
-    @ToStringSummary
-    private final String summaryString = "summary";
+package org.apache.commons.lang3.builder;
 
-    @Test
-    void testSummary() {
-        assertEquals("[stringField=string,summaryString=<String>]",
-                new ReflectionToStringBuilder(this, 
ToStringStyle.NO_CLASS_NAME_STYLE).build());
-    }
+import org.junitpioneer.jupiter.SetSystemProperty;
 
+/**
+ * Like {@link RecursiveToStringStyleTest} with force accessible disabled.
+ */
+@SetSystemProperty(key = AbstractReflectionTest.FORCE_ACCESSIBLE, value = 
"false")
+public class RecursiveToStringStyleNoForceTest extends 
RecursiveToStringStyleTest {
+    // Empty.
 }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/RecursiveToStringStyleTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/RecursiveToStringStyleTest.java
index ca4bd33b0..a1238623d 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/RecursiveToStringStyleTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/RecursiveToStringStyleTest.java
@@ -50,6 +50,7 @@ static class Job {
          */
         String title;
     }
+
     static class Person {
 
         /**
@@ -211,9 +212,11 @@ void testPerson() {
         p.job = new Job();
         p.job.title = "Manager";
         final String baseStr = p.getClass().getName() + "@" + 
Integer.toHexString(System.identityHashCode(p));
-        final String jobStr  = p.job.getClass().getName() + "@" + 
Integer.toHexString(System.identityHashCode(p.job));
-        assertEquals(baseStr + "[age=33,job=" + jobStr + 
"[title=Manager],name=John Doe,smoker=false]",
-                     new ReflectionToStringBuilder(p, new 
RecursiveToStringStyle()).toString());
+        final String jobStr = p.job.getClass().getName() + "@" + 
Integer.toHexString(System.identityHashCode(p.job));
+        final ReflectionToStringBuilder builder = new 
ReflectionToStringBuilder(p, new RecursiveToStringStyle());
+        final String expected = baseStr + (builder.isForceAccessible() ? 
"[age=33,job=" + jobStr + "[title=Manager],name=John Doe,smoker=false]"
+                : "[age=<null>,job=<null>,name=<null>,smoker=<null>]");
+        assertEquals(expected, builder.toString());
     }
 
     @Test
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderCustomImplementationNoForceTest.java
similarity index 59%
copy from 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
copy to 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderCustomImplementationNoForceTest.java
index be0f5227c..f592ce482 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderCustomImplementationNoForceTest.java
@@ -14,25 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.apache.commons.lang3.AbstractLangTest;
-import org.junit.jupiter.api.Test;
-
-class ReflectionToStringBuilderSummaryTest extends AbstractLangTest {
 
-    @SuppressWarnings("unused")
-    private final String stringField = "string";
-
-    @ToStringSummary
-    private final String summaryString = "summary";
+package org.apache.commons.lang3.builder;
 
-    @Test
-    void testSummary() {
-        assertEquals("[stringField=string,summaryString=<String>]",
-                new ReflectionToStringBuilder(this, 
ToStringStyle.NO_CLASS_NAME_STYLE).build());
-    }
+import org.junitpioneer.jupiter.SetSystemProperty;
 
+/**
+ * Like {@link ReflectionToStringBuilderCustomImplementationTest} with force 
accessible disabled.
+ */
+@SetSystemProperty(key = AbstractReflectionTest.FORCE_ACCESSIBLE, value = 
"false")
+public class ReflectionToStringBuilderCustomImplementationNoForceTest extends 
ReflectionToStringBuilderCustomImplementationTest {
+    // Empty
 }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderCustomImplementationTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderCustomImplementationTest.java
index e8a2d5302..f7df85357 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderCustomImplementationTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderCustomImplementationTest.java
@@ -14,20 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package org.apache.commons.lang3.builder;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.lang.reflect.Field;
 
-import org.apache.commons.lang3.AbstractLangTest;
 import org.junit.jupiter.api.Test;
 
 /**
- * Tests {@link ReflectionToStringBuilder} always uses {@link 
ReflectionToStringBuilder#getValue(Field)} to get the
- * value of every field in the class.
+ * Tests {@link ReflectionToStringBuilder} always uses {@link 
ReflectionToStringBuilder#getValue(Field)} to get the value of every field in 
the class.
  */
-class ReflectionToStringBuilderCustomImplementationTest extends 
AbstractLangTest {
+class ReflectionToStringBuilderCustomImplementationTest extends 
AbstractBuilderTest {
 
     public static class CustomReflectionToStringBuilder extends 
ReflectionToStringBuilder {
 
@@ -48,8 +47,7 @@ protected Object getValue(final Field field) throws 
IllegalAccessException {
 
     @Test
     void testBuild() {
-        assertEquals("[stringField=prefix:string]",
+        assertEquals("[stringField=" + accessibleString("prefix:string") + "]",
                 new CustomReflectionToStringBuilder(this, 
ToStringStyle.NO_CLASS_NAME_STYLE).build());
     }
-
 }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeNoForceTest.java
similarity index 59%
copy from 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
copy to 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeNoForceTest.java
index be0f5227c..52aad0f46 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeNoForceTest.java
@@ -14,25 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.apache.commons.lang3.AbstractLangTest;
-import org.junit.jupiter.api.Test;
-
-class ReflectionToStringBuilderSummaryTest extends AbstractLangTest {
 
-    @SuppressWarnings("unused")
-    private final String stringField = "string";
-
-    @ToStringSummary
-    private final String summaryString = "summary";
+package org.apache.commons.lang3.builder;
 
-    @Test
-    void testSummary() {
-        assertEquals("[stringField=string,summaryString=<String>]",
-                new ReflectionToStringBuilder(this, 
ToStringStyle.NO_CLASS_NAME_STYLE).build());
-    }
+import org.junitpioneer.jupiter.SetSystemProperty;
 
+/**
+ * Like {@link ReflectionToStringBuilderExcludeTest} with force accessible 
disabled.
+ */
+@SetSystemProperty(key = AbstractReflectionTest.FORCE_ACCESSIBLE, value = 
"false")
+public class ReflectionToStringBuilderExcludeNoForceTest extends 
ReflectionToStringBuilderExcludeTest {
+    // TODO Override failing methods with new assertions
 }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeNullValuesNoForceTest.java
similarity index 59%
copy from 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
copy to 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeNullValuesNoForceTest.java
index be0f5227c..20b927822 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeNullValuesNoForceTest.java
@@ -14,25 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.apache.commons.lang3.AbstractLangTest;
-import org.junit.jupiter.api.Test;
-
-class ReflectionToStringBuilderSummaryTest extends AbstractLangTest {
 
-    @SuppressWarnings("unused")
-    private final String stringField = "string";
-
-    @ToStringSummary
-    private final String summaryString = "summary";
+package org.apache.commons.lang3.builder;
 
-    @Test
-    void testSummary() {
-        assertEquals("[stringField=string,summaryString=<String>]",
-                new ReflectionToStringBuilder(this, 
ToStringStyle.NO_CLASS_NAME_STYLE).build());
-    }
+import org.junitpioneer.jupiter.SetSystemProperty;
 
+/**
+ * Like {@link ReflectionToStringBuilderExcludeNullValuesTest} with force 
accessible disabled.
+ */
+@SetSystemProperty(key = AbstractReflectionTest.FORCE_ACCESSIBLE, value = 
"false")
+public class ReflectionToStringBuilderExcludeNullValuesNoForceTest extends 
ReflectionToStringBuilderExcludeNullValuesTest {
+    // TODO Override failing methods with new assertions
 }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeNullValuesTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeNullValuesTest.java
index f40049a8c..8e161f76a 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeNullValuesTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeNullValuesTest.java
@@ -20,10 +20,9 @@
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import org.apache.commons.lang3.AbstractLangTest;
 import org.junit.jupiter.api.Test;
 
-class ReflectionToStringBuilderExcludeNullValuesTest extends AbstractLangTest {
+class ReflectionToStringBuilderExcludeNullValuesTest extends 
AbstractBuilderTest {
 
     static class TestFixture {
         @SuppressWarnings("unused")
@@ -49,17 +48,17 @@ void test_ConstructorOption() {
         ReflectionToStringBuilder builder = new 
ReflectionToStringBuilder(BOTH_NON_NULL, null, null, null, false, false, true);
         assertTrue(builder.isExcludeNullValues());
         String toString = builder.toString();
-        assertTrue(toString.contains(INTEGER_FIELD_NAME));
-        assertTrue(toString.contains(STRING_FIELD_NAME));
+        assertTrueIfAccessible(toString.contains(INTEGER_FIELD_NAME));
+        assertTrueIfAccessible(toString.contains(STRING_FIELD_NAME));
 
         builder = new ReflectionToStringBuilder(FIRST_NULL, null, null, null, 
false, false, true);
         toString = builder.toString();
         assertFalse(toString.contains(INTEGER_FIELD_NAME));
-        assertTrue(toString.contains(STRING_FIELD_NAME));
+        assertTrueIfAccessible(toString.contains(STRING_FIELD_NAME));
 
         builder = new ReflectionToStringBuilder(SECOND_NULL, null, null, null, 
false, false, true);
         toString = builder.toString();
-        assertTrue(toString.contains(INTEGER_FIELD_NAME));
+        assertTrueIfAccessible(toString.contains(INTEGER_FIELD_NAME));
         assertFalse(toString.contains(STRING_FIELD_NAME));
 
         builder = new ReflectionToStringBuilder(BOTH_NULL, null, null, null, 
false, false, true);
@@ -120,17 +119,17 @@ void test_excludeNull() {
 
         //test normal case
         String toString = ReflectionToStringBuilder.toString(BOTH_NON_NULL, 
null, false, false, true, null);
-        assertTrue(toString.contains(INTEGER_FIELD_NAME));
-        assertTrue(toString.contains(STRING_FIELD_NAME));
+        assertTrueIfAccessible(toString.contains(INTEGER_FIELD_NAME));
+        assertTrueIfAccessible(toString.contains(STRING_FIELD_NAME));
 
         //make one null
         toString = ReflectionToStringBuilder.toString(FIRST_NULL, null, false, 
false, true, null);
         assertFalse(toString.contains(INTEGER_FIELD_NAME));
-        assertTrue(toString.contains(STRING_FIELD_NAME));
+        assertTrueIfAccessible(toString.contains(STRING_FIELD_NAME));
 
         //other one null
         toString = ReflectionToStringBuilder.toString(SECOND_NULL, null, 
false, false, true, null);
-        assertTrue(toString.contains(INTEGER_FIELD_NAME));
+        assertTrueIfAccessible(toString.contains(INTEGER_FIELD_NAME));
         assertFalse(toString.contains(STRING_FIELD_NAME));
 
         //both null
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeTest.java
index a4d684b3f..3e85c74ab 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeTest.java
@@ -24,13 +24,12 @@
 import java.util.Collection;
 import java.util.List;
 
-import org.apache.commons.lang3.AbstractLangTest;
 import org.apache.commons.lang3.ArrayUtils;
 import org.junit.jupiter.api.Test;
 
 /**
  */
-class ReflectionToStringBuilderExcludeTest extends AbstractLangTest {
+class ReflectionToStringBuilderExcludeTest extends AbstractBuilderTest {
 
     final class TestFixture {
         @SuppressWarnings("unused")
@@ -123,7 +122,7 @@ void test_toStringExcludeNullCollection() {
 
     private void validateNonSecretField(final String toString) {
         assertTrue(toString.contains(NOT_SECRET_FIELD));
-        assertTrue(toString.contains(NOT_SECRET_VALUE));
+        assertTrueIfAccessible(toString.contains(NOT_SECRET_VALUE));
     }
 
     private void validateSecretFieldAbsent(final String toString) {
@@ -132,7 +131,7 @@ private void validateSecretFieldAbsent(final String 
toString) {
     }
 
     private void validateSecretFieldPresent(final String toString) {
-        assertTrue(toString.indexOf(SECRET_VALUE) > 0);
+        assertTrueIfAccessible(toString.indexOf(SECRET_VALUE) > 0);
         validateNonSecretField(toString);
     }
 }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeWithAnnotationNoForceTest.java
similarity index 59%
copy from 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
copy to 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeWithAnnotationNoForceTest.java
index be0f5227c..8cf66e31d 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeWithAnnotationNoForceTest.java
@@ -14,25 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.apache.commons.lang3.AbstractLangTest;
-import org.junit.jupiter.api.Test;
-
-class ReflectionToStringBuilderSummaryTest extends AbstractLangTest {
 
-    @SuppressWarnings("unused")
-    private final String stringField = "string";
-
-    @ToStringSummary
-    private final String summaryString = "summary";
+package org.apache.commons.lang3.builder;
 
-    @Test
-    void testSummary() {
-        assertEquals("[stringField=string,summaryString=<String>]",
-                new ReflectionToStringBuilder(this, 
ToStringStyle.NO_CLASS_NAME_STYLE).build());
-    }
+import org.junitpioneer.jupiter.SetSystemProperty;
 
+/**
+ * Like {@link ReflectionToStringBuilderExcludeWithAnnotationTest} with force 
accessible disabled.
+ */
+@SetSystemProperty(key = AbstractReflectionTest.FORCE_ACCESSIBLE, value = 
"false")
+public class ReflectionToStringBuilderExcludeWithAnnotationNoForceTest extends 
ReflectionToStringBuilderExcludeWithAnnotationTest {
+    // TODO Override failing methods with new assertions
 }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeWithAnnotationTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeWithAnnotationTest.java
index 55f9f48ce..acb811af0 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeWithAnnotationTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeWithAnnotationTest.java
@@ -20,13 +20,12 @@
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import org.apache.commons.lang3.AbstractLangTest;
 import org.junit.jupiter.api.Test;
 
 /**
  * Test class for ToStringExclude annotation
  */
-class ReflectionToStringBuilderExcludeWithAnnotationTest extends 
AbstractLangTest {
+class ReflectionToStringBuilderExcludeWithAnnotationTest extends 
AbstractBuilderTest {
 
     final class TestFixture {
         @ToStringExclude
@@ -50,7 +49,7 @@ void test_toStringExclude() {
         assertFalse(toString.contains(EXCLUDED_FIELD_NAME));
         assertFalse(toString.contains(EXCLUDED_FIELD_VALUE));
         assertTrue(toString.contains(INCLUDED_FIELD_NAME));
-        assertTrue(toString.contains(INCLUDED_FIELD_VALUE));
+        assertTrueIfAccessible(toString.contains(INCLUDED_FIELD_VALUE));
     }
 
 }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderIncludeNoForceTest.java
similarity index 59%
copy from 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
copy to 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderIncludeNoForceTest.java
index be0f5227c..25a7ec0bd 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderIncludeNoForceTest.java
@@ -14,25 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.apache.commons.lang3.AbstractLangTest;
-import org.junit.jupiter.api.Test;
-
-class ReflectionToStringBuilderSummaryTest extends AbstractLangTest {
 
-    @SuppressWarnings("unused")
-    private final String stringField = "string";
-
-    @ToStringSummary
-    private final String summaryString = "summary";
+package org.apache.commons.lang3.builder;
 
-    @Test
-    void testSummary() {
-        assertEquals("[stringField=string,summaryString=<String>]",
-                new ReflectionToStringBuilder(this, 
ToStringStyle.NO_CLASS_NAME_STYLE).build());
-    }
+import org.junitpioneer.jupiter.SetSystemProperty;
 
+/**
+ * Like {@link ReflectionToStringBuilderIncludeTest} with force accessible 
disabled.
+ */
+@SetSystemProperty(key = AbstractReflectionTest.FORCE_ACCESSIBLE, value = 
"false")
+public class ReflectionToStringBuilderIncludeNoForceTest extends 
ReflectionToStringBuilderIncludeTest {
+    // TODO Override failing methods with new assertions
 }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderIncludeTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderIncludeTest.java
index 56de2526e..c42bbaa9b 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderIncludeTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderIncludeTest.java
@@ -25,11 +25,10 @@
 import java.util.Collection;
 import java.util.List;
 
-import org.apache.commons.lang3.AbstractLangTest;
 import org.apache.commons.lang3.ArrayUtils;
 import org.junit.jupiter.api.Test;
 
-class ReflectionToStringBuilderIncludeTest extends AbstractLangTest {
+class ReflectionToStringBuilderIncludeTest extends AbstractBuilderTest {
 
     final class TestFeature {
         @SuppressWarnings("unused")
@@ -214,7 +213,7 @@ private void validateIncludeFieldsPresent(final String 
toString, final String[]
         }
 
         for (final String includeValue : valuesToShow) {
-            assertTrue(toString.indexOf(includeValue) > 0);
+            assertTrueIfAccessible(toString.indexOf(includeValue) > 0);
         }
 
         validateNonIncludeFieldsAbsent(toString, fieldsToShow, valuesToShow);
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryNoForceTest.java
similarity index 59%
copy from 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
copy to 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryNoForceTest.java
index be0f5227c..e9605f920 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryNoForceTest.java
@@ -14,25 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.apache.commons.lang3.AbstractLangTest;
-import org.junit.jupiter.api.Test;
-
-class ReflectionToStringBuilderSummaryTest extends AbstractLangTest {
 
-    @SuppressWarnings("unused")
-    private final String stringField = "string";
-
-    @ToStringSummary
-    private final String summaryString = "summary";
+package org.apache.commons.lang3.builder;
 
-    @Test
-    void testSummary() {
-        assertEquals("[stringField=string,summaryString=<String>]",
-                new ReflectionToStringBuilder(this, 
ToStringStyle.NO_CLASS_NAME_STYLE).build());
-    }
+import org.junitpioneer.jupiter.SetSystemProperty;
 
+/**
+ * Like {@link ReflectionToStringBuilderSummaryTest} with force accessible 
disabled.
+ */
+@SetSystemProperty(key = AbstractReflectionTest.FORCE_ACCESSIBLE, value = 
"false")
+public class ReflectionToStringBuilderSummaryNoForceTest extends 
ReflectionToStringBuilderSummaryTest {
+    // TODO Override failing methods with new assertions
 }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
index be0f5227c..78ced90f1 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
@@ -16,12 +16,9 @@
  */
 package org.apache.commons.lang3.builder;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.apache.commons.lang3.AbstractLangTest;
 import org.junit.jupiter.api.Test;
 
-class ReflectionToStringBuilderSummaryTest extends AbstractLangTest {
+class ReflectionToStringBuilderSummaryTest extends AbstractBuilderTest {
 
     @SuppressWarnings("unused")
     private final String stringField = "string";
@@ -31,8 +28,7 @@ class ReflectionToStringBuilderSummaryTest extends 
AbstractLangTest {
 
     @Test
     void testSummary() {
-        assertEquals("[stringField=string,summaryString=<String>]",
-                new ReflectionToStringBuilder(this, 
ToStringStyle.NO_CLASS_NAME_STYLE).build());
+        
assertEqualsIfAccessible("[stringField=string,summaryString=<String>]", new 
ReflectionToStringBuilder(this, ToStringStyle.NO_CLASS_NAME_STYLE).build());
     }
 
 }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
 
b/src/test/java/org/apache/commons/lang3/builder/ToStringBuilderNoForceTest.java
similarity index 59%
copy from 
src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
copy to 
src/test/java/org/apache/commons/lang3/builder/ToStringBuilderNoForceTest.java
index be0f5227c..2b65c47f3 100644
--- 
a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderSummaryTest.java
+++ 
b/src/test/java/org/apache/commons/lang3/builder/ToStringBuilderNoForceTest.java
@@ -14,25 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.commons.lang3.builder;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.apache.commons.lang3.AbstractLangTest;
-import org.junit.jupiter.api.Test;
-
-class ReflectionToStringBuilderSummaryTest extends AbstractLangTest {
 
-    @SuppressWarnings("unused")
-    private final String stringField = "string";
-
-    @ToStringSummary
-    private final String summaryString = "summary";
+package org.apache.commons.lang3.builder;
 
-    @Test
-    void testSummary() {
-        assertEquals("[stringField=string,summaryString=<String>]",
-                new ReflectionToStringBuilder(this, 
ToStringStyle.NO_CLASS_NAME_STYLE).build());
-    }
+import org.junitpioneer.jupiter.SetSystemProperty;
 
+/**
+ * Like {@link ToStringBuilderTest} with force accessible disabled.
+ */
+@SetSystemProperty(key = AbstractReflectionTest.FORCE_ACCESSIBLE, value = 
"false")
+public class ToStringBuilderNoForceTest extends ToStringBuilderTest {
+    // TODO Override failing methods with new assertions
 }
diff --git 
a/src/test/java/org/apache/commons/lang3/builder/ToStringBuilderTest.java 
b/src/test/java/org/apache/commons/lang3/builder/ToStringBuilderTest.java
index befd4ae8b..fc79105af 100644
--- a/src/test/java/org/apache/commons/lang3/builder/ToStringBuilderTest.java
+++ b/src/test/java/org/apache/commons/lang3/builder/ToStringBuilderTest.java
@@ -26,13 +26,12 @@
 import java.util.HashMap;
 import java.util.List;
 
-import org.apache.commons.lang3.AbstractLangTest;
 import org.junit.jupiter.api.Test;
 
 /**
  * Tests for {@link org.apache.commons.lang3.builder.ToStringBuilder}.
  */
-class ToStringBuilderTest extends AbstractLangTest {
+class ToStringBuilderTest extends AbstractBuilderTest {
 
     /**
      * Test fixture for ReflectionToStringBuilder.toString() for statics.
@@ -655,20 +654,20 @@ void testGetSetDefault() {
     @Test
     void testInheritedReflectionStatics() {
         final InheritedReflectionStaticFieldsFixture instance1 = new 
InheritedReflectionStaticFieldsFixture();
-        assertEquals(toBaseString(instance1) + 
"[staticInt2=67890,staticString2=staticString2]",
+        assertEqualsIfAccessible(toBaseString(instance1) + 
"[staticInt2=67890,staticString2=staticString2]",
                 ReflectionToStringBuilder.toString(instance1, null, false, 
true, InheritedReflectionStaticFieldsFixture.class));
-        assertEquals(toBaseString(instance1) + 
"[staticInt2=67890,staticString2=staticString2,staticInt=12345,staticString=staticString]",
+        assertEqualsIfAccessible(toBaseString(instance1) + 
"[staticInt2=67890,staticString2=staticString2,staticInt=12345,staticString=staticString]",
                 ReflectionToStringBuilder.toString(instance1, null, false, 
true, SimpleReflectionStaticFieldsFixture.class));
-        assertEquals(toBaseString(instance1) + 
"[staticInt2=67890,staticString2=staticString2,staticInt=12345,staticString=staticString]",
+        assertEqualsIfAccessible(toBaseString(instance1) + 
"[staticInt2=67890,staticString2=staticString2,staticInt=12345,staticString=staticString]",
                 this.toStringWithStatics(instance1, null, 
SimpleReflectionStaticFieldsFixture.class));
-        assertEquals(toBaseString(instance1) + 
"[staticInt2=67890,staticString2=staticString2,staticInt=12345,staticString=staticString]",
+        assertEqualsIfAccessible(toBaseString(instance1) + 
"[staticInt2=67890,staticString2=staticString2,staticInt=12345,staticString=staticString]",
                 this.toStringWithStatics(instance1, null, 
SimpleReflectionStaticFieldsFixture.class));
     }
 
     @Test
     void testInnerClassReflection() {
         final Outer outer = new Outer();
-        assertEquals(toBaseString(outer) + "[inner=" + 
toBaseString(outer.inner) + "[]]", outer.toString());
+        assertEqualsIfAccessible(toBaseString(outer) + "[inner=" + 
toBaseString(outer.inner) + "[]]", outer.toString());
     }
 
     @Test
@@ -790,9 +789,9 @@ void testReflectionArrayAndObjectCycle() {
         final Object[] objects = new Object[1];
         final SimpleReflectionTestFixture simple = new 
SimpleReflectionTestFixture(objects);
         objects[0] = simple;
-        assertEquals(toBaseString(objects) + "[{" + toBaseString(simple) + 
"[o=" + toBaseString(objects) + "]}]",
+        assertEqualsIfAccessible(toBaseString(objects) + "[{" + 
toBaseString(simple) + "[o=" + toBaseString(objects) + "]}]",
                 ToStringBuilder.reflectionToString(objects));
-        assertEquals(toBaseString(simple) + "[o={" + toBaseString(simple) + 
"}]", ToStringBuilder.reflectionToString(simple));
+        assertEqualsIfAccessible(toBaseString(simple) + "[o={" + 
toBaseString(simple) + "}]", ToStringBuilder.reflectionToString(simple));
     }
 
     @Test
@@ -837,9 +836,9 @@ void testReflectionArrayCycleLevel2() {
     void testReflectionBoolean() {
         Boolean b;
         b = Boolean.TRUE;
-        assertEquals(toBaseString(b) + "[value=true]", 
ToStringBuilder.reflectionToString(b));
+        assertEqualsIfAccessible(toBaseString(b) + "[value=true]", 
ToStringBuilder.reflectionToString(b));
         b = Boolean.FALSE;
-        assertEquals(toBaseString(b) + "[value=false]", 
ToStringBuilder.reflectionToString(b));
+        assertEqualsIfAccessible(toBaseString(b) + "[value=false]", 
ToStringBuilder.reflectionToString(b));
     }
 
     @Test
@@ -885,7 +884,7 @@ void testReflectionByteArrayArray() {
     @Test
     void testReflectionCharacter() {
         final Character c = 'A';
-        assertEquals(toBaseString(c) + "[value=A]", 
ToStringBuilder.reflectionToString(c));
+        assertEqualsIfAccessible(toBaseString(c) + "[value=A]", 
ToStringBuilder.reflectionToString(c));
     }
 
     @Test
@@ -946,25 +945,24 @@ void testReflectionFloatArrayArray() {
     void testReflectionHierarchy() {
         final ReflectionTestFixtureA baseA = new ReflectionTestFixtureA();
         String baseString = toBaseString(baseA);
-        assertEquals(baseString + "[a=a]", 
ToStringBuilder.reflectionToString(baseA));
-        assertEquals(baseString + "[a=a]", 
ToStringBuilder.reflectionToString(baseA, null));
-        assertEquals(baseString + "[a=a]", 
ToStringBuilder.reflectionToString(baseA, null, false));
-        assertEquals(baseString + "[a=a,transientA=t]", 
ToStringBuilder.reflectionToString(baseA, null, true));
-        assertEquals(baseString + "[a=a]", 
ToStringBuilder.reflectionToString(baseA, null, false, null));
-        assertEquals(baseString + "[a=a]", 
ToStringBuilder.reflectionToString(baseA, null, false, Object.class));
-        assertEquals(baseString + "[a=a]", 
ToStringBuilder.reflectionToString(baseA, null, false, 
ReflectionTestFixtureA.class));
-
+        assertEqualsIfAccessible(baseString + "[a=a]", 
ToStringBuilder.reflectionToString(baseA));
+        assertEqualsIfAccessible(baseString + "[a=a]", 
ToStringBuilder.reflectionToString(baseA, null));
+        assertEqualsIfAccessible(baseString + "[a=a]", 
ToStringBuilder.reflectionToString(baseA, null, false));
+        assertEqualsIfAccessible(baseString + "[a=a,transientA=t]", 
ToStringBuilder.reflectionToString(baseA, null, true));
+        assertEqualsIfAccessible(baseString + "[a=a]", 
ToStringBuilder.reflectionToString(baseA, null, false, null));
+        assertEqualsIfAccessible(baseString + "[a=a]", 
ToStringBuilder.reflectionToString(baseA, null, false, Object.class));
+        assertEqualsIfAccessible(baseString + "[a=a]", 
ToStringBuilder.reflectionToString(baseA, null, false, 
ReflectionTestFixtureA.class));
         final ReflectionTestFixtureB baseB = new ReflectionTestFixtureB();
         baseString = toBaseString(baseB);
-        assertEquals(baseString + "[b=b,a=a]", 
ToStringBuilder.reflectionToString(baseB));
-        assertEquals(baseString + "[b=b,a=a]", 
ToStringBuilder.reflectionToString(baseB));
-        assertEquals(baseString + "[b=b,a=a]", 
ToStringBuilder.reflectionToString(baseB, null));
-        assertEquals(baseString + "[b=b,a=a]", 
ToStringBuilder.reflectionToString(baseB, null, false));
-        assertEquals(baseString + "[b=b,transientB=t,a=a,transientA=t]", 
ToStringBuilder.reflectionToString(baseB, null, true));
-        assertEquals(baseString + "[b=b,a=a]", 
ToStringBuilder.reflectionToString(baseB, null, false, null));
-        assertEquals(baseString + "[b=b,a=a]", 
ToStringBuilder.reflectionToString(baseB, null, false, Object.class));
-        assertEquals(baseString + "[b=b,a=a]", 
ToStringBuilder.reflectionToString(baseB, null, false, 
ReflectionTestFixtureA.class));
-        assertEquals(baseString + "[b=b]", 
ToStringBuilder.reflectionToString(baseB, null, false, 
ReflectionTestFixtureB.class));
+        assertEqualsIfAccessible(baseString + "[b=b,a=a]", 
ToStringBuilder.reflectionToString(baseB));
+        assertEqualsIfAccessible(baseString + "[b=b,a=a]", 
ToStringBuilder.reflectionToString(baseB));
+        assertEqualsIfAccessible(baseString + "[b=b,a=a]", 
ToStringBuilder.reflectionToString(baseB, null));
+        assertEqualsIfAccessible(baseString + "[b=b,a=a]", 
ToStringBuilder.reflectionToString(baseB, null, false));
+        assertEqualsIfAccessible(baseString + 
"[b=b,transientB=t,a=a,transientA=t]", 
ToStringBuilder.reflectionToString(baseB, null, true));
+        assertEqualsIfAccessible(baseString + "[b=b,a=a]", 
ToStringBuilder.reflectionToString(baseB, null, false, null));
+        assertEqualsIfAccessible(baseString + "[b=b,a=a]", 
ToStringBuilder.reflectionToString(baseB, null, false, Object.class));
+        assertEqualsIfAccessible(baseString + "[b=b,a=a]", 
ToStringBuilder.reflectionToString(baseB, null, false, 
ReflectionTestFixtureA.class));
+        assertEqualsIfAccessible(baseString + "[b=b]", 
ToStringBuilder.reflectionToString(baseB, null, false, 
ReflectionTestFixtureB.class));
     }
 
     // Reflection hierarchy tests
@@ -973,13 +971,14 @@ void testReflectionHierarchyArrayList() {
         // LANG-1337 without this, the generated string can differ depending 
on the JVM version/vendor
         final List<Object> list = new ArrayList<>(ARRAYLIST_INITIAL_CAPACITY);
         final String baseString = toBaseString(list);
-        final String expectedWithTransients = baseString
-                + 
"[elementData={<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>},size=0,modCount=0]";
+        final String expectedWithTransients = baseString + "[elementData="
+                + 
accessibleString("{<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>}")
 + ",size=" + accessibleString("0") + ",modCount="
+                + accessibleString("0") + "]";
         final String toStringWithTransients = 
ToStringBuilder.reflectionToString(list, null, true);
         if (!expectedWithTransients.equals(toStringWithTransients)) {
             assertEquals(expectedWithTransients, toStringWithTransients);
         }
-        final String expectedWithoutTransients = baseString + "[size=0]";
+        final String expectedWithoutTransients = baseString + "[size=" + 
accessibleString("0") + "]";
         final String toStringWithoutTransients = 
ToStringBuilder.reflectionToString(list, null, false);
         if (!expectedWithoutTransients.equals(toStringWithoutTransients)) {
             assertEquals(expectedWithoutTransients, toStringWithoutTransients);
@@ -1009,7 +1008,7 @@ void testReflectionIntArrayArray() {
      */
     @Test
     void testReflectionInteger() {
-        assertEquals(baseStr + "[value=5]", 
ToStringBuilder.reflectionToString(base));
+        assertEqualsIfAccessible(baseStr + "[value=5]", 
ToStringBuilder.reflectionToString(base));
     }
 
     @Test
@@ -1053,7 +1052,7 @@ void testReflectionObjectCycle() {
         final ReflectionTestCycleB b = new ReflectionTestCycleB();
         a.b = b;
         b.a = a;
-        assertEquals(toBaseString(a) + "[b=" + toBaseString(b) + "[a=" + 
toBaseString(a) + "]]", a.toString());
+        assertEqualsIfAccessible(toBaseString(a) + "[b=" + toBaseString(b) + 
"[a=" + toBaseString(a) + "]]", a.toString());
     }
 
     @Test
@@ -1080,14 +1079,14 @@ void testReflectionShortArray() {
     @Test
     void testReflectionStatics() {
         final ReflectionStaticFieldsFixture instance1 = new 
ReflectionStaticFieldsFixture();
-        assertEquals(toBaseString(instance1) + 
"[instanceInt=67890,instanceString=instanceString,staticInt=12345,staticString=staticString]",
+        assertEqualsIfAccessible(toBaseString(instance1) + 
"[instanceInt=67890,instanceString=instanceString,staticInt=12345,staticString=staticString]",
                 ReflectionToStringBuilder.toString(instance1, null, false, 
true, ReflectionStaticFieldsFixture.class));
-        assertEquals(toBaseString(instance1)
+        assertEqualsIfAccessible(toBaseString(instance1)
                 + 
"[instanceInt=67890,instanceString=instanceString,staticInt=12345,staticString=staticString,staticTransientInt=54321,staticTransientString=staticTransientString,transientInt=98765,transientString=transientString]",
                 ReflectionToStringBuilder.toString(instance1, null, true, 
true, ReflectionStaticFieldsFixture.class));
-        assertEquals(toBaseString(instance1) + 
"[instanceInt=67890,instanceString=instanceString,staticInt=12345,staticString=staticString]",
+        assertEqualsIfAccessible(toBaseString(instance1) + 
"[instanceInt=67890,instanceString=instanceString,staticInt=12345,staticString=staticString]",
                 this.toStringWithStatics(instance1, null, 
ReflectionStaticFieldsFixture.class));
-        assertEquals(toBaseString(instance1) + 
"[instanceInt=67890,instanceString=instanceString,staticInt=12345,staticString=staticString]",
+        assertEqualsIfAccessible(toBaseString(instance1) + 
"[instanceInt=67890,instanceString=instanceString,staticInt=12345,staticString=staticString]",
                 this.toStringWithStatics(instance1, null, 
ReflectionStaticFieldsFixture.class));
     }
 
@@ -1098,7 +1097,7 @@ void testReflectionStatics() {
     @Test
     void testSelfInstanceTwoVarsReflectionObjectCycle() {
         final SelfInstanceTwoVarsReflectionTestFixture test = new 
SelfInstanceTwoVarsReflectionTestFixture();
-        assertEquals(toBaseString(test) + "[otherType=" + 
test.getOtherType().toString() + ",typeIsSelf=" + toBaseString(test) + "]",
+        assertEqualsIfAccessible(toBaseString(test) + "[otherType=" + 
test.getOtherType().toString() + ",typeIsSelf=" + toBaseString(test) + "]",
                 test.toString());
     }
 
@@ -1108,7 +1107,7 @@ void testSelfInstanceTwoVarsReflectionObjectCycle() {
     @Test
     void testSelfInstanceVarReflectionObjectCycle() {
         final SelfInstanceVarReflectionTestFixture test = new 
SelfInstanceVarReflectionTestFixture();
-        assertEquals(toBaseString(test) + "[typeIsSelf=" + toBaseString(test) 
+ "]", test.toString());
+        assertEqualsIfAccessible(toBaseString(test) + "[typeIsSelf=" + 
toBaseString(test) + "]", test.toString());
     }
 
     @Test
@@ -1150,19 +1149,19 @@ void testShortArrayArray() {
     void testSimpleReflectionObjectCycle() {
         final SimpleReflectionTestFixture simple = new 
SimpleReflectionTestFixture();
         simple.o = simple;
-        assertEquals(toBaseString(simple) + "[o=" + toBaseString(simple) + 
"]", simple.toString());
+        assertEqualsIfAccessible(toBaseString(simple) + "[o=" + 
toBaseString(simple) + "]", simple.toString());
     }
 
     @Test
     void testSimpleReflectionStatics() {
         final SimpleReflectionStaticFieldsFixture instance1 = new 
SimpleReflectionStaticFieldsFixture();
-        assertEquals(toBaseString(instance1) + 
"[staticInt=12345,staticString=staticString]",
+        assertEqualsIfAccessible(toBaseString(instance1) + 
"[staticInt=12345,staticString=staticString]",
                 ReflectionToStringBuilder.toString(instance1, null, false, 
true, SimpleReflectionStaticFieldsFixture.class));
-        assertEquals(toBaseString(instance1) + 
"[staticInt=12345,staticString=staticString]",
+        assertEqualsIfAccessible(toBaseString(instance1) + 
"[staticInt=12345,staticString=staticString]",
                 ReflectionToStringBuilder.toString(instance1, null, true, 
true, SimpleReflectionStaticFieldsFixture.class));
-        assertEquals(toBaseString(instance1) + 
"[staticInt=12345,staticString=staticString]",
+        assertEqualsIfAccessible(toBaseString(instance1) + 
"[staticInt=12345,staticString=staticString]",
                 this.toStringWithStatics(instance1, null, 
SimpleReflectionStaticFieldsFixture.class));
-        assertEquals(toBaseString(instance1) + 
"[staticInt=12345,staticString=staticString]",
+        assertEqualsIfAccessible(toBaseString(instance1) + 
"[staticInt=12345,staticString=staticString]",
                 this.toStringWithStatics(instance1, null, 
SimpleReflectionStaticFieldsFixture.class));
     }
 

Reply via email to