ASMSupport教程4.8 生成逻辑运算操作

Stella981
• 阅读 815

在java中有以下逻辑运算符:

  • &&:条件与
  • ||:条件或
  • & : 布尔型的逻辑与
  • | : 布尔型的逻辑或
  • ^ : 布尔型的逻辑异或
  • ! : 非操作

那么接下来我们将些段例子来看看各种逻辑运算的效果,并且我们再通过ASMSupport生成这个例子的字节码Class:

public static void main(String\[\] args) { // create truth table for && (conditional AND) operator System.out.printf("%s\\n%s: %b\\n%s: %b\\n%s: %b\\n%s: %b\\n\\n", "Conditional AND (&&)", "false && false", (false && false), "false && true", (false && true), "true && false", (true && false), "true && true", (true && true));

// create truth table for || (conditional OR) operator
System.out.printf("%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n",
        "Conditional OR (||)", "false || false", (false || false),
        "false || true", (false || true), "true || false",
        (true || false), "true || true", (true || true));

// create truth table for & (boolean logical AND) operator
System.out.printf("%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n",
        "Boolean logical AND (&)", "false & false", (false & false),
        "false & true", (false & true), "true & false", (true & false),
        "true & true", (true & true));

// create truth table for | (boolean logical inclusive OR) operator
System.out.printf("%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n",
        "Boolean logical inclusive OR (|)", "false | false",
        (false | false), "false | true", (false | true),
        "true | false", (true | false), "true | true", (true | true));

// create truth table for ^ (boolean logical exclusive OR) operator
System.out.printf("%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n",
        "Boolean logical exclusive OR (^)", "false ^ false",
        (false ^ false), "false ^ true", (false ^ true),
        "true ^ false", (true ^ false), "true ^ true", (true ^ true));

// create truth table for ! (logical negation) operator
System.out.printf("%s\n%s: %b\n%s: %b\n", "Logical NOT (!)", "!false",
        (!false), "!true", (!true));

}

我们接下来使用ASMSupport如何生成上面的代码:

package example.operators;

import org.objectweb.asm.Opcodes;

import jw.asmsupport.block.method.common.StaticMethodBody; import jw.asmsupport.clazz.AClass; import jw.asmsupport.clazz.AClassFactory; import jw.asmsupport.creator.ClassCreator; import jw.asmsupport.definition.value.Value; import jw.asmsupport.definition.variable.LocalVariable;

import example.AbstractExample;

public class LogicalOperatorGenerate extends AbstractExample {

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

    
    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) {
            /*System.out.printf("%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n",
             "Conditional AND (&&)", "false && false", (false && false),
             "false && true", (false && true), "true && false",
             (true && false), "true && true", (true && true));*/
            invoke(systemOut, "printf", 
             Value.value("%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n"), 
             Value.value("Conditional AND (&&)"), 
             Value.value("false && false"), 
             conditionalAnd(Value.value(false), Value.value(false)), 
             Value.value("false && true"), 
             conditionalAnd(Value.value(false), Value.value(true)), 
             Value.value("true && false"), 
             conditionalAnd(Value.value(true), Value.value(false)),  
             Value.value("true && true"), 
             conditionalAnd(Value.value(true), Value.value(true))
             );

                    /*System.out.printf("%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n",
             "Conditional OR (||)", "false || false", (false || false),
             "false || true", (false || true), "true || false",
             (true || false), "true || true", (true || true));*/
            invoke(systemOut, "printf", 
             Value.value("%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n"), 
             Value.value("Conditional OR (||)"), 
             Value.value("false || false"),  conditionalOr(Value.value(false), Value.value(false)), 
             Value.value("false || true"),  conditionalOr(Value.value(false), Value.value(true)), 
             Value.value("true || false"),  conditionalOr(Value.value(true), Value.value(false)),  
             Value.value("true || true"),  conditionalOr(Value.value(true), Value.value(true))
             );
                    
                    /*System.out.printf("%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n",
             "Boolean logical AND (&)", "false & false", (false & false),
             "false & true", (false & true), "true & false", (true & false),
             "true & true", (true & true));*/
            invoke(systemOut, "printf", 
             Value.value("%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n"), 
             Value.value("Boolean logical AND (&)"), 
             Value.value("false & false"),  logicalAnd(Value.value(false), Value.value(false)), 
             Value.value("false & true"),  logicalAnd(Value.value(false), Value.value(true)), 
             Value.value("true & false"),  logicalAnd(Value.value(true), Value.value(false)),  
             Value.value("true & true"),  logicalAnd(Value.value(true), Value.value(true))
             );
                    
                    /*System.out.printf("%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n",
             "Boolean logical inclusive OR (|)", "false | false",
             (false | false), "false | true", (false | true),
             "true | false", (true | false), "true | true", (true | true));*/
            invoke(systemOut, "printf", 
             Value.value("%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n"), 
             Value.value("Boolean logical inclusive OR (|)"), 
             Value.value("false | false"),  logicalOr(Value.value(false), Value.value(false)), 
             Value.value("false | true"),  logicalOr(Value.value(false), Value.value(true)), 
             Value.value("true | false"),  logicalOr(Value.value(true), Value.value(false)),  
             Value.value("true | true"),  logicalOr(Value.value(true), Value.value(true))
             );
                    
            /*System.out.printf("%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n",
             "Boolean logical exclusive OR (^)", "false ^ false",
             (false ^ false), "false ^ true", (false ^ true),
             "true ^ false", (true ^ false), "true ^ true", (true ^ true));*/
             invoke(systemOut, "printf", 
             Value.value("%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n"), 
             Value.value("Boolean logical exclusive OR (^)"), 
             Value.value("false ^ false"),  logicalXor(Value.value(false), Value.value(false)), 
             Value.value("false ^ true"),  logicalXor(Value.value(false), Value.value(true)), 
             Value.value("true ^ false"),  logicalXor(Value.value(true), Value.value(false)),  
             Value.value("true ^ true"),  logicalXor(Value.value(true), Value.value(true))
             );
                    
             /*System.out.printf("%s\n%s: %b\n%s: %b\n", "Logical NOT (!)", "!false",
             (!false), "!true", (!true));*/
             invoke(systemOut, "printf", 
             Value.value("%s\n%s: %b\n%s: %b\n"), 
             Value.value("Logical NOT (!)"), 
             Value.value("!false"),  not(Value.value(false)), 
             Value.value("!true"),  not(Value.value(true))
             );
                    
            runReturn();
        }
    });
    generate(creator);
}

}

我们在每段ASMSupport的代码上分别用注释说明了这段代码生成的内容是什么,我们就不对其进行详细的解说,在这只说明下这些逻辑运算符所对应的asmsupport方法,这些方法都是存在与jw.asmsupport.block.ProgramBlock类中:

  • public ShortCircuitAnd conditionalAnd(Parameterized factor1, Parameterized factor2) : 条件与(&&)操作
  • public ShortCircuitOr conditionalOr(Parameterized factor1, Parameterized factor2) : 条件或(||)操作
  • public LogicalAnd logicalAnd(Parameterized factor1, Parameterized factor2) : 逻辑与(&)操作
  • public LogicalOr logicalOr(Parameterized factor1, Parameterized factor2) : 逻辑或(|)操作
  • public LogicalXor logicalXor(Parameterized factor1, Parameterized factor2) : 逻辑异或(^)操作
  • public Not not(Parameterized factor) : 非(!)操作

 

以上除了not方法都有两个参数,分别表示运算符前后的两个参数。比如a&&b,那么factor1表示a,factor2表示b, 至于not方法,其效果就是!factor的效果。

更多实例下载

点赞
收藏
评论区
推荐文章
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
LinkWeChat 基于企业微信的SCRM私域流量开源系统
LinkWeChat(https://gitee.com/LinkWeChat/linkwechat"LinkWeChat")平台介绍LinkWeChat(https://gitee.com/Li
Wesley13 Wesley13
3年前
PHP安全性防范方式
<h2SQL注入</h2<pSQL注入是一种恶意攻击,用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行。</p<h4防范方式</h4<ul<li使用mysql\_real\_escape\_string(),或者addslashes()过滤数据</li<li手动检查每一数据是否为正确的数据类型</li<li使用
Wesley13 Wesley13
3年前
Activiti 工作流入门指南
<divclass"htmledit\_views"id"content\_views"<h1<aname"t0"</a概览</h1<p如我们的介绍部分所述,Activiti目前分为两大类:</p<ul<li<p<ahref"https://activiti.gitbook.io/activiti7deve
Wesley13 Wesley13
3年前
mysql 5.7 windows zip安装
<ol<limysql官网下载windowszip安装包并解压(D:wampmysql56winx64)</li<li添加pathD:wampmysql5722winx64bin</li<li创建data目录D:\\wamp\\mysql56winx64\\data</li<li<p创建mysql配置文
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年前
IdeaVim
<divid"cnblogs\_post\_body"class"blogpostbodycnblogsmarkdown"<h3id"ideavim简介"IdeaVim简介</h3<pIdeaVim是IntelliJIDEA的一款插件,他提高了我们写代码的速度,对代码的跳转,查找也很友好。</p<ul<li安装位置</
Stella981 Stella981
3年前
Netty学习之IO模型
目录1.1同步、异步、阻塞、非阻塞  同步VS异步    同步    异步  阻塞VS非阻塞    阻塞    非阻塞  举例    1)同步阻塞    2)同步非阻塞    3)异步阻塞    4)异步非阻塞1.2Li
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
Wesley13 Wesley13
3年前
HTML快捷写法大全
父子用\ \Ulli\3\<ul\    <li\</li\    <li\</li\    <li\</li\</ul\兄弟之间用,也可以省写\pspan\,\ul\<p\</p\<span