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