byte-buddy
byte-buddy copied to clipboard
Return a value calculate in Advice.OnMethodEnter and skip running original method logic
In some condition, I calculated result in Advice.OnMethodEnter and now I can return result in Advice.OnMethodExit I want still return result calculated but custom the condition when run original logic method code.
@Advice.OnMethodEnter(skipOn = Advice.OnNonDefaultValue.class, suppress = Throwable.class)
public static boolean onEnter(@Advice.This Invoker<?> invoker,
@Advice.Argument(0) Invocation invocation,
@Advice.Local("mockResult") MockResult mockResult) {
if (ContextManager.needReplay()) {
mockResult = extractor.replay();
}
// true if have mock result
return mockResult != null && mockResult.notIgnoreMockResult();
}
@Advice.OnMethodExit(suppress = Throwable.class)
public static void onExit(@Advice.Return(readOnly = false) Result result,
@Advice.Local("mockResult") MockResult mockResult) {
//If condition true, return mockresult
if (mockResult != null && mockResult.notIgnoreMockResult()) {
result = (Result) mockResult.getResult();
return;
}
}
I want
if(mockResult.getRunOriginal()){
// run original method code but still return mock result (now it working as)
} else{
// skipping the original method code still return mock result
}
I looked at https://stackoverflow.com/questions/50237592/is-it-possible-to-return-from-a-method-using-advice-onmethodenter but it not work as I want
Can I do that, thank you
I am not sure if I understand what you mean. But you can repeatOn in exit advice, so you would be able to invoke the original method again if you return a specific value from the exit advice. This works similarly to skipOn.
Maybe this would allow you to construct what you want?
I need : Return the value calculate in onEnter method and not run original method . If cannot calculate value in onEnter, It will work normally (run original method and onExit() )
Flow
https://viewer.diagrams.net/index.html?tags=%7B%7D&lightbox=1&highlight=0000ff&edit=_blank&layers=1&nav=1&title=Untitled%20Diagram.drawio.png&dark=auto#R%3Cmxfile%3E%3Cdiagram%20name%3D%22Page-1%22%20id%3D%22FxTnPhz1foQjGkwVANJo%22%3E3Vhdc6IwFP01zuw%2BuAPhyz5aa7u7s91260OfI0RIBwiTBMX%2B%2Bk0kCBhr3WlV2BcNh5uvc889BAbWJCnuKMyiexKgeACMoBhYNwMATBu44k8i6xLxXLMEQooDFVQDM%2FyKFGgoNMcBYq1ATkjMcdYGfZKmyOctDFJKVu2wBYnbs2YwRBow82Gso8844FGJjhyjxr8jHEbVzKah7iSwClYAi2BAVg3Img6sCSWEl62kmKBYklfxUva7fePudmEUpfyYDuPH29nNs%2F%2BnYOOfE%2F8V%2Fh7i4dBTa%2BPrasMoEPtXl4TyiIQkhfG0Rq8pydMAyVENcVXH%2FCIkE6ApwBfE%2BVolE%2BacCCjiSazu6itXm2Ekpz46sNxKAZCGiB%2BIA2Wc3EtjAsXLHSIJ4nQtAiiKIcfLdq6hkky4jatZFQ1F7D%2BQrMZdwjhXM5F0mnJENfJraiVPqwhzNMvghpKVqK8jaVwiylFxcOPq7rbMVHWO1OWqlrpZ6TdqyNw1TkTVqF96BEfq0eqUHoGmxwmM%2FVxMjTZrYBlJmWw%2BzF%2Bkp3ZNpebVpWV6pTHIqWj1SrvWkdq1O6XdSgoN6hcwZv8p926nuLcO%2BgbLfR8xNgBuLLZ0HeClaIayWXZQuJi5cUv3logk85ydyVfAN6flLGCfs5iO7iyjUzmLqR8W%2Bmct9qXkvek6phSuGwEZwSlnjZEfJVDLwAHtx4vtGTtpLEesk7pd2gfyrD%2BEe%2Bhjxyba%2FPQD0P5UekY7lZa1U6flSlWvnVL9hKzaWlJ%2FMLmrPBW%2FhOJQpEW07pHIUfDl6x6vlDwCYy65WGAkXlbFjLKzXzltsB2%2Fe4Zq7xzU9tkpsPYc1E5np3a%2FCso9tqCc8xQU8NoZdY3zFpSrFdTTtpZwWUzJpph03V%2F4JcW2L%2F2SYurntScx8IY%2F5SAGWbzNoJgCZwy9zx5kWfnpbYELyfhn0OlZ71vJ6KxO4vbLSSqHuMCz%2BWM8O5pqH9Jpgbl8XHasxh3vdDUuLutvw6Wd1l%2FYrelf%3C%2Fdiagram%3E%3C%2Fmxfile%3E#%7B%22pageId%22%3A%22FxTnPhz1foQjGkwVANJo%22%7D
thank you