ASMSupport教程4.5 在Class中生成算術運算符

<h2>ASMSupport教程4.5 在Class中生成算術運算符</h2> <p>這節咱們開始介紹ASMSupport如何生成算數運算符(+-*/%),依舊先看咱們須要生成的java代碼:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:22b13b06-a0d6-4b8e-b7cd-7680d4653dde" 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: 439px; height: 1027px;" style=" width: 439px; height: 1027px;overflow: auto;">package generated.operators;java

import java.io.PrintStream; import java.util.Random;web

public class ArithmeticOperatorGenerateExample { static void printInt(String s, int i) { System.out.println(s + " = " + i); }app

static void printFloat(String s, float f) { System.out.println(s + " = " + f); }dom

public static void main(String[] args) { Random rand = new Random(); int j = rand.nextInt(100) + 1; int k = rand.nextInt(100) + 1; printInt("j", j); printInt("k", k); int i = j + k; printInt("j + k", i); i = j - k; printInt("j - k", i); i = k / j; printInt("k / j", i); i = k * j; printInt("k * j", i); i = k % j; printInt("k % j", i); j %= k; printInt("j %= k", j); float v = rand.nextFloat(); float w = rand.nextFloat(); printFloat("v", v); printFloat("w", w); float u = v + w; printFloat("v + w", u); u = v - w; printFloat("v - w", u); u = v * w; printFloat("v * w", u); u = v / w; printFloat("v / w", u); u += v; printFloat("u += v", u); u -= v; printFloat("u -= v", u); u *= v; printFloat("u *= v", u); u /= v; printFloat("u /= v", u); } }</pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div>ide

<p>對應的代碼以下,因爲代碼比較多,咱們將對應的java代碼寫在asmsupport代碼之上,便於對比。</p>3d

<div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:1bfe82d6-deba-48f1-853a-a748666c5148" 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: 462px; height: 3000px;" style=" width: 462px; height: 3000px;overflow: auto;">package example.operators;code

import java.util.Random;orm

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 jw.asmsupport.operators.method.MethodInvoker; import jw.asmsupport.operators.numerical.arithmetic.Addition;教程

import example.AbstractExample;

public class ArithmeticOperatorGenerate extends AbstractExample {

/**
 * @param args
 */
public static void main(String[] args) {
    ClassCreator creator = new ClassCreator(Opcodes.V1_5, Opcodes.ACC_PUBLIC, &quot;generated.operators.ArithmeticOperatorGenerateExample&quot;, null, null);

    //printIn方法
    creator.createStaticMethod(&quot;printInt&quot;, new AClass[]{AClass.STRING_ACLASS, AClass.INT_ACLASS}, new String[]{&quot;s&quot;, &quot;i&quot;}, null, null, 0, new StaticMethodBody(){

        @Override
        public void generateBody(LocalVariable... argus) {
            invoke(systemOut, &quot;println&quot;, append(argus[0], Value.value(&quot; = &quot;), argus[1]));
            runReturn();
        }
        
    });
    
    //printIn方法
    creator.createStaticMethod(&quot;printFloat&quot;, new AClass[]{AClass.STRING_ACLASS, AClass.FLOAT_ACLASS}, new String[]{&quot;s&quot;, &quot;f&quot;}, null, null, 0, new StaticMethodBody(){

        @Override
        public void generateBody(LocalVariable... argus) {
            invoke(systemOut, &quot;println&quot;, append(argus[0], Value.value(&quot; = &quot;), argus[1]));
            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) {
                    //Random rand = new Random();
                    LocalVariable rand = createVariable(&quot;rand&quot;, AClassFactory.getProductClass(Random.class), false, invokeConstructor(AClassFactory.getProductClass(Random.class)));
                    
                    //rand.nextInt(100) + 1
                    Addition add1 = add(invoke(rand, &quot;nextInt&quot;, Value.value(100)), Value.value(1));
                    
                    //int j = rand.nextInt(100) + 1;
                    LocalVariable j = createVariable(&quot;j&quot;, AClass.INT_ACLASS, false, add1);
                    
                    //int k = rand.nextInt(100) + 1;
                    LocalVariable k = createVariable(&quot;k&quot;, AClass.INT_ACLASS, false, add1);
                    
                    //printInt(&quot;j&quot;, j);
                    invokeStatic(getMethodOwner(), &quot;printInt&quot;, Value.value(&quot;j&quot;), j);

                    //printInt(&quot;k&quot;, k);
                    invokeStatic(getMethodOwner(), &quot;printInt&quot;, Value.value(&quot;k&quot;), k);
                    
                    //j + k
                    Addition add2 = add(j, k);
                    //int i = j + k;
                    LocalVariable i = createVariable(&quot;i&quot;, AClass.INT_ACLASS, false, add2);
                    
                    //printInt(&quot;j + k&quot;, i);
                    invokeStatic(getMethodOwner(), &quot;printInt&quot;, Value.value(&quot;j + k&quot;), i);
                    
                    //i = j - k;
                    assign(i, sub(j, k));
                    
                    //printInt(&quot;j - k&quot;, i);
                    invokeStatic(getMethodOwner(), &quot;printInt&quot;, Value.value(&quot;j - k&quot;), i);
                    
                    //i = k / j;
                    assign(i, div(k, j));
                    
                    //printInt(&quot;k / j&quot;, i);
                    invokeStatic(getMethodOwner(), &quot;printInt&quot;, Value.value(&quot;k / j&quot;), i);
                    
                    //i = k * j;
                    assign(i, mul(k, j));
                    
                    //printInt(&quot;k * j&quot;, i);
                    invokeStatic(getMethodOwner(), &quot;printInt&quot;, Value.value(&quot;k * j&quot;), i);
                    
                    //i = k % j;
                    assign(i, mod(k, j));
                    
                    //printInt(&quot;k % j&quot;, i);
                    invokeStatic(getMethodOwner(), &quot;printInt&quot;, Value.value(&quot;k % j&quot;), i);
                    
                    //j %= k;
                    assign(j, mod(j, k));
                    
                    //printInt(&quot;j %= k&quot;, j);
                    invokeStatic(getMethodOwner(), &quot;printInt&quot;, Value.value(&quot;j %= k&quot;), j);
                    
                    
                    //rand.nextFloat()
                    MethodInvoker nextFloat = invoke(rand, &quot;nextFloat&quot;);
                    
                    //v = rand.nextFloat();
                    LocalVariable v = createVariable(&quot;v&quot;, AClass.FLOAT_ACLASS, false, nextFloat);
                    
                    //w = rand.nextFloat();
                    LocalVariable w = createVariable(&quot;w&quot;, AClass.FLOAT_ACLASS, false, nextFloat);
                    
                    //printFloat(&quot;v&quot;, v);
                    invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;v&quot;), v);
                    
                    //printFloat(&quot;w&quot;, w);
                    invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;w&quot;), w);
                    
                    //u = v + w;
                    LocalVariable u = createVariable(&quot;u&quot;, AClass.FLOAT_ACLASS, false, add(v,w));
                    
                    //printFloat(&quot;v + w&quot;, u);
                    invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;v + w&quot;), u);

                    //u = v - w;
                    assign(u, sub(v, w));
                    
                    //printFloat(&quot;v - w&quot;, u);
                    invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;v - w&quot;), u);
                    
                    //u = v * w;
                    assign(u, mul(v, w));
                    
                    //printFloat(&quot;v * w&quot;, u);
                    invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;v * w&quot;), u);
                    
                    //u = v / w;
                    assign(u, div(v, w));
                    
                    //printFloat(&quot;v / w&quot;, u);
                    invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;v / w&quot;), u);
                    
                    //u += v;
                    assign(u, add(u, v));
                    
                    //printFloat(&quot;u += v&quot;, u);
                    invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;u += v&quot;), u);
                    
                    //u -= v;
                    assign(u, sub(u, v));
                    
                    //printFloat(&quot;u -= v&quot;, u);
                    invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;u -= v&quot;), u);
                    
                    //u *= v;
                    assign(u, mul(u, v));
                    
                    //printFloat(&quot;u *= v&quot;, u);
                    invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;u *= v&quot;), u);
                    
                    //u /= v;
                    assign(u, div(u, v));
                    
                    //printFloat(&quot;u /= v&quot;, u);
                    invokeStatic(getMethodOwner(), &quot;printFloat&quot;, Value.value(&quot;u /= v&quot;), u);
                    
                    runReturn();
                }
            });
    generate(creator);
}

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

<p>這裏咱們不逐行解釋,只對生成算術操做的方法進行解釋:</p>

<ul> <li><strong>jw.asmsupport.block.ProgramBlock.add(Parameterized factor1, Parameterized factor2) :</strong> 生成加法操做,生成的代碼是factor1+factor2,返回類型<strong><font color="#ffc000">jw.asmsupport.operators.numerical.arithmetic.Addition</font></strong> </li>

<li><strong>jw.asmsupport.block.ProgramBlock.sub(Parameterized factor1, Parameterized factor2) :</strong> 生成減法操做,生成的代碼是factor1-factor2 , 返回類型<strong><font color="#ffc000">jw.asmsupport.operators.numerical.arithmetic.Subtraction</font></strong> </li>

<li><strong>jw.asmsupport.block.ProgramBlock.mul(Parameterized factor1, Parameterized factor2):</strong> 生成乘法操做,生成的代碼是factor1*factor2 , 返回類型<strong><font color="#ffc000">jw.asmsupport.operators.numerical.arithmetic.Multiplication</font></strong> </li>

<li><strong>jw.asmsupport.block.ProgramBlock.div(Parameterized factor1, Parameterized factor2):</strong>&#160; 生成除法操做,生成的代碼是factor1/factor2 , 返回類型<strong><font color="#ffc000">jw.asmsupport.operators.numerical.arithmetic.Division</font></strong> </li>

<li><strong>jw.asmsupport.block.ProgramBlock.mod(Parameterized factor1, Parameterized factor2):</strong>生成取模操做,生成的代碼是factor1%factor2 , 返回類型<strong><font color="#ffc000">jw.asmsupport.operators.numerical.arithmetic.Modulus</font></strong> </li> </ul>

<p>這些方法的返回值都是繼承自jw.asmsupport.Parameterized接口的,這個接口意味着這個類還能夠被其餘的操做所使用,這個很容易理解,我能夠將a+b這個運算做爲參數傳入某個方法,好比有個方法是c(int a),咱們能夠這樣調用:c(a+b)。 </p>

相關文章
相關標籤/搜索