ASMSupport教程4.5 在Class中生成算术运算符

<h2>ASMSupport教程4.5 在Class中生成算术运算符</h2> <p>这节我们开始介绍ASMSupport如何生成算数运算符(+-\*/%),依旧先看我们需要生成的java代码:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:22b13b06-a0d6-4b8e-b7cd-7680d4653dde" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre class="brush: java; gutter: true; first-line: 1; tab-size: 4; toolbar: true; width: 439px; height: 1027px;" style=" width: 439px; height: 1027px;overflow: auto;">package generated.operators;

import java.io.PrintStream; import java.util.Random;

public class ArithmeticOperatorGenerateExample { static void printInt(String s, int i) { System.out.println(s + " = " + i); }

static void printFloat(String s, float f) { System.out.println(s + " = " + f); }

public static void main(String[] args) { Random rand = new Random(); int j = rand.nextInt(100) + 1; int k = rand.nextInt(100) + 1; printInt("j", j); printInt("k", k); int i = j + k; printInt("j + k", i); i = j - k; printInt("j - k", i); i = k / j; printInt("k / j", i); i = k * j; printInt("k * j", i); i = k % j; printInt("k % j", i); j %= k; printInt("j %= k", j); float v = rand.nextFloat(); float w = rand.nextFloat(); printFloat("v", v); printFloat("w", w); float u = v + w; printFloat("v + w", u); u = v - w; printFloat("v - w", u); u = v * w; printFloat("v * w", u); u = v / w; printFloat("v / w", u); u += v; printFloat("u += v", u); u -= v; printFloat("u -= v", u); u *= v; printFloat("u *= v", u); u /= v; printFloat("u /= v", u); } }</pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div>

<p>对应的代码如下,由于代码比较多,我们将对应的java代码写在asmsupport代码之上,便于对比。</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:1bfe82d6-deba-48f1-853a-a748666c5148" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre class="brush: java; gutter: true; first-line: 1; tab-size: 4; toolbar: true; width: 462px; height: 3000px;" style=" width: 462px; height: 3000px;overflow: auto;">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 jw.asmsupport.operators.method.MethodInvoker; import jw.asmsupport.operators.numerical.arithmetic.Addition;

import example.AbstractExample;

public class ArithmeticOperatorGenerate extends AbstractExample {

1/** 2 * @param args 3 */ 4public static void main(String[] args) { 5 ClassCreator creator = new ClassCreator(Opcodes.V1_5, Opcodes.ACC_PUBLIC, &quot;generated.operators.ArithmeticOperatorGenerateExample&quot;, null, null); 6 7 //printIn方法 8 creator.createStaticMethod(&quot;printInt&quot;, new AClass[]{AClass.STRING_ACLASS, AClass.INT_ACLASS}, new String[]{&quot;s&quot;, &quot;i&quot;}, null, null, 0, new StaticMethodBody(){ 9 10 @Override 11 public void generateBody(LocalVariable... argus) { 12 invoke(systemOut, &quot;println&quot;, append(argus[0], Value.value(&quot; = &quot;), argus[1])); 13 runReturn(); 14 } 15 16 }); 17 18 //printIn方法 19 creator.createStaticMethod(&quot;printFloat&quot;, new AClass[]{AClass.STRING_ACLASS, AClass.FLOAT_ACLASS}, new String[]{&quot;s&quot;, &quot;f&quot;}, null, null, 0, new StaticMethodBody(){ 20 21 @Override 22 public void generateBody(LocalVariable... argus) { 23 invoke(systemOut, &quot;println&quot;, append(argus[0], Value.value(&quot; = &quot;), argus[1])); 24 runReturn(); 25 } 26 27 }); 28 29 creator.createStaticMethod(&quot;main&quot;, new AClass[] { AClassFactory.getProductClass(String[].class) }, new String[] { &quot;args&quot; }, null, null, Opcodes.ACC_PUBLIC + 30 31 Opcodes.ACC_STATIC, new StaticMethodBody() { 32 33 @Override 34 public void generateBody(LocalVariable... argus) { 35 //Random rand = new Random(); 36 LocalVariable rand = createVariable(&quot;rand&quot;, AClassFactory.getProductClass(Random.class), false, invokeConstructor(AClassFactory.getProductClass(Random.class))); 37 38 //rand.nextInt(100) + 1 39 Addition add1 = add(invoke(rand, &quot;nextInt&quot;, Value.value(100)), Value.value(1)); 40 41 //int j = rand.nextInt(100) + 1; 42 LocalVariable j = createVariable(&quot;j&quot;, AClass.INT_ACLASS, false, add1); 43 44 //int k = rand.nextInt(100) + 1; 45 LocalVariable k = createVariable(&quot;k&quot;, AClass.INT_ACLASS, false, add1); 46 47 //printInt(&quot;j&quot;, j); 48 invokeStatic(getMethodOwner(), &quot;printInt&quot;, Value.value(&quot;j&quot;), j); 49 50 //printInt(&quot;k&quot;, k); 51 invokeStatic(getMethodOwner(), &quot;printInt&quot;, Value.value(&quot;k&quot;), k); 52 53 //j + k 54 Addition add2 = add(j, k); 55 //int i = j + k; 56 LocalVariable i = createVariable(&quot;i&quot;, AClass.INT_ACLASS, false, add2); 57 58 //printInt(&quot;j + k&quot;, i); 59 invokeStatic(getMethodOwner(), &quot;printInt&quot;, Value.value(&quot;j + k&quot;), i); 60 61 //i = j - k; 62 assign(i, sub(j, k)); 63 64 //printInt(&quot;j - k&quot;, i); 65 invokeStatic(getMethodOwner(), &quot;printInt&quot;, Value.value(&quot;j - k&quot;), i); 66 67 //i = k / j; 68 assign(i, div(k, j)); 69 70 //printInt(&quot;k / j&quot;, i); 71 invokeStatic(getMethodOwner(), &quot;printInt&quot;, Value.value(&quot;k / j&quot;), i); 72 73 //i = k * j; 74 assign(i, mul(k, j)); 75 76 //printInt(&quot;k * j&quot;, i); 77 invokeStatic(getMethodOwner(), &quot;printInt&quot;, Value.value(&quot;k * j&quot;), i); 78 79 //i = k % j; 80 assign(i, mod(k, j)); 81 82 //printInt(&quot;k % j&quot;, i); 83 invokeStatic(getMethodOwner(), &quot;printInt&quot;, Value.value(&quot;k % j&quot;), i); 84 85 //j %= k; 86 assign(j, mod(j, k)); 87 88 //printInt(&quot;j %= k&quot;, j); 89 invokeStatic(getMethodOwner(), &quot;printInt&quot;, Value.value(&quot;j %= k&quot;), j); 90 91 92 //rand.nextFloat() 93 MethodInvoker nextFloat = invoke(rand, &quot;nextFloat&quot;); 94 95 //v = rand.nextFloat(); 96 LocalVariable v = createVariable(&quot;v&quot;, AClass.FLOAT_ACLASS, false, nextFloat); 97 98 //w = rand.nextFloat(); 99 LocalVariable w = createVariable(&quot;w&quot;, AClass.FLOAT_ACLASS, false, nextFloat); 100 101 //printFloat(&quot;v&quot;, v); 102 invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;v&quot;), v); 103 104 //printFloat(&quot;w&quot;, w); 105 invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;w&quot;), w); 106 107 //u = v + w; 108 LocalVariable u = createVariable(&quot;u&quot;, AClass.FLOAT_ACLASS, false, add(v,w)); 109 110 //printFloat(&quot;v + w&quot;, u); 111 invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;v + w&quot;), u); 112 113 //u = v - w; 114 assign(u, sub(v, w)); 115 116 //printFloat(&quot;v - w&quot;, u); 117 invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;v - w&quot;), u); 118 119 //u = v * w; 120 assign(u, mul(v, w)); 121 122 //printFloat(&quot;v * w&quot;, u); 123 invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;v * w&quot;), u); 124 125 //u = v / w; 126 assign(u, div(v, w)); 127 128 //printFloat(&quot;v / w&quot;, u); 129 invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;v / w&quot;), u); 130 131 //u += v; 132 assign(u, add(u, v)); 133 134 //printFloat(&quot;u += v&quot;, u); 135 invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;u += v&quot;), u); 136 137 //u -= v; 138 assign(u, sub(u, v)); 139 140 //printFloat(&quot;u -= v&quot;, u); 141 invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;u -= v&quot;), u); 142 143 //u *= v; 144 assign(u, mul(u, v)); 145 146 //printFloat(&quot;u *= v&quot;, u); 147 invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;u *= v&quot;), u); 148 149 //u /= v; 150 assign(u, div(u, v)); 151 152 //printFloat(&quot;u /= v&quot;, u); 153 invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;u /= v&quot;), u); 154 155 runReturn(); 156 } 157 }); 158 generate(creator); 159}

} </pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div>

<p>这里我们不逐行解释,只对生成算术操作的方法进行解释:</p> <ul> <li><strong>jw.asmsupport.block.ProgramBlock.add(Parameterized factor1, Parameterized factor2) :</strong> 生成加法操作,生成的代码是factor1+factor2,返回类型<strong><font color="#ffc000">jw.asmsupport.operators.numerical.arithmetic.Addition</font></strong> </li> <li><strong>jw.asmsupport.block.ProgramBlock.sub(Parameterized factor1, Parameterized factor2) :</strong> 生成减法操作,生成的代码是factor1-factor2 , 返回类型<strong><font color="#ffc000">jw.asmsupport.operators.numerical.arithmetic.Subtraction</font></strong> </li> <li><strong>jw.asmsupport.block.ProgramBlock.mul(Parameterized factor1, Parameterized factor2):</strong> 生成乘法操作,生成的代码是factor1\*factor2 , 返回类型<strong><font color="#ffc000">jw.asmsupport.operators.numerical.arithmetic.Multiplication</font></strong> </li> <li><strong>jw.asmsupport.block.ProgramBlock.div(Parameterized factor1, Parameterized factor2):</strong>&#160; 生成除法操作,生成的代码是factor1/factor2 , 返回类型<strong><font color="#ffc000">jw.asmsupport.operators.numerical.arithmetic.Division</font></strong> </li> <li><strong>jw.asmsupport.block.ProgramBlock.mod(Parameterized factor1, Parameterized factor2):</strong>生成取模操作,生成的代码是factor1%factor2 , 返回类型<strong><font color="#ffc000">jw.asmsupport.operators.numerical.arithmetic.Modulus</font></strong> </li> </ul> <p>这些方法的返回值都是继承自jw.asmsupport.Parameterized接口的,这个接口意味着这个类还可以被其他的操作所使用,这个很容易理解,我可以将a+b这个运算作为参数传入某个方法,比如有个方法是c(int a),我们可以这样调用:c(a+b)。 </p>
点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Java修道之路,问鼎巅峰,我辈代码修仙法力齐天

<center<fontcolor00FF7Fsize5face"黑体"代码尽头谁为峰,一见秃头道成空。</font<center<fontcolor00FF00size5face"黑体"编程修真路破折,一步一劫渡飞升。</font众所周知,编程修真有八大境界:1.Javase练气筑基2.数据库结丹3.web前端元婴4.Jav