Java对象和数组操作(一)
2011-04-04 14:35
302 查看
1、针对对象的操作码
实例化一个新对象需要通过new操作码来实现。
对象的创建
new操作码后面紧跟一个无符号16位数,表示常量池中的一个索引。在特定偏移量位置处的常量池入口给出了新对象所属类的信息。如果还没有这些信息,那么虚拟机会解析这个常量池入口。它会为这个堆中的对象建立一个新的实例,用默认初始化对象实例变量,然后把新对象的引用压入栈。
存取实例变量
存取类变量
putfield和getfield这两个操作码只在字段是实例变量的情况下才执行,putstatic和getstatic对静态变量进行存取操作。操作数表示常量池的索引。这个索引所指向的常量池入口包含了该字段的所属类、名字和类型等信息。如果还没有这些信息,虚拟机会解析这个常量池入口。
例如下面代码:
public
class
TestA {
int
x;
int
y;
}
public
class
TestMain {
/**
* @param
args
*/
public
static
void
main(String[] args) {
//
TODO
Auto-generated method stub
TestA
testA = new
TestA();
testA.x
= 3;
testA.y
= 4;
}
}
用javap工具查看其字节码指令为:
Compiled
from "TestMain.java"
public
class TestMain extends java.lang.Object{
public
TestMain();
Code:
0: aload_0
1: invokespecial #8;
//Method java/lang/Object."<init>":()V
4: return
public
static void main(java.lang.String[]);
Code:
0: new #16;
//class TestA
新建
TestA对象
3: dup
//
4: invokespecial #18;
//Method TestA."<init>":()V
调用构造方法
7: astore_1
//存入位置为1的局部变量
8: aload_1
//取出位置为1的局部变量压入栈
9: iconst_3
//常量3入栈
10: putfield #19;
//Field TestA.x:I
赋值
13: aload_1
14: iconst_4
15: putfield #23;
//Field TestA.y:I
18: return
}
实例化一个新对象需要通过new操作码来实现。
对象的创建
操作码 | 操作数 | 说明 |
new | index | 在堆中创建一个新的对象,将其引用压入栈 |
存取实例变量
操作码 | 操作数 | 说明 |
putfield | index | 设置对象字段(由index指定)的值,值value和对象引用objectref均从栈中获得 |
getfield | index | 将对象字段(由index指定)压入栈,对象引用objectref栈中取得 |
操作码 | 操作数 | 说明 |
putstatic | index | 设置静态字段(由index指定)的值,值value从栈中获得 |
getstatic | index | 将静态字段(由index指定)压入栈 |
例如下面代码:
public
class
TestA {
int
x;
int
y;
}
public
class
TestMain {
/**
* @param
args
*/
public
static
void
main(String[] args) {
//
TODO
Auto-generated method stub
TestA
testA = new
TestA();
testA.x
= 3;
testA.y
= 4;
}
}
用javap工具查看其字节码指令为:
Compiled
from "TestMain.java"
public
class TestMain extends java.lang.Object{
public
TestMain();
Code:
0: aload_0
1: invokespecial #8;
//Method java/lang/Object."<init>":()V
4: return
public
static void main(java.lang.String[]);
Code:
0: new #16;
//class TestA
新建
TestA对象
3: dup
//
4: invokespecial #18;
//Method TestA."<init>":()V
调用构造方法
7: astore_1
//存入位置为1的局部变量
8: aload_1
//取出位置为1的局部变量压入栈
9: iconst_3
//常量3入栈
10: putfield #19;
//Field TestA.x:I
赋值
13: aload_1
14: iconst_4
15: putfield #23;
//Field TestA.y:I
18: return
}
相关文章推荐
- Java -- 利用反射 操作任意数组,包括对象数组 和 基本数据类型的数组
- Java -- 利用反射 操作任意数组,包括对象数组 和 基本数据类型的数组
- java对象与byte[]数组之间的相互转化,压缩解压缩操作
- Java常用类库——Arrays类(用于普通数组操作)、比较器(Comparable、Comparator 用于对象排序)的使用
- Java对象和数组操作(二)
- java:在Conllection接口中实际上也规定了两个可以将集合变成对象数组的操作
- Native Method中操作Java对象的属性为数组时的处理
- JAVA基础 day23 IO流的其他类 (对象的序列化 管道流 RandomAccessFile类(随机读取文件) DateStream(操作基本数据类型的流) 操作数组的流 )字符编码问题
- Java对象与byte[]数组之间的相互转化,压缩解压缩操作
- JAVA数组和JAVA集合类的对象操作-Java基础-Java-编程开发
- Java遍历数组对象的方式
- [JAVA]有关比较器(Comparator接口)的用法及对象数组排序问题
- 黑马程序员--Java基础加强--07.【反射创建对象 操作字段 调用方法的异同】【个人总结】
- Java:类的两个相同对象数组的克隆问题
- java输入&简单的数组操作
- java8-lambda操作数组、集合
- Arrays类应用·使用Arrays类操作Java中的数组
- Jedis存储Java对象(Java序列化为byte数组方式)
- Java对象与JSON互相转换jsonlib以及手动创建JSON对象与数组——(二)
- 使用JAVA反射机制将简单JAVA been对象、数组转化为对应的Json串