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 {

/**
 * @param args
 */
public static void main(String[] args) {

	ClassCreator creator = new ClassCreator(Opcodes.V1_5, Opcodes.ACC_PUBLIC , &quot;generated.operators.CrementOperatorGenerateExample&quot;, null, null);
	
	/*
	 * 对应java代码
     * public void demonstrate() {
     *     System.out.println(&quot;******************************demonstrate***************************&quot;);
     *     int a = 1;
     *     int b = 2;
     *     int c;
     *     int d;
     *     c = ++b;
     *     d = a++;
     *     c++;
     *     System.out.println(&quot;a = &quot; + a);
     *     System.out.println(&quot;b = &quot; + b);
     *     System.out.println(&quot;c = &quot; + c);
     *     System.out.println(&quot;d = &quot; + d);
     * }
	 */
	creator.createMethod(&quot;demonstrate&quot;, null, null, null, null, Opcodes.ACC_PUBLIC, new CommonMethodBody() {
		@Override
		public void generateBody(LocalVariable... argus) {
			invoke(systemOut, &quot;println&quot;, Value.value(&quot;******************************demonstrate***************************&quot;));
			
			//int a = 1;
		    LocalVariable a = createVariable(&quot;a&quot;, AClass.INT_ACLASS, false, Value.value(1));
		    //int b = 2;
		    LocalVariable b = createVariable(&quot;b&quot;, AClass.INT_ACLASS, false, Value.value(2));
		    //int c = ++b;
		    LocalVariable c = createVariable(&quot;c&quot;, AClass.INT_ACLASS, false, beforeInc(b));
		    //d = a++;
		    LocalVariable d = createVariable(&quot;d&quot;, AClass.INT_ACLASS, false, afterInc(a));
		    //c++;
		    afterInc(c);
		    
		    //System.out.println(&quot;a = &quot; + a);
			invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;a = &quot;), a)); 
			invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;b = &quot;), b)); 
			invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;c = &quot;), c)); 
			invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;d = &quot;), d)); 
			runReturn();
		}
	});
	
	/*
	 * java code:
	 * public void incrementAndDecrement(String[] argv) {
	 *    System.out.println(&quot;******************************incrementAndDecrement***************************&quot;);
     *    int count = 10;
     *    ++count;
     *    --count;
     *    System.out.println(count);
     * }
	 */
	creator.createMethod(&quot;incrementAndDecrement&quot;, null, null, null, null, Opcodes.ACC_PUBLIC, new CommonMethodBody() {
	    @Override
	    public void generateBody(LocalVariable... argus) {
			invoke(systemOut, &quot;println&quot;, Value.value(&quot;******************************incrementAndDecrement***************************&quot;));
			//int count = 10;
			LocalVariable count = createVariable(&quot;count&quot;, AClass.INT_ACLASS, false, Value.value(10));
			// ++count
			beforeInc(count); 
			// --count;
			beforeDec(count); 
			// System.out.println(&quot;count = &quot; +  count);
			invoke(systemOut, &quot;println&quot;, append(Value.value(&quot;count = &quot;), count));
			runReturn();
		}
	});
	
	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) {
			LocalVariable currentObj = createVariable(&quot;currentObj&quot;, getMethodOwner(), false, invokeConstructor(getMethodOwner()));
			invoke(currentObj, &quot;demonstrate&quot;);
			invoke(currentObj, &quot;incrementAndDecrement&quot;);
			runReturn();
		}
    });
	generate(creator);
}

} </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>

转载于:https://my.oschina.net/wensiqun/blog/140984

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值