ASMSupport教程4.7 生成关系运算符

Stella981
• 阅读 654

在java中,关系运算符是很常用的, 分别是>,==,<,>=,<=,!=这六种,我们按照惯例看看我们需要生成的代码:

public static void main(String\[\] args) { Random rand = new Random(); int i = rand.nextInt(100); int j = rand.nextInt(100); System.out.println("i = " + i); System.out.println("j = " + j); System.out.println("i > j is " + (i > j)); System.out.println("i < j is " + (i < j)); System.out.println("i >= j is " + (i >= j)); System.out.println("i <= j is " + (i <= j)); System.out.println("i == j is " + (i == j)); System.out.println("i != j is " + (i != j)); System.out.println("(i < 10) && (j < 10) is " + ((i < 10) && (j < 10))); System.out.println("(i < 10) || (j < 10) is " + ((i < 10) || (j < 10))); }

这里用到了非常多的关系运算符,那么对应的amssupport代码如下:

package example.operators;

import java.util.Random;

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 RelationalOperatorGenerate extends AbstractExample {

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

    /*
     * 
     */
    creator.createStaticMethod(&quot;main&quot;, new AClass[]{AClassFactory.getProductClass(String[].class)}, new String[]{&quot;args&quot;}, null, null,
            Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, new StaticMethodBody(){

        @Override
        public void generateBody(LocalVariable... argus) {
            //Random rand = new Random();
            LocalVariable rand = createVariable(&quot;rand&quot;, AClassFactory.getProductClass(Random.class), false, 
                invokeConstructor(AClassFactory.getProductClass(Random.class)));
            
            //int i = rand.nextInt(100);
            LocalVariable i = createVariable(&quot;i&quot;, AClass.INT_ACLASS, false, 
                invoke(rand, &quot;nextInt&quot;, Value.value(100)));
            
            //int j = rand.nextInt(100);
            LocalVariable j = createVariable(&quot;j&quot;, AClass.INT_ACLASS, false, 
                invoke(rand, &quot;nextInt&quot;, Value.value(100)));
            
            //System.out.println(&quot;i = &quot; + i);
            invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;i = &quot;), i));
            
            //System.out.println(&quot;j = &quot; + j);
            invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;j = &quot;), j));
            
            //System.out.println(&quot;i &gt; j is &quot; + (i &gt; j));
            invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;i &gt; j is &quot;), greaterThan(i, j)));
            
            //System.out.println(&quot;i &lt; j is &quot; + (i &lt; j));
            invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;i &lt; j is &quot;), lessThan(i, j)));
            
            //System.out.println(&quot;i &gt;= j is &quot; + (i &gt;= j));
            invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;i &gt;= j is &quot;), greaterEqual(i, j)));
            
            //System.out.println(&quot;i &lt;= j is &quot; + (i &lt;= j));
            invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;i &lt;= j is &quot;), lessEqual(i, j)));
            
            //System.out.println(&quot;i == j is &quot; + (i == j));
            invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;i == j is &quot;), equal(i, j)));
            
            //System.out.println(&quot;i != j is &quot; + (i != j));
            invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;i != j is &quot;), notEqual(i, j)));
            
            //System.out.println(&quot;(i &lt; 10) &amp;&amp; (j &lt; 10) is &quot; + ((i &lt; 10) &amp;&amp; (j &lt; 10)));
            invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;(i &lt; 10) &amp;&amp; (j &lt; 10) is &quot;), 
                conditionalAnd(lessThan(i, Value.value(10)), lessThan(j, Value.value(10)))));
            
            //System.out.println(&quot;(i &lt; 10) || (j &lt; 10) is &quot; + ((i &lt; 10) || (j &lt; 10)));
            invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;(i &lt; 10) || (j &lt; 10) is &quot;), 
                conditionalOr(lessThan(i, Value.value(10)), lessThan(j, Value.value(10)))));
            
            runReturn();
        }
    });
    generate(creator);
}

}

这里面我们主要介绍这关系运算所对应的asmsupport的方法(这些方法都是属于jw.asmsupport.block.ProgramBlock的):

public final GreaterThan greaterThan(Parameterized factor1, Parameterized factor2): >运算符的操作。

public final GreaterThan greaterEqual(Parameterized factor1, Parameterized factor2) : >=运算符。

public final GreaterThan lessThan(Parameterized factor1, Parameterized factor2) : <运算符。

public final GreaterThan lessEqual(Parameterized factor1, Parameterized factor2) : <=运算符。

public final GreaterThan lessEqual(Parameterized factor1, Parameterized factor2) : ==运算符。

public final GreaterThan lessEqual(Parameterized factor1, Parameterized factor2) : !=运算符。

这些方法都有两个参数,分别表示运算符前后的两个参数。比如a==b,那么factor1表示a,factor2表示b

 

上面asmsupport代码中还有conditionalAnd和conditionalOr方法,这是逻辑运算符,将在以后讲解。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
thinkphp3.2.3模板渲染支持三元表达式
thinkphp3.2.3模板渲染支持三元表达式{$status?'正常':'错误'}{$info'status'?$info'msg':$info'error'}注意:三元运算符中暂时不支持点语法。如下:           <divclass"modalhidefade"id'myModa
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
2年前
ASMSupport教程4.5 在Class中生成算术运算符
<h2ASMSupport教程4.5在Class中生成算术运算符</h2<p这节我们开始介绍ASMSupport如何生成算数运算符(\/%),依旧先看我们需要生成的java代码:</p<divid"scid:9D7513F9C04C4721824A2B34F0212519:22b13b06a0d64b8eb7cd768
Stella981 Stella981
2年前
ASMSupport教程4.9 生成三元运算符
<p这节我们介绍如何用ASMSupport生成三元运算符(...?...:...)运算符。我们预计生成如下代码:</p<divid"scid:9D7513F9C04C4721824A2B34F0212519:935e30cc33214e0093ba9834f3a4e044"class"wlWriterEditableS
Stella981 Stella981
2年前
ASMSupport4.6 生成位运算符
<p在java中我们经常用到为运算符,我们假设有如下代码:</p<divid"scid:9D7513F9C04C4721824A2B34F0212519:ecfdbd3b8e2840d79bd2694f2e31c53a"class"wlWriterEditableSmartContent"style"float:none;
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这