@Retention(value=RUNTIME) @Target(value=TYPE) public @interface TargetClass
TargetClass.value()
or TargetClass.className()
specify the original class either as a class literal or by
name, while TargetClass.classNameProvider()
is the most flexible approach where the class name is
computed by user code. Optionally, inner classes can be specified using the TargetClass.innerClass()
property.
Based on additional annotations, the original class is modified in different ways:
Delete
or Substitute
: the annotated class is an alias for the
original class. This is the most frequently used case. All methods and fields of the annotated
class must be annotated too:
Alias
: The annotated method or field is an alias for the original element, i.e., the
annotated element does not exist at run time. All usages of the annotated element reference the
original element. For fields, the original field can be further modified using the
RecomputeFieldValue
and InjectAccessors
annotations (see the documentation of the
annotations for details).Delete
: The annotated method or field, as well as the original element, do not exist.
Any usage of them will be reported as an error.Substitute
: The annotated method replaces the original method.AnnotateOriginal
: The original method remains mostly unchanged, but with one
exception: all annotations on the annotated method are also present on the original method.Delete
: The annotated class, as well as the original class, do not exist. Any usage
of them will be reported as an error.Substitute
: The annotated class replaces the original class. All fields and methods
of the original class are per default treated as deleted, i.e., any usage of them will be
reported as an error, with the following exception: A method annotated with Substitute
replaces the original method, i.e., calls to the original method now call the annotated method; a
method annotated with KeepOriginal
keeps the original method, i.e., calls to the original
method still call the original method.Modifier and Type | Optional Element and Description |
---|---|
String |
className
Specifies the substitutee class using a class-name string.
|
Class<? extends Function<TargetClass,String>> |
classNameProvider
Specifies the substitutee class.
|
String[] |
innerClass
Specifies the suffix of the substitutee class name when it is an inner class.
|
Class<?>[] |
onlyWith
Substitute only if all provided predicates are true (default: unconditional substitution that
is always included).
|
Class<?> |
value
Specifies the substitutee class using a class literal.
|
public abstract Class<?> value
TargetClass.value()
, TargetClass.className()
or TargetClass.classNameProvider()
element can be
used to specify the substitutee class.public abstract String className
TargetClass.value()
, TargetClass.className()
or TargetClass.classNameProvider()
element can be
used to specify the substitutee class.public abstract Class<? extends Function<TargetClass,String>> classNameProvider
Function.apply(T)
method of the
provided class can compute the class name based on system properties (like the JDK version).
This annotation is the argument of the function, so the function can, e.g., build a class
name that incorporates the TargetClass.className()
property.
Either TargetClass.value()
, TargetClass.className()
or TargetClass.classNameProvider()
element can be
used to specify the substitutee class.public abstract String[] innerClass
public abstract Class<?>[] onlyWith
BooleanSupplier
or Predicate
<String>
(the parameter for Predicate.test(T)
is the "original" class name as a String
).