<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 , "generated.operators.CrementOperatorGenerateExample", null, null);
/*
* 对应java代码
* public void demonstrate() {
* System.out.println("******************************demonstrate***************************");
* int a = 1;
* int b = 2;
* int c;
* int d;
* c = ++b;
* d = a++;
* c++;
* System.out.println("a = " + a);
* System.out.println("b = " + b);
* System.out.println("c = " + c);
* System.out.println("d = " + d);
* }
*/
creator.createMethod("demonstrate", null, null, null, null, Opcodes.ACC_PUBLIC, new CommonMethodBody() {
@Override
public void generateBody(LocalVariable... argus) {
invoke(systemOut, "println", Value.value("******************************demonstrate***************************"));
//int a = 1;
LocalVariable a = createVariable("a", AClass.INT_ACLASS, false, Value.value(1));
//int b = 2;
LocalVariable b = createVariable("b", AClass.INT_ACLASS, false, Value.value(2));
//int c = ++b;
LocalVariable c = createVariable("c", AClass.INT_ACLASS, false, beforeInc(b));
//d = a++;
LocalVariable d = createVariable("d", AClass.INT_ACLASS, false, afterInc(a));
//c++;
afterInc(c);
//System.out.println("a = " + a);
invoke(systemOut, "println", append(Value.value("a = "), a));
invoke(systemOut, "println", append(Value.value("b = "), b));
invoke(systemOut, "println", append(Value.value("c = "), c));
invoke(systemOut, "println", append(Value.value("d = "), d));
runReturn();
}
});
/*
* java code:
* public void incrementAndDecrement(String[] argv) {
* System.out.println("******************************incrementAndDecrement***************************");
* int count = 10;
* ++count;
* --count;
* System.out.println(count);
* }
*/
creator.createMethod("incrementAndDecrement", null, null, null, null, Opcodes.ACC_PUBLIC, new CommonMethodBody() {
@Override
public void generateBody(LocalVariable... argus) {
invoke(systemOut, "println", Value.value("******************************incrementAndDecrement***************************"));
//int count = 10;
LocalVariable count = createVariable("count", AClass.INT_ACLASS, false, Value.value(10));
// ++count
beforeInc(count);
// --count;
beforeDec(count);
// System.out.println("count = " + count);
invoke(systemOut, "println", append(Value.value("count = "), count));
runReturn();
}
});
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) {
LocalVariable currentObj = createVariable("currentObj", getMethodOwner(), false, invokeConstructor(getMethodOwner()));
invoke(currentObj, "demonstrate");
invoke(currentObj, "incrementAndDecrement");
runReturn();
}
});
generate(creator);
}
} </pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div>
<p>我们主要关注的是creator.createMethod("demonstrate", null, null, null, null, Opcodes.ACC_PUBLIC, new CommonMethodBody()这份部分内容以及creator.createMethod("incrementAndDecrement", 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>