1.内部类:一个包含简单的匿名内部类的代码:
public class EventQs extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获取应用程序中的bn按钮
Button bn = (Button) findViewById(R.id.bn);
// 为按钮绑定事件监听器。
bn.setOnClickListener(new MyClickListener()); // ①
}
// 定义一个单击事件的监听器
class MyClickListener implements View.OnClickListener
{
// 实现监听器类必须实现的方法,该方法将会作为事件处理器
@Override
public void onClick(View v)
{
EditText txt = (EditText) findViewById(R.id.txt);
txt.setText("bn按钮被单击了!");
}
}
}
在EventQs 的smali的代码中 会包含这样的注释:
# annotations
.annotation system Ldalvik/annotation/MemberClasses;
value = {
Lorg/crazyit/event/EventQs$MyClickListener;
}
.end annotation
MemberClasses 为内部类,他代表这该类中内部类的列表,其中value中就包含了一个内部类MyClickListener
而内部类的反编译代码中包含的注释也说明自身是一个内部类。
EventQs$MyClickListener.smali:
# annotations
.annotation system Ldalvik/annotation/EnclosingClass;
value = Lorg/crazyit/event/EventQs;
.end annotation
.annotation system Ldalvik/annotation/InnerClass;
accessFlags = 0x0
name = "MyClickListener"
.end annotation
EnclosingClass注解表明MainActivity$SNChecker作用于一个类,注解的value表明这个类是MainActivity。在EnclosingClass注解的下面是InnerClass,它表明自身是一个内部类,其中的accessFlags访问标志是一个枚举值
public class ViewSwitcherTest extends Activity
{
public static class DataItem
{
// 应用程序名称
public String dataName;
// 应用程序图标
public Drawable drawable;
}
ArrayList items = new ArrayList();
};
在ViewSwitcherTest 中内部类对应的代码 使用注释类来表达
# annotations
.annotation system Ldalvik/annotation/MemberClasses;
value = {
Lorg/crazyit/ui/ViewSwitcherTest$DataItem;
}
.end annotation
MemberClasses注解是一个系统注解,作用是为父类提供一个内部类列表
而在ViewSwitcherTest$DataItem中自身的类申明为:
# annotations
.annotation system Ldalvik/annotation/EnclosingClass;
value = Lorg/crazyit/ui/ViewSwitcherTest;
.end annotation
.annotation system Ldalvik/annotation/InnerClass;
accessFlags = 0x9
name = "DataItem"
.end annotation
EnclosingClas表示DataItem作用于ViewSwitcherTest。下面的InnerClass表明他是一个子类,该子类的名字为DataItem。
利用内部类 创建的ArrayList对象:ArrayList items = new ArrayList();
.field private items:Ljava/util/ArrayList;
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/util/ArrayList",
"<",
"Lorg/crazyit/ui/ViewSwitcherTest$DataItem;",
">;"
}
.end annotation
.end field
2.泛型
Class>[] claszzs={PreferenceActivityTest.class,ExpandableListActivityTest.class};其代码为:实例字段,其中?变成了*
# instance fields
.field claszzs:[Ljava/lang/Class;
.annotation system Ldalvik/annotation/Signature;
value = {
"[",
"Ljava/lang/Class",
"<*>;"
}
.end annotation
.end field
3. 判断是否为指定类的实例if (!(activity instanceof Callbacks))
其反编译代码:
instance-of v0, p1, Lcom/example/fargmenttest2/BookListFragment$Callbacks;
判断p1是否是其后的类的实例(也可以是接口)如果是返回非0值给v0 否则返回0
4.异常
throw new IllegalStateException("BookListFargment所在的activity必须实现callbacks接口!");
反编译代码:
new-instance v0, Ljava/lang/IllegalStateException;
const-string v1, "BookListFargment\u6240\u5728\u7684activity\u5fc5\u987b\u5b9e\u73b0callbacks\u63a5\u53e3\uff01"
invoke-direct {v0, v1}, Ljava/lang/IllegalStateException;->(Ljava/lang/String;)V
throw v0
5.返回值
protected ArrayList