ASMSupport教程4.4 自增减操作(++,

<h2>4.4 自增减操作(++,—)</h2> <p>我们知道,++和--是各种编程语言的基本操作,其作用就不解释了,直接进入正题,我们希望生成如下代码</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:030ff93f-6abb-4574-b183-2e855d30580b" 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: 612px; height: 676px;" style=" width: 612px; height: 676px;overflow: auto;">package generated.operators;

import java.io.PrintStream;

public class CrementOperatorGenerateExample { public void demonstrate() { System.out.println("***demonstrate"); int a = 1; int b = 2; b++; int c = b; int d = a; a++; c++; System.out.println("a = " + a); System.out.println("b = " + b); System.out.println("c = " + c); System.out.println("d = " + d); }

public void incrementAndDecrement() { System.out.println("***incrementAndDecrement"); int count = 10; count++; count--; System.out.println("count = " + count); }

public static void main(String[] args) { CrementOperatorGenerateExample currentObj = new CrementOperatorGenerateExample(); currentObj.demonstrate(); currentObj.incrementAndDecrement(); } }</pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div>

<p>那么通过如下ASMSupport代码就能生成:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:17542434-1605-4aed-99c4-e804419553c5" 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: 612px; height: 1897px;" style=" width: 612px; height: 1897px;overflow: auto;">package example.operators;

import org.objectweb.asm.Opcodes;

import jw.asmsupport.block.method.common.CommonMethodBody; 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 CrementOperatorGenerate extends AbstractExample {

1/** 2 * @param args 3 */ 4public static void main(String[] args) { 5 6 ClassCreator creator = new ClassCreator(Opcodes.V1_5, Opcodes.ACC_PUBLIC , &quot;generated.operators.CrementOperatorGenerateExample&quot;, null, null); 7 8 /* 9 * 对应java代码 10 * public void demonstrate() { 11 * System.out.println(&quot;******************************demonstrate***************************&quot;); 12 * int a = 1; 13 * int b = 2; 14 * int c; 15 * int d; 16 * c = ++b; 17 * d = a++; 18 * c++; 19 * System.out.println(&quot;a = &quot; + a); 20 * System.out.println(&quot;b = &quot; + b); 21 * System.out.println(&quot;c = &quot; + c); 22 * System.out.println(&quot;d = &quot; + d); 23 * } 24 */ 25 creator.createMethod(&quot;demonstrate&quot;, null, null, null, null, Opcodes.ACC_PUBLIC, new CommonMethodBody() { 26 @Override 27 public void generateBody(LocalVariable... argus) { 28 invoke(systemOut, &quot;println&quot;, Value.value(&quot;******************************demonstrate***************************&quot;)); 29 30 //int a = 1; 31 LocalVariable a = createVariable(&quot;a&quot;, AClass.INT_ACLASS, false, Value.value(1)); 32 //int b = 2; 33 LocalVariable b = createVariable(&quot;b&quot;, AClass.INT_ACLASS, false, Value.value(2)); 34 //int c = ++b; 35 LocalVariable c = createVariable(&quot;c&quot;, AClass.INT_ACLASS, false, beforeInc(b)); 36 //d = a++; 37 LocalVariable d = createVariable(&quot;d&quot;, AClass.INT_ACLASS, false, afterInc(a)); 38 //c++; 39 afterInc(c); 40 41 //System.out.println(&quot;a = &quot; + a); 42 invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;a = &quot;), a)); 43 invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;b = &quot;), b)); 44 invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;c = &quot;), c)); 45 invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;d = &quot;), d)); 46 runReturn(); 47 } 48 }); 49 50 /* 51 * java code: 52 * public void incrementAndDecrement(String[] argv) { 53 * System.out.println(&quot;******************************incrementAndDecrement***************************&quot;); 54 * int count = 10; 55 * ++count; 56 * --count; 57 * System.out.println(count); 58 * } 59 */ 60 creator.createMethod(&quot;incrementAndDecrement&quot;, null, null, null, null, Opcodes.ACC_PUBLIC, new CommonMethodBody() { 61 @Override 62 public void generateBody(LocalVariable... argus) { 63 invoke(systemOut, &quot;println&quot;, Value.value(&quot;******************************incrementAndDecrement***************************&quot;)); 64 //int count = 10; 65 LocalVariable count = createVariable(&quot;count&quot;, AClass.INT_ACLASS, false, Value.value(10)); 66 // ++count 67 beforeInc(count); 68 // --count; 69 beforeDec(count); 70 // System.out.println(&quot;count = &quot; + count); 71 invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;count = &quot;), count)); 72 runReturn(); 73 } 74 }); 75 76 creator.createStaticMethod(&quot;main&quot;, new AClass[]{AClassFactory.getProductClass(String[].class)}, new String[]{&quot;args&quot;}, null, null, 77 Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, new StaticMethodBody(){ 78 79 @Override 80 public void generateBody(LocalVariable... argus) { 81 LocalVariable currentObj = createVariable(&quot;currentObj&quot;, getMethodOwner(), false, invokeConstructor(getMethodOwner())); 82 invoke(currentObj, &quot;demonstrate&quot;); 83 invoke(currentObj, &quot;incrementAndDecrement&quot;); 84 runReturn(); 85 } 86 }); 87 generate(creator); 88}

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

<p>我们主要关注的是creator.createMethod(&quot;demonstrate&quot;, null, null, null, null, Opcodes.ACC\_PUBLIC, new CommonMethodBody()这份部分内容以及creator.createMethod(&quot;incrementAndDecrement&quot;, null, null, null, null, Opcodes.ACC\_PUBLIC, new CommonMethodBody()部分,创建变量部分就不解释了,如果不知道的可以参数前一章<a href="http://www.wensiqun.com/2013/06/23/asmsupport\_tutorial\_4\_2.html">ASMSupport教程2动态生成类</a>,我们这里主要关注一下四个方法:</p> <ul> <li><strong>beforeInc: </strong>这个方法相当于++a操作 </li> <li><strong>afterInc:</strong>这个方法相当于a++操作 </li> <li><strong>beforeDec:</strong>这个方法相当于--a操作 </li> <li><strong>afterDec:</strong>这个方法相当于a--操作 </li> </ul> <p>以上四个方法都只有一个参数,参数类型是继承Crementable类型的,在ASMSupport中jw.asmsupport.definition.variable.GlobalVariable和jw.asmsupport.definition.variable.LocalVariable。也就是说我们定义的类属性和局部变量都是可以的,但是得注意,这些变量必须是可以执行++或--操作的,这也和平常java语法是一样的。</p> <p>本系列教程所有实例下载地址:<a title="http://www.wensiqun.com/download/118/" href="http://www.wensiqun.com/download/118/">http://www.wensiqun.com/download/118/</a></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(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之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 )