Annotation Type ModifyArg
@Target(METHOD)
@Retention(RUNTIME)
public @interface ModifyArg
method(). This type of injection
provides a lightweight mechanism for changing a single argument of a target
method invocation. To affect multiple arguments at once, use ModifyArgs instead.
Consider the following method call:
// x, y and z are of type float someObject.setLocation(x, y, z, true);
Let us assume that we wish to modify the y value in the method call. We know that the arguments are floats and that the y value is the second (index = 1) float argument. Thus our injector requires the following signature:
@ModifyArg(method = "...", at = ..., index = 1)
private float adjustYCoord(float y) {
return y + 64.0F;
}
The callback consumes the original value of y and returns the adjusted value.
@ModifyArg can also consume all of the target method's arguments if required, to provide additional context for the callback. In this case the arguments of the callback should match the target method:
@ModifyArg(method = "...", at = ..., index = 1)
private float adjustYCoord(float x, float y, float z, boolean interpolate) {
return (x == 0 && y == 0) ? 0 : y;
}-
Required Element Summary
Required Elements Modifier and Type Required Element Description AtatAnAtannotation which describes theInjectionPointin the target method.java.lang.String[]methodString representation of one or moretarget selectorswhich identify the target methods. -
Optional Element Summary
Optional Elements Modifier and Type Optional Element Description intallowInjection points are in general expected to match every candidate instruction in the target method or slice, except in cases where options such asAt.ordinal()are specified which naturally limit the number of results.java.lang.StringconstraintsReturns constraints which must be validated for this injector to succeed.intexpectLikerequire()but only enabled if themixin.debug.countInjectionsoption is set to true and defaults to 1.intindexGets the argument index on the target to set.booleanremapintrequireIn general, injectors are intended to "fail soft" in that a failure to locate the injection point in the target method is not considered an error condition.Sliceslice
-
Element Details
-
method
java.lang.String[] methodString representation of one or moretarget selectorswhich identify the target methods.- Returns:
- target method(s) for this injector
-
at
At atAnAtannotation which describes theInjectionPointin the target method. The specifiedInjectionPointmust only returnMethodInsnNodeinstances and an exception will be thrown if this is not the case.- Returns:
Atwhich identifies the target method invocation
-
-
-
slice
Slice slice- Returns:
- slice
- Default:
- @org.spongepowered.asm.mixin.injection.Slice
-
index
int indexGets the argument index on the target to set. It is not necessary to set this value if there is only one argument of the modifier type in the hooked method's signature. For example if the target method accepts a boolean, an integer and a String, and the modifier method accepts and returns an integer, then the integer parameter will be automatically selected.
The index is zero-based.
- Returns:
- argument index to modify or -1 for automatic
- Default:
- -1
-
remap
boolean remapBy default, the annotation processor will attempt to locate an obfuscation mapping for allModifyArgmethods since it is anticipated that in general the target of aModifyArgannotation will be an obfuscated method in the target class. However since it is possible to also apply mixins to non-obfuscated targets (or non- obfuscated methods in obfuscated targets, such as methods added by Forge) it may be necessary to suppress the compiler error which would otherwise be generated. Setting this value to false will cause the annotation processor to skip this annotation when attempting to build the obfuscation table for the mixin.- Returns:
- True to instruct the annotation processor to search for obfuscation mappings for this annotation
- Default:
- true
-
require
int requireIn general, injectors are intended to "fail soft" in that a failure to locate the injection point in the target method is not considered an error condition. Another transformer may have changed the method structure or any number of reasons may cause an injection to fail. This also makes it possible to define several injections to achieve the same task given expected mutation of the target class and the injectors which fail are simply ignored.However, this behaviour is not always desirable. For example, if your application depends on a particular injection succeeding you may wish to detect the injection failure as an error condition. This argument is thus provided to allow you to stipulate a minimum number of successful injections for this callback handler. If the number of injections specified is not achieved then an
InjectionErroris thrown at application time. Use this option with care.- Returns:
- Minimum required number of injected callbacks, default specified by the containing config
- Default:
- -1
-
expect
int expectLikerequire()but only enabled if themixin.debug.countInjectionsoption is set to true and defaults to 1. Use this option during debugging to perform simple checking of your injectors. Causes the injector to throw aInvalidInjectionExceptionif the expected number of injections is not realised.- Returns:
- Minimum number of expected callbacks, default 1
- Default:
- 1
-
allow
int allowInjection points are in general expected to match every candidate instruction in the target method or slice, except in cases where options such asAt.ordinal()are specified which naturally limit the number of results.This option allows for sanity-checking to be performed on the results of an injection point by specifying a maximum allowed number of matches, similar to that afforded by
Group.max(). For example if your injection is expected to match 4 invocations of a target method, but instead matches 5, this can become a detectable tamper condition by setting this value to 4.Setting any value 1 or greater is allowed. Values less than 1 or less than
require()are ignored.require()supercedes this argument such that if allow is less than require the value of require is always used.Note that this option is not a limit on the query behaviour of this injection point. It is only a sanity check used to ensure that the number of matches is not too high
- Returns:
- Maximum allowed number of injections for this
- Default:
- -1
-
constraints
java.lang.String constraintsReturns constraints which must be validated for this injector to succeed. SeeConstraintParser.Constraintfor details of constraint formats.- Returns:
- Constraints for this annotation
- Default:
- ""
-