我在博客上发表一些我的反编译学习心得,希望对大家能有帮助。
这一章学习基本的迭代器Iterator基本使用和反编译smali后迭代器的查看
1、常见的两种迭代器代码
//第一个中使用for-each
Iterator<对象> <对象名> = <方法返回的一个对象列表>;
for(<对象> <对象名> : <对象列表>) {
[具体处理代码]
}
//第二种使用while
Iterator<对象> <对象名> = <方法返回的一个对象列表>;
while(<对象列表>.hasNext()) {
<对象> <对象名> = <对象列表>.next();
[具体处理代码]
}
Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素,如果仍有元素可以迭代,则返回 true。
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
我们常用的实现了该接口的子接口有:
Collection<E>, Deque<E>, List<E>, Queue<E>, Set<E> 等.
该接口的iterator()方法返回一个标准的Iterator实现。
2、现在从例子来学习
//第一个简单的for-each例子
import java.util.ArrayList;
import java.util.List;
public class TestIterator {
public static void main(String []args) {
List<String> l = new ArrayList<String>();
l.add("aa");
l.add("bb");
l.add("cc");
for (String s:l) {
System.out.println(s);
}
}
}
这个程序很简单,创建一个List<String>的迭代器,然后添加3个字符串,最后通过for-each显示出来。
我们需要把TestIterator.java编译成smali文件才能进行查看反编译代码。
如何进行请查看 Android学习心得(4) --- MAC下smali文件编写与运行
Android学习心得(4) --- MAC下smali文件编写与运行
生成的TestIterator.smali文件中处理迭代器的主要代码如下:
//迭代循环开始
:goto_18
//开始迭代
invoke-interface {v1}, Ljava/util/Iterator;->hasNext()Z
move-result v0
//如果为空,则跳到cond_2a
if-eqz v0, :cond_2a
//循环每一项
invoke-interface {v1}, Ljava/util/Iterator;->next()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/lang/String;
.line 12
sget-object v2, Ljava/lang/System;->out:Ljava/io/PrintStream;
invoke-virtual {v2, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
goto :goto_18
.line 14
:cond_2a
//第二个简单的while例子
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class TestIterator {
public static void main(String []args) {
List<String> l = new ArrayList<String>();
l.add("aa");
l.add("bb");
l.add("cc");
Iterator iter = l.iterator();
while (iter.hasNext()) {
String s = (String) iter.next();
System.out.println(s);
}
}
}
:goto_18
invoke-interface {v1}, Ljava/util/Iterator;->hasNext()Z
move-result v0
if-eqz v0, :cond_2a
.line 13
invoke-interface {v1}, Ljava/util/Iterator;->next()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/lang/String;
.line 14
sget-object v2, Ljava/lang/System;->out:Ljava/io/PrintStream;
invoke-virtual {v2, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
goto :goto_18
.line 16
:cond_2a
基本上while循环和for-each基本相似。
迭代循环:
1、使用hasNext()方法检测循环条件
2、使用next()方法获得单个对象
3、循环中用goto指令控制