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));int[][] i2 = new int[2][]; System.out.println("i2 = " + ArrayUtils.toString(i2)); String[] s1 = { "array \"s1\" first value", "array \"s1\" second value" }; System.out.println("s1 = " + ArrayUtils.toString(s1)); String[][] s2 = { { "s2[0][0]", "s2[0][1]" }, { "s2[1][0]", "s2[1][1]" } }; System.out.println("s2 = " + ArrayUtils.toString(s2)); //获取数组长度操作 System.out.println("length of s2 is " + s2.length); System.out.println("length of s2[0] is " + s2[0].length); //获取数组内容的操作 System.out.println("value of s2[0] is " + ArrayUtils.toString(s2[0])); System.out.println("value of s2[0][0] is " + ArrayUtils.toString(s2[0][0])); //为数组内容赋值的操作 s2[0] = new String[]{ "new s2[0][0]", "new s2[0][1]" }; s2[1][0] = "new s2[1][0]"; System.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 {
/** * @param args */ public static void main(String[] args) { ClassCreator creator = new ClassCreator(Opcodes.V1_5, Opcodes.ACC_PUBLIC , "generated.operators.ArrayOperatorGenerateExample", null, null); 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) { /* * 1.首先我们需要创建一个数组。我们有两只方式创建数组,第一种是在创建数组的时候 * 为其分配数组空间。第二种是创建数组的时候为其分配初试值 */ //int[][] i1 = new int[1][2]; //System.out.println(ArrayUtils.toString(i1)); /* * * 对应如下代码: * int[][] i1 = new int[1][2]; * System.out.println("i1 = " + ArrayUtils.toString(i1)); */ ArrayValue av = newArray(AClassFactory.getArrayClass(int[][].class), Value.value(2), Value.value(2)); LocalVariable i1 = createArrayVariable("i1", AClassFactory.getArrayClass(int[][].class), false, av); invoke(systemOut, "println", append(Value.value("i1 = "), invokeStatic(AClassFactory.getProductClass(ArrayUtils.class), "toString", i1))); /* * 下面一段代码将生成如下代码: * int[][] i2 = new int[2][]; * System.out.println("i2 = " + ArrayUtils.toString(i2)); */ av = newArray(AClassFactory.getArrayClass(int[][].class), Value.value(2)); LocalVariable i2 = createArrayVariable("i2", AClassFactory.getArrayClass(int[][].class), false, av); invoke(systemOut, "println", append(Value.value("i2 = "), invokeStatic(AClassFactory.getProductClass(ArrayUtils.class), "toString", i2))); /* * 对应如下代码: * String[] s1 = new String[]{"array \"s1\" first value", "array \"s1\" second value"}; * System.out.println("s1 = " + ArrayUtils.toString(s1)); */ av = newArrayWithValue(AClassFactory.getArrayClass(String[].class), new Value[]{Value.value("array \"s1\" first value"), Value.value("array \"s1\" second value")}); LocalVariable s1 = createArrayVariable("s1", AClassFactory.getArrayClass(String[].class), false, av); invoke(systemOut, "println", append(Value.value("s1 = "), invokeStatic(AClassFactory.getProductClass(ArrayUtils.class), "toString", s1))); /* * 对应如下代码: * String[][] s2 = {{"s2[0][0]", "s2[0][1]"},{"s2[1][0]", "s2[1][1]"}}; * System.out.println("s2 = " + ArrayUtils.toString(s2)); */ Value s200 = Value.value("s2[0][0]"); Value s201 = Value.value("s2[0][1]"); Value s210 = Value.value("s2[1][0]"); Value s211 = Value.value("s2[1][1]"); 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); invoke(systemOut, "println", append(Value.value("s2 = "), invokeStatic(AClassFactory.getProductClass(ArrayUtils.class), "toString", s2))); /* * 接下来我们将获取数组的长度: * 代码如下: * System.out.println("length of s2 is " + s2.length); * System.out.println("length of s2[0] is " + s2[0].length); */ invoke(systemOut, "println", append(Value.value("length of s2 is "), arrayLength(s2))); invoke(systemOut, "println", append(Value.value("length of s2[0] is "), arrayLength(s2, Value.value(0)))); /* * 接下来我们将实现如何获取数组的值 * 代码如下: * System.out.println("value of s2[0] is " + ArrayUtils.toString(s2[0])); * System.out.println("value of s2[0][0] is " + s2[0][0]); */ //s2[0] Parameterized arrayLoader = arrayLoad(s2, Value.value(0)); invoke(systemOut, "println", append(Value.value("value of s2[0] is "), invokeStatic(AClassFactory.getProductClass(ArrayUtils.class), "toString", arrayLoader))); //s2[0][0] arrayLoader = arrayLoad(s2, Value.value(0), Value.value(0)); invoke(systemOut, "println", append(Value.value("value of s2[0][0] is "), invokeStatic(AClassFactory.getProductClass(ArrayUtils.class), "toString", arrayLoader))); /* * 接下来是如何实现为数组单元赋值的操作 * 代码如下 * s2[0] = new String[]{"new s2[0][0]", "new s2[0][1]"}; * s2[1][0] = "new s2[1][0]" * System.out.println("new value of s2 is : " + ArrayUtils.toString(s2)); */ arrayStore(s2, newArrayWithValue(AClassFactory.getArrayClass(String[].class), new Parameterized[]{Value.value("new s2[0][0]"), Value.value("new s2[0][1]")}), Value.value(0)); arrayStore(s2, Value.value("new s2[1][0]"), Value.value(1), Value.value(0)); invoke(systemOut, "println", append(Value.value("new value of s2 is : "), invokeStatic(AClassFactory.getProductClass(ArrayUtils.class), "toString", s2))); runReturn(); } }); generate(creator); }
} </pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div>