Annotation Type Constant
-
@Documented @Retention(RUNTIME) public @interface ConstantTheConstantannotation marks a single constant value which should be selected. This is used in accord withModifyConstant, however the principles of this annotation are shared withAt.args()when using the CONSTANT injection point.Declaring multiple constant values within a single
Constantannotation will not work and will cause the mixin to not apply.Reminder: Micromixin-transformer (and any other transformer for that matter) can see which attributes of an annotation have been set and which have not. More specifically, the javac (TM) compiler does not include the default values of annotation attributes, which allows micromixin-transformer to infer that the absence of an attribute means that it has not been set (which in turn means that the attribute is ignored).
-
-
Optional Element Summary
Optional Elements Modifier and Type Optional Element Description java.lang.Class<?>classValueDefines theClassconstant values to match.doubledoubleValueSpecify a double constant value to matchfloatfloatValueSpecify a float constant value to matchintintValueSpecify the integer constant value to match.longlongValueSpecify a long constant value to matchbooleannullValueIf true, null values are matched.java.lang.StringsliceThe id of theSlicethat should be passed to the injection point to narrow down the amount of resulting matched instructions.java.lang.StringstringValueDefines the string constant values to match.
-
-
-
Element Detail
-
classValue
java.lang.Class<?> classValue
Defines theClassconstant values to match.Matches the LDC opcode.
Does not match GETSTATIC java/lang/Integer.TYPE or similar, which means that int.class or similar cannot be matched using this approach. This means that not primitive classes can be matched as "int.class" is represented using a GETSTATIC instruction in java bytecode. That being said, this behaviour could change in future versions of the spongeian mixin implementation or future versions of micromixin as this flaw is not directly documented in the spongeian documentation of this attribute.
- Returns:
- The
Classconstant to match.
- Default:
- void.class
-
-
-
intValue
int intValue
Specify the integer constant value to match.Matches opcodes such as LDC, BIPUSH or ICONST_0.
Due to how types work in java bytecode, this can also match booleans, bytes, shorts and chars, which do not have their own types and are always represented as integers.
The spongeian documentation does not explicitly guarantee matching booleans and chars - but the spongeian mixin implementation does permit it anyways and the current behaviour is unlikely to change.
Be careful, directives such as
x == 0orx <= 0and other comparisons with the constant value 0 are compiled to their own dedicated opcodes, which means that this attribute cannot match 0 on it's own. HOWEVER, the spongeian mixin implementation provides tools to capture such constants anyways, but micromixin-transformer does not yet support these facilities.- Returns:
- The integer constant to match
- Default:
- 0
-
-
-
longValue
long longValue
Specify a long constant value to matchMatches opcodes such as LDC or LCONST_0.
longValue()does not support matching ints, shorts, bytes, etc.- Returns:
- The long constant to match
- Default:
- 0L
-
-
-
nullValue
boolean nullValue
If true, null values are matched.Matches the ACONST_NULL opcode.
Setting the attribute to false may result in undefined behaviour. It is rather recommended to plainly remove this attribute instead of defining it to false.
Matching null values is rather brittle due to the frequency of the null values. Aside from that the type of a null value is not well defined and must be inferred. This means that micromixin-transformer accepts any object types when paired with
ModifyConstant. However, accepting and returning an object of typeObjectis still the recommended approach when capturing null values. That being said, other mixin implementations may behave differently and this property is not well tested.- Returns:
- True to match null values, false otherwise.
- Default:
- false
-
-
-
slice
java.lang.String slice
The id of theSlicethat should be passed to the injection point to narrow down the amount of resulting matched instructions. This should be the preferred way of selecting one specific instruction from a pool of otherwise similar instructions as this would be the least brittle option - provided the slices are not used carelessly.Note that micromixin-transformer as well as the accompanying documentation only partly implements
Slice.id()as well asslice(); significant derivations are to be expected between micromixin-transformer's behaviour (as well as the documented behaviour) and the spongeian transformer behaviour (as well as it's documentation). As such, usage of these attributes ought to be avoided in environments where usage of micromixin-transformer is expected and the spongeian documentation should be consulted before making use of this attribute.- Returns:
- The id of the
Sliceto use, as perSlice.id().
- Default:
- ""
-
-
-
stringValue
java.lang.String stringValue
Defines the string constant values to match.Matches the LDC opcode.
The string value attribute must contain the entire string to match. Do note that smaller, more frequent, strings could be matched multiple times. If in doubt, you might want to make use of
slice()to reduce the frequency in which a specific string is captured.- Returns:
- The string constant to match
- Default:
- ""
-
-