av = newArrayWithValue(AClassFactory.getArrayClass(String[][].class), new Value[][]{new Value[]{s200, s201}, new Value[]{s210, s211}}); LocalVariable s2 = createArrayVariable("s2", AClassFactory.getArrayClass(String[][].class), false, av);</pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div>
<p>这里就是创建数组的部分。</p> <h3><font style="font-weight: bold">获取数组的长度</font></h3> <hr /> <p>获取数组长度采用的方法是<strong>jw.asmsupport.block.ProgramBlock</strong>的:</p> <p> <strong><font color="#f79646">public final ArrayLength arrayLength(IVariable arrayReference, Parameterized... dims):</font></strong></p> <ul> <li><strong><font color="#000000">参数</font></strong> </li> </ul> <ol> <li>数组对象 </li> <li>数组的每个维度的下标,比如我们要获取i\[0\]\[1\].length, 我们就调用arrayLength(a, Value.value(0), Value.value(1)) </li> </ol> <ul> <li><strong>返回类型</strong> </li> </ul> <p>返回类型是<strong>jw.asmsupport.operators.array.ArrayLength</strong>,他是asmsupport对获取length操作的抽象.</p> <h3><font style="font-weight: bold">获取数组每个元素的内容 </font></h3> <hr /> <p>获取每个元素采用的方法是<strong>jw.asmsupport.block.ProgramBlock</strong>的:</p> <p><strong><font color="#f79646">public final ArrayLoader arrayLoad(IVariable arrayReference, Parameterized pardim, Parameterized... parDims):</font></strong></p> <ul> <li><strong><font color="#000000">参数</font></strong> </li> </ul> <ol> <li>数组对象 </li> <li>第一维的数组的下标 </li> <li>第二维开始,每个维度的下标 </li> </ol> <ul> <li><strong>返回类型</strong> </li> </ul> <p>返回类型是<strong>jw.asmsupport.operators.array.ArrayLoader</strong>,他是asmsupport对获取获取数组元素操作的抽象.</p> <h3><font style="font-weight: bold">为数组元素赋值</font></h3> <hr /> <p>为数组元素赋值采用的方法是<strong>jw.asmsupport.block.ProgramBlock</strong>的:</p> <p><strong><font color="#f79646">public final ArrayStorer arrayStore(IVariable arrayReference, Parameterized value, Parameterized dim, Parameterized... dims):</font></strong></p> <ul> <li><strong><font color="#000000">参数</font></strong> </li> </ul> <ol> <li>数组对象 </li> <li>为数组元素赋予的值 </li> <li>第一维的数组的下标 </li> <li>第二维开始,每个维度的下标 </li> </ol> <ul> <li><strong>返回类型</strong> </li> </ul> <p>返回类型是<strong>jw.asmsupport.operators.array.ArrayStorer</strong>,他是asmsupport对获取获取数组元素操作的抽象.</p> <h3><font style="font-weight: bold">实例</font></h3> <hr /> <p>我们需要生成如下代码:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:1675aea4-a49c-4bfb-be4e-a86977fcab5b" 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: 796px; height: 474px;" style=" width: 796px; height: 474px;overflow: auto;">public static void willGenerate(){ int\[\]\[\] i1 = new int\[2\]\[2\]; System.out.println("i1 = " + ArrayUtils.toString(i1));1int[][] i2 = new int[2][]; 2System.out.println("i2 = " + ArrayUtils.toString(i2)); 3 4String[] s1 = { "array \"s1\" first value", "array \"s1\" second value" }; 5System.out.println("s1 = " + ArrayUtils.toString(s1)); 6 7String[][] s2 = { { "s2[0][0]", "s2[0][1]" }, { "s2[1][0]", "s2[1][1]" } }; 8System.out.println("s2 = " + ArrayUtils.toString(s2)); 9 10//获取数组长度操作 11System.out.println("length of s2 is " + s2.length); 12System.out.println("length of s2[0] is " + s2[0].length); 13 14//获取数组内容的操作 15System.out.println("value of s2[0] is " + ArrayUtils.toString(s2[0])); 16System.out.println("value of s2[0][0] is " + ArrayUtils.toString(s2[0][0])); 17 18//为数组内容赋值的操作 19s2[0] = new String[]{ "new s2[0][0]", "new s2[0][1]" }; 20s2[1][0] = "new s2[1][0]"; 21System.out.println("new value of s2 is : " + ArrayUtils.toString(s2));
}</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:d69c19ba-b885-42ad-9dad-3f98f02f0731" 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: 796px; height: 2224px;" style=" width: 796px; height: 2224px;overflow: auto;">package example.operators;import org.apache.commons.lang.ArrayUtils; import org.objectweb.asm.Opcodes;
import jw.asmsupport.Parameterized; 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.array.ArrayValue;
import example.AbstractExample;
/**
-
在这个例子中我们将实现数组的相关操作
-
@author 温斯群(Joe Wen)
*/ public class ArrayOperatorGenerate extends AbstractExample {
1/** 2 * @param args 3 */ 4public static void main(String[] args) { 5 ClassCreator creator = new ClassCreator(Opcodes.V1_5, Opcodes.ACC_PUBLIC , "generated.operators.ArrayOperatorGenerateExample", null, null); 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 /* 13 * 1.首先我们需要创建一个数组。我们有两只方式创建数组,第一种是在创建数组的时候 14 * 为其分配数组空间。第二种是创建数组的时候为其分配初试值 15 */ 16 //int[][] i1 = new int[1][2]; 17 //System.out.println(ArrayUtils.toString(i1)); 18 19 /* 20 * 21 * 对应如下代码: 22 * int[][] i1 = new int[1][2]; 23 * System.out.println("i1 = " + ArrayUtils.toString(i1)); 24 */ 25 ArrayValue av = newArray(AClassFactory.getArrayClass(int[][].class), Value.value(2), Value.value(2)); 26 LocalVariable i1 = createArrayVariable("i1", AClassFactory.getArrayClass(int[][].class), false, av); 27 invoke(systemOut, "println", append(Value.value("i1 = "), invokeStatic(AClassFactory.getProductClass(ArrayUtils.class), "toString", i1))); 28 29 /* 30 * 下面一段代码将生成如下代码: 31 * int[][] i2 = new int[2][]; 32 * System.out.println("i2 = " + ArrayUtils.toString(i2)); 33 */ 34 av = newArray(AClassFactory.getArrayClass(int[][].class), Value.value(2)); 35 LocalVariable i2 = createArrayVariable("i2", AClassFactory.getArrayClass(int[][].class), false, av); 36 invoke(systemOut, "println", append(Value.value("i2 = "), invokeStatic(AClassFactory.getProductClass(ArrayUtils.class), "toString", i2))); 37 38 /* 39 * 对应如下代码: 40 * String[] s1 = new String[]{"array \"s1\" first value", "array \"s1\" second value"}; 41 * System.out.println("s1 = " + ArrayUtils.toString(s1)); 42 */ 43 av = newArrayWithValue(AClassFactory.getArrayClass(String[].class), new Value[]{Value.value("array \"s1\" first value"), Value.value("array \"s1\" second value")}); 44 LocalVariable s1 = createArrayVariable("s1", AClassFactory.getArrayClass(String[].class), false, av); 45 invoke(systemOut, "println", append(Value.value("s1 = "), invokeStatic(AClassFactory.getProductClass(ArrayUtils.class), "toString", s1))); 46 47 /* 48 * 对应如下代码: 49 * String[][] s2 = {{"s2[0][0]", "s2[0][1]"},{"s2[1][0]", "s2[1][1]"}}; 50 * System.out.println("s2 = " + ArrayUtils.toString(s2)); 51 */ 52 Value s200 = Value.value("s2[0][0]"); 53 Value s201 = Value.value("s2[0][1]"); 54 Value s210 = Value.value("s2[1][0]"); 55 Value s211 = Value.value("s2[1][1]"); 56 57 av = newArrayWithValue(AClassFactory.getArrayClass(String[][].class), 58 new Value[][]{new Value[]{s200, s201}, new Value[]{s210, s211}}); 59 LocalVariable s2 = createArrayVariable("s2", AClassFactory.getArrayClass(String[][].class), false, av); 60 invoke(systemOut, "println", append(Value.value("s2 = "), invokeStatic(AClassFactory.getProductClass(ArrayUtils.class), "toString", s2))); 61 62 /* 63 * 接下来我们将获取数组的长度: 64 * 代码如下: 65 * System.out.println("length of s2 is " + s2.length); 66 * System.out.println("length of s2[0] is " + s2[0].length); 67 */ 68 invoke(systemOut, "println", append(Value.value("length of s2 is "), arrayLength(s2))); 69 invoke(systemOut, "println", append(Value.value("length of s2[0] is "), arrayLength(s2, Value.value(0)))); 70 71 /* 72 * 接下来我们将实现如何获取数组的值 73 * 代码如下: 74 * System.out.println("value of s2[0] is " + ArrayUtils.toString(s2[0])); 75 * System.out.println("value of s2[0][0] is " + s2[0][0]); 76 */ 77 //s2[0] 78 Parameterized arrayLoader = arrayLoad(s2, Value.value(0)); 79 invoke(systemOut, "println", append(Value.value("value of s2[0] is "), invokeStatic(AClassFactory.getProductClass(ArrayUtils.class), "toString", arrayLoader))); 80 81 //s2[0][0] 82 arrayLoader = arrayLoad(s2, Value.value(0), Value.value(0)); 83 invoke(systemOut, "println", append(Value.value("value of s2[0][0] is "), invokeStatic(AClassFactory.getProductClass(ArrayUtils.class), "toString", arrayLoader))); 84 85 /* 86 * 接下来是如何实现为数组单元赋值的操作 87 * 代码如下 88 * s2[0] = new String[]{"new s2[0][0]", "new s2[0][1]"}; 89 * s2[1][0] = "new s2[1][0]" 90 * System.out.println("new value of s2 is : " + ArrayUtils.toString(s2)); 91 */ 92 arrayStore(s2, newArrayWithValue(AClassFactory.getArrayClass(String[].class), new Parameterized[]{Value.value("new s2[0][0]"), Value.value("new s2[0][1]")}), Value.value(0)); 93 arrayStore(s2, Value.value("new s2[1][0]"), Value.value(1), Value.value(0)); 94 invoke(systemOut, "println", append(Value.value("new value of s2 is : "), invokeStatic(AClassFactory.getProductClass(ArrayUtils.class), "toString", s2))); 95 96 runReturn(); 97 } 98 }); 99 generate(creator); 100}
} </pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div>