`
simpleman7210
  • 浏览: 18106 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

java虚拟机开发,刚刚走通执行了一段测试java代码

阅读更多
我想开发一个学习用的Java虚拟机。做这件事已经有二三个月了。今天刚刚跑起来,
执行了一段简单的java代码。虚拟机开发是一件复杂的事情,有许多事情要做。现在只做了了一点工作而已,让它跑起来,可以执行几条简单指令。

这是我用来测试的一段java代码:
public class ClassHasStaticMethod
{

public static void main()
{
int sum;
sum = addTwoInt(10,20);
}

static int addTwoInt(int x, int y)
{
int z;
z = x+y;
return z;
}

}

这个java类只有静态方法。其中main方法为执行入口,为了简单,main方法不需要参数。

虚拟机源代码,请参考附件,可以用visual studio编译或者gcc编译(我在vs2008和cygwin下均编译通过)。当前只实现了invokestatic指令和其它一些指令的解释执行。

请用javac编译ClassHasStaticMethod类,然后编译这个虚拟机和运行。

  • v02.rar (29.4 KB)
  • 下载次数: 46
分享到:
评论
7 楼 simpleman7210 2013-11-29  
关于父类对象强制转为子类对象,我可能说的不够清楚,补充一下:父类对象可以强制转为子类对象,前提是这个对象实际上是子类(或其继承类)的对象。举个例子:
A a;
A* pa;
B b;
B* pb;
pa = &a;
//pb = (B*)pa; //这是错误的
pa = &b;       //ok
pb = (B*)pa;   //ok


这个例子中,设类B继承自A。
6 楼 simpleman7210 2013-11-26  
可以强制转换的,一般是从子类对象转换为父类,但也可以强制从父类转为子类。如果没有这样的继承关系,你不能将一个对象强制转为另一个对象。
5 楼 panqj_hust 2013-11-25  
    NameDescHash *hashObj = lookup(name, descriptor, _methods_hash_table, NAME_DESC_TABLE_SIZE);
    MethodInfo *methodInfo = (MethodInfo *)hashObj;

这个强制转换,是怎么做到的?从子类,可以得到父类的信息,我感觉很奇怪啊。平时接触c语言多些,对于面向对象的机制不是很懂。

//NameDescHash是用hash的办法检验类中是否有重复字段或方法,
//同时利用hash的办法也便于快速查找字段或方法
class NameDescHash
{
public:
virtual CONST_Utf8_ptr_info getName() = 0;
virtual CONST_Utf8_ptr_info getDescriptor() = 0;
virtual NameDescHash *getNext() = 0;
virtual void setNext(NameDescHash *next) = 0;
};

class MethodInfo : public NameDescHash
4 楼 simpleman7210 2013-11-24  
常量池中的项的排列次序,我没有看到有什么文章说,需要遵守一定的次序。因此,this_class对应常量池索引3,或者super_class对应4,只是在这个例子中是如此而已,没有什么必然性。
3 楼 panqj_hust 2013-11-24  
这几天看了下,明白了些常量池,觉得类似于嵌入式下面的map文件,包含了变量的大小,地址,函数地址。

但是还有个不懂的地方就是在ClassHasStaticMethod.class中,为什么每次编译都有如下的结果呢?


u2 this_class   0003
u2 super_class  0004

当前类一定是0003吗?
2 楼 simpleman7210 2013-11-23  
你的问题不够具体,我不大明白你的意思。在对Class文件解析之后,得到JavaClass对象,里面包含若干个MethodInfo,MethodInfo包含了方法的信息。CodeInterpreter(后面版本改名为Bytecode)负责字节码解释执行,请看execute()函数,一条条解释执行字节码。比如执行invokestatic字节码指令时,就调用handle_invokestatic()函数,具体请看这个函数是怎么实现的。
1 楼 panqj_hust 2013-11-22  
把method和class在常量池记录下来后,应该怎么去用呢?字节码是怎么找到这些信息的呢?

相关推荐

    我整理的Java虚拟机操作码

    前段时间读了《深入Java虚拟机第二版》一书,整理了Java虚拟机的操作码,也许对学习Java VM或者研究class文件结构的朋友会有用。

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java虚拟机知识点整理

    自己看书整理的 java虚拟机精品知识点 java内存区域与内存溢出处理 虚拟机栈和本地方法栈区别 对象定位访问 垃圾收集器GC管理 虚拟机GC垃圾回收收集算法(内存回收方法论) 虚拟机GC垃圾回收收集器(内存回收具体实现...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java开源包8

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包10

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    Java 虚拟机面试题全面解析(干货)

    如何判断一段代码是不是热点代码? Hotspot虚拟机使用第二种,有两个计数器: 方法调用计数器统计方法 有哪些经典的优化技术(即时编译器)? 公共子表达式消除 数组边界检查消除 方法内联 逃逸分析 如果对象不会逃逸到...

    java开源包4

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包101

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包11

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包6

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包9

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包5

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    Java虚拟机中对象探秘--对象头创建、对象头、对象锁、synchoronized底层实现.docx

    1)指针碰撞(Bump the Pointer): Java堆中内存绝对规整(所有用过的内存放在一边,空闲的内存放在另一边,中间放一个指针作为分界点的指示器),所分配的内存仅需要把指针向空闲空间那边挪动一段与对象大小相等的...

    java jdk实列宝典 光盘源代码

    12反射 是java程序开发的特征之一,允许java程序对自身进行检查,并能直接操作程序的内部属性; instanceof操作符,instanceof.java; 获取类的信息,ViewClassInfoJrame.java; 动态调用类的方法,CallMetod.java; ...

    java开源包1

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包3

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    深入java虚拟机光盘源码-datasink:数据接收器

    深入java虚拟机光盘资源datasink:大规模异构集成学习的管道 Datasink 是一个可定制的管道,用于生成异构分类器的不同集合,以及利用集合多样性来提高性能的集合学习方法所需的伴随元数据。 它还公平地评估了几种...

Global site tag (gtag.js) - Google Analytics