ASMSupport教程4.2

4.2 生成Return操作

这一节我们将讲述如何生成return操作,我们将生成如下代码:

package generated.operators;

import java.io.PrintStream;

public class ReturnOperatorGenerateExample
{
public static String commonMethod()
{

return "I'm from commonMethod";

}

public static void main(String[] args)
{

System.out.println(commonMethod());

}
}

这段代码的两个方法的返回类型分别是String和void,对应的ASMSupport的代码如下:

public static void main(String[] args) {
    ClassCreator creator = new ClassCreator(Opcodes.V1_5, Opcodes.ACC_PUBLIC , 
        "generated.operators.ReturnOperatorGenerateExample", null, null);

    /* 
     * 有返回类型的方法
     */
    creator.createStaticMethod("commonMethod", null, null, AClass.STRING_ACLASS, null, Opcodes.ACC_PUBLIC, new StaticMethodBody(){
        @Override
        public void generateBody(LocalVariable... argus) {
            runReturn(Value.value("I'm from commonMethod"));
        }
    });

    /* 
     * 无返回类型的方法
     */
    creator.createStaticMethod("main", new AClass[]{AClassFactory.getProductClass(String[].class)}, new String[]{"args"}, null, null,
            Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, new StaticMethodBody(){
        @Override
        public void generateBody(LocalVariable... argus) {
            invoke(systemOut, "println", invokeStatic(getMethodOwner(), "commonMethod"));
            runReturn();
        }
    });
    generate(creator);
}

这里我们主要关注的是runReturn(Value.value("I'm from commonMethod"))和runReturn(),前者是非void的,参数就是我们方法需要返回的值,后者就是直接return,没有返回值。

你可能感兴趣的:(ASMSupport教程4.2)