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 example.AbstractExample;
public class RelationalOperatorGenerate extends AbstractExample {
1public static void main(String[] args) { 2 ClassCreator creator = new ClassCreator(Opcodes.V1_5, Opcodes.ACC_PUBLIC , "generated.operators.RelationalOperatorGenerateExample", null, null); 3 4 /* 5 * 6 */ 7 creator.createStaticMethod("main", new AClass[]{AClassFactory.getProductClass(String[].class)}, new String[]{"args"}, null, null, 8 Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, new StaticMethodBody(){ 9 10 @Override 11 public void generateBody(LocalVariable... argus) { 12 //Random rand = new Random(); 13 LocalVariable rand = createVariable("rand", AClassFactory.getProductClass(Random.class), false, 14 invokeConstructor(AClassFactory.getProductClass(Random.class))); 15 16 //int i = rand.nextInt(100); 17 LocalVariable i = createVariable("i", AClass.INT_ACLASS, false, 18 invoke(rand, "nextInt", Value.value(100))); 19 20 //int j = rand.nextInt(100); 21 LocalVariable j = createVariable("j", AClass.INT_ACLASS, false, 22 invoke(rand, "nextInt", Value.value(100))); 23 24 //System.out.println("i = " + i); 25 invoke(systemOut, "println", append(Value.value("i = "), i)); 26 27 //System.out.println("j = " + j); 28 invoke(systemOut, "println", append(Value.value("j = "), j)); 29 30 //System.out.println("i > j is " + (i > j)); 31 invoke(systemOut, "println", append(Value.value("i > j is "), greaterThan(i, j))); 32 33 //System.out.println("i < j is " + (i < j)); 34 invoke(systemOut, "println", append(Value.value("i < j is "), lessThan(i, j))); 35 36 //System.out.println("i >= j is " + (i >= j)); 37 invoke(systemOut, "println", append(Value.value("i >= j is "), greaterEqual(i, j))); 38 39 //System.out.println("i <= j is " + (i <= j)); 40 invoke(systemOut, "println", append(Value.value("i <= j is "), lessEqual(i, j))); 41 42 //System.out.println("i == j is " + (i == j)); 43 invoke(systemOut, "println", append(Value.value("i == j is "), equal(i, j))); 44 45 //System.out.println("i != j is " + (i != j)); 46 invoke(systemOut, "println", append(Value.value("i != j is "), notEqual(i, j))); 47 48 //System.out.println("(i < 10) && (j < 10) is " + ((i < 10) && (j < 10))); 49 invoke(systemOut, "println", append(Value.value("(i < 10) && (j < 10) is "), 50 conditionalAnd(lessThan(i, Value.value(10)), lessThan(j, Value.value(10))))); 51 52 //System.out.println("(i < 10) || (j < 10) is " + ((i < 10) || (j < 10))); 53 invoke(systemOut, "println", append(Value.value("(i < 10) || (j < 10) is "), 54 conditionalOr(lessThan(i, Value.value(10)), lessThan(j, Value.value(10))))); 55 56 runReturn(); 57 } 58 }); 59 generate(creator); 60}
} </pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div>
<p>这里面我们主要介绍这关系运算所对应的asmsupport的方法(这些方法都是属于jw.asmsupport.block.ProgramBlock的):</p> <p><font color="#f79646">public final GreaterThan greaterThan(Parameterized factor1, Parameterized factor2)</font>: >运算符的操作。</p> <p><font color="#f79646">public final GreaterThan greaterEqual(Parameterized factor1, Parameterized factor2) </font><font color="#000000">: >=运算符。</font></p> <p><font color="#f79646">public final GreaterThan lessThan(Parameterized factor1, Parameterized factor2) </font><font color="#000000">: <运算符。</font></p> <p><font color="#f79646">public final GreaterThan lessEqual(Parameterized factor1, Parameterized factor2) </font><font color="#000000">: <=运算符。</font></p> <p><font color="#f79646">public final GreaterThan lessEqual(Parameterized factor1, Parameterized factor2) </font><font color="#000000">: ==运算符。</font></p> <p><font color="#f79646">public final GreaterThan lessEqual(Parameterized factor1, Parameterized factor2) </font><font color="#000000">: !=运算符。</font></p> <p>这些方法都有两个参数,分别表示运算符前后的两个参数。比如a==b,那么factor1表示a,factor2表示b</p> <p> </p> <p>上面asmsupport代码中还有conditionalAnd和conditionalOr方法,这是逻辑运算符,将在以后讲解。</p>