# loads and instantiates a class which may be inefficient depending on context
java.lang.Class#forName(java.lang.String)

# String methods which use regexes for matching
java.lang.String#split(java.lang.String)
java.lang.String#split(java.lang.String,int)
java.lang.String#replaceAll(java.lang.String,java.lang.String)
java.lang.String#replaceFirst(java.lang.String,java.lang.String)

# can initialize java.util.logging when ACCP is installed, prefer RandomUtils instead
java.util.UUID#randomUUID()

# prefer the NameMatchers/HierarchyMatchers equivalent instead
net.bytebuddy.matcher.ElementMatchers#named(java.lang.String)
net.bytebuddy.matcher.ElementMatchers#namedOneOf(java.lang.String[])
net.bytebuddy.matcher.ElementMatchers#hasSuperClass(net.bytebuddy.matcher.ElementMatcher)
net.bytebuddy.matcher.ElementMatchers#hasSuperType(net.bytebuddy.matcher.ElementMatcher)
net.bytebuddy.matcher.ElementMatchers#declaresField(net.bytebuddy.matcher.ElementMatcher)
net.bytebuddy.matcher.ElementMatchers#declaresMethod(net.bytebuddy.matcher.ElementMatcher)
net.bytebuddy.matcher.ElementMatchers#declaresAnnotation(net.bytebuddy.matcher.ElementMatcher)
net.bytebuddy.matcher.ElementMatchers#isAnnotatedWith(net.bytebuddy.matcher.ElementMatcher)
net.bytebuddy.matcher.ElementMatchers#inheritsAnnotation(net.bytebuddy.matcher.ElementMatcher)
net.bytebuddy.matcher.ElementMatchers#hasAnnotation(net.bytebuddy.matcher.ElementMatcher)
net.bytebuddy.matcher.ElementMatchers#isInterface()
net.bytebuddy.matcher.ElementMatchers#isAbstract()

# avoid System.out/err methods to prevent debug logging in production
@defaultMessage Avoid using System.out/err to prevent excess logging. To override, add @SuppressForbidden.
java.lang.System#out
java.lang.System#err

# use ConfigHelper to access environment variables instead of using System.getenv() or System.getenv(String)
@defaultMessage Use ConfigHelper to access environment variables instead of using System.getenv() or System.getenv(String)
java.lang.System#getenv()
java.lang.System#getenv(java.lang.String)

# use jdk LongAdder
@defaultMessage use LongAdder instead of the legacy jctools FixedSizeStripedLongCounter
org.jctools.counters.FixedSizeStripedLongCounter

# avoid methods that mutate final fields, as this will soon be disallowed. For more details: https://openjdk.org/jeps/500.
@defaultMessage Avoid mutating final fields (e.g. with methods such as Field::set and MethodHandles.Lookup::unreflectSetter). If the field is not final, override with @SuppressForbidden.
java.lang.reflect.Field#set(java.lang.Object,java.lang.Object)
java.lang.reflect.Field#setBoolean(java.lang.Object,boolean)
java.lang.reflect.Field#setByte(java.lang.Object,byte)
java.lang.reflect.Field#setChar(java.lang.Object,char)
java.lang.reflect.Field#setShort(java.lang.Object,short)
java.lang.reflect.Field#setInt(java.lang.Object,int)
java.lang.reflect.Field#setLong(java.lang.Object,long)
java.lang.reflect.Field#setFloat(java.lang.Object,float)
java.lang.reflect.Field#setDouble(java.lang.Object,double)
java.lang.invoke.MethodHandles.Lookup#unreflectSetter(java.lang.reflect.Field)

# avoid Java deserialization entrypoint - see warning in https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/io/ObjectInputStream.html
java.io.ObjectInputStream#readObject()
