ASMSupport教程4.2

Stella981
• 阅读 702

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,没有返回值。

点赞
收藏
评论区
推荐文章
海军 海军
3年前
JavaScript设计模式之单例模式
<sectionid"nice"datatool"mdnice编辑器"datawebsite"https://www.mdnice.com"style"fontsize:16px;color:black;lineheight:1.6;wordspacing:0px;letterspacing:0px;word
海军 海军
3年前
全栈进阶:Nginx基本功能及其原理
<divclass"output_wrapper"id"output_wrapper_id"style"fontsize:16px;color:rgb(62,62,62);lineheight:1.6;wordspacing:0px;letterspacing:0px;fontfamily:'Helvetica
Wesley13 Wesley13
3年前
Java中Class对象详解
<divclass"htmledit\_views"id"content\_views"<phttps://blog.csdn.net/mcryeasy/article/details/52344729<br</p<p待优化整理总结</p<p</p<h1style"padding:0px;fontfamily:'apple
Stella981 Stella981
3年前
Nginx在Windows平台的配置与使用
<divclass"output\_wrapper"id"output\_wrapper\_id"style"fontsize:16px;color:rgb(62,62,62);lineheight:1.6;wordspacing:0px;letterspacing:0px;fontfamily:'Helvet
Stella981 Stella981
3年前
ASMSupport教程4.5 在Class中生成算术运算符
<h2ASMSupport教程4.5在Class中生成算术运算符</h2<p这节我们开始介绍ASMSupport如何生成算数运算符(\/%),依旧先看我们需要生成的java代码:</p<divid"scid:9D7513F9C04C4721824A2B34F0212519:22b13b06a0d64b8eb7cd768
Stella981 Stella981
3年前
ASMSupport教程4.9 生成三元运算符
<p这节我们介绍如何用ASMSupport生成三元运算符(...?...:...)运算符。我们预计生成如下代码:</p<divid"scid:9D7513F9C04C4721824A2B34F0212519:935e30cc33214e0093ba9834f3a4e044"class"wlWriterEditableS
Stella981 Stella981
3年前
ASMSupport教程4.11 生成数组操作
<p在任何语言里,数组都是基本的数据类型,我们这一节将讲述如何生成数组操作。</p<p数组操作包括以下几个:</p<ol<li创建数组</li<li获取数组长度</li<li获取数组每个元素的内容</li<li为数组元素赋值</li</ol<p我们接下来对每种操作进行详解。</p<h3<fonts
Stella981 Stella981
3年前
DevOps 之 Jenkins 安装、配置、美化、插件及常见错误处理
<divclass"postbodyhaninitcontext"itemprop"articleBody"style"opacity:1;display:block;transform:translateY(0px);"<p继续上一篇的话题,既然已经搭建了GitLab的代码仓库,那么现在就可以开始进行下一步持续集成环境
Stella981 Stella981
3年前
ASMSupport教程4.12 生成方法调用操作
<p这一节我们讲如何用ASMSupport生成方法调用的操作,方法调用包括下面四种类型:</p<ol<li调用构造方法<li调用静态方法<li调用非静态方法<li调用当前类的方法<li调用父类方法</li</ol<p首先我们需要看我们想要生成的类:</p<p代码1:</p<h3<divid"scid:9D
Stella981 Stella981
3年前
ASMSupport教程4.4 自增减操作(++,
<h24.4自增减操作(,—)</h2<p我们知道,和是各种编程语言的基本操作,其作用就不解释了,直接进入正题,我们希望生成如下代码</p<divid"scid:9D7513F9C04C4721824A2B34F0212519:030ff93f6abb4574b1832e855d30580b"class"wl