│ │ │ ├── InstructionIndex16.java
│ │ │ ├── InstructionNoOperands.java
│ │ │ └── MethodInvokeLogic.java
│ │ ├── comparisons
│ │ ├── constants
│ │ ├── control
│ │ ├── conversions
│ │ ├── extended
│ │ ├── loads
│ │ ├── math
│ │ ├── references
│ │ │ ├── ANEW_ARRAY.java
│ │ │ ├── ARRAY_LENGTH.java
│ │ │ ├── CHECK_CAST.java
│ │ │ ├── GET_FIELD.java
│ │ │ ├── GET_STATIC.java
│ │ │ ├── INSTANCE_OF.java
│ │ │ ├── INVOKE_INTERFACE.java
│ │ │ ├── INVOKE_SPECIAL.java
│ │ │ ├── INVOKE_STATIC.java
│ │ │ ├── INVOKE_VIRTUAL.java
│ │ │ ├── MULTI_ANEW_ARRAY.java
│ │ │ ├── NEW.java
│ │ │ ├── NEW_ARRAY.java
│ │ │ ├── PUT_FIELD.java
│ │ │ └── PUT_STATIC.java
│ │ ├── stack
│ │ ├── store
│ │ │ └── xastore
│ │ │ ├── AASTORE.java
│ │ │ ├── BASTORE.java
│ │ │ ├── CASTORE.java
│ │ │ ├── DASTORE.java
│ │ │ ├── FASTORE.java
│ │ │ ├── IASTORE.java
│ │ │ ├── LASTORE.java
│ │ │ └── SASTORE.java
│ │ └── Factory
│ ├── rtda
│ │ ├── heap
│ │ │ ├── constantpool
│ │ │ ├── methodarea
│ │ │ │ ├── Class.java
│ │ │ │ ├── ClassMember.java
│ │ │ │ ├── Field.java
│ │ │ │ ├── Method.java
│ │ │ │ ├── MethodDescriptor.java
│ │ │ │ ├── MethodDescriptorParser.java
│ │ │ │ ├── MethodLookup.java
│ │ │ │ ├── Object.java
│ │ │ │ ├── Slots.java
│ │ │ │ └── StringPool.java
│ │ │ └── ClassLoader.java
│ │ ├── Frame.java
│ │ ├── JvmStack.java
│ │ ├── LocalVars.java
│ │ ├── OperandStack.java
│ │ ├── Slot.java
│ │ └── Thread.java
│ ├── Cmd.java
│ ├── Interpret.java
│ └── Main.java
└── test
└── java
└── org.itstack.demo.test
├── BubbleSortTest.java
└── HelloWorld.java
代码片段
ANEW_ARRAY.java
package org.itstack.demo.jvm.instructions.references;
import org.itstack.demo.jvm.instructions.base.InstructionIndex16;
import org.itstack.demo.jvm.rtda.Frame;
import org.itstack.demo.jvm.rtda.OperandStack;
import org.itstack.demo.jvm.rtda.heap.constantpool.ClassRef;
import org.itstack.demo.jvm.rtda.heap.constantpool.RunTimeConstantPool;
import org.itstack.demo.jvm.rtda.heap.methodarea.Class;
import org.itstack.demo.jvm.rtda.heap.methodarea.Object;
/**
-
http://www.itstack.org
-
create by fuzhengwei on 2019/4/29
-
create new array of reference
*/
public class ANEW_ARRAY extends InstructionIndex16 {
@Override
public void execute(Frame frame) {
RunTimeConstantPool runTimeConstantPool = frame.method().clazz().constantPool();
ClassRef classRef = (ClassRef) runTimeConstantPool.getConstants(this.idx);
Class componentClass = classRef.resolvedClass();
OperandStack stack = frame.operandStack();
int count = stack.popInt();
if (count < 0) {
throw new NegativeArraySizeException();
}
Class arrClass = componentClass.arrayClass();
Object arr = arrClass.newArray(count);
stack.pushRef(arr);
}
}
ARRAY_LENGTH.java
package org.itstack.demo.jvm.instructions.references;
import org.itstack.demo.jvm.instructions.base.InstructionNoOperands;
import org.itstack.demo.jvm.rtda.Frame;
import org.itstack.demo.jvm.rtda.OperandStack;
import org.itstack.demo.jvm.rtda.heap.methodarea.Object;
/**
-
http://www.itstack.org
-
create by fuzhengwei on 2019/4/29
-
get length of array
*/
public class ARRAY_LENGTH extends InstructionNoOperands {
@Override
public void execute(Frame frame) {
OperandStack stack = frame.operandStack();
Object arrRef = stack.popRef();
if (null == arrRef){
throw new NullPointerException();
}
int arrLen = arrRef.arrayLength();
stack.pushInt(arrLen);
}
}
NEW_ARRAY.java
package org.itstack.demo.jvm.instructions.references;
import org.itstack.demo.jvm.instructions.base.BytecodeReader;
import org.itstack.demo.jvm.instructions.base.Instruction;
import org.itstack.demo.jvm.rtda.Frame;
import org.itstack.demo.jvm.rtda.OperandStack;
import org.itstack.demo.jvm.rtda.heap.ClassLoader;
import org.itstack.demo.jvm.rtda.heap.methodarea.Class;
import org.itstack.demo.jvm.rtda.heap.methodarea.Object;
/**
-
http://www.itstack.org
-
create by fuzhengwei on 2019/4/29
*/
public class NEW_ARRAY implements Instruction {
private byte atype;
@Override
public void fetchOperands(BytecodeReader reader) {
this.atype = reader.readByte();
}
@Override
public void execute(Frame frame) {
OperandStack stack = frame.operandStack();
int count = stack.popInt();
if (count < 0) {
throw new NegativeArraySizeException();
}
ClassLoader classLoader = frame.method().clazz().loader();
Class arrClass = getPrimitiveArrayClass(classLoader, this.atype);
Object arr = arrClass.newArray(count);
stack.pushRef(arr);
}
private Class getPrimitiveArrayClass(ClassLoader loader, byte atype){
switch (atype) {
case ArrayType.AT_BOOLEAN:
return loader.loadClass(“[Z”);
case ArrayType.AT_BYTE:
return loader.loadClass(“[B”);
case ArrayType.AT_CHAR:
return loader.loadClass(“[C”);
case ArrayType.AT_SHORT:
return loader.loadClass(“[S”);
case ArrayType.AT_INT:
return loader.loadClass(“[I”);
case ArrayType.AT_LONG:
return loader.loadClass(“[J”);
case ArrayType.AT_FLOAT:
return loader.loadClass(“[F”);
case ArrayType.AT_DOUBLE:
return loader.loadClass(“[D”);
default:
throw new RuntimeException(“Invalid atype!”);
}
}
static class ArrayType {
static final byte AT_BOOLEAN = 4;
static final byte AT_CHAR = 5;
static final byte AT_FLOAT = 6;
static final byte AT_DOUBLE = 7;
static final byte AT_BYTE = 8;
static final byte AT_SHORT = 9;
static final byte AT_INT = 10;
static final byte AT_LONG = 11;
}
}
IASTORE.java
package org.itstack.demo.jvm.instructions.stores.xastore;
import org.itstack.demo.jvm.instructions.base.InstructionNoOperands;
import org.itstack.demo.jvm.rtda.Frame;
import org.itstack.demo.jvm.rtda.OperandStack;
import org.itstack.demo.jvm.rtda.heap.methodarea.Object;
/**
-
http://www.itstack.org
-
create by fuzhengwei on 2019/4/29
*/
public class IASTORE extends InstructionNoOperands {
@Override
public void execute(Frame frame) {
OperandStack stack = frame.operandStack();
int val = stack.popInt();
int idx = stack.popInt();
Object arrRef = stack.popRef();
checkNotNull(arrRef);
int[] ints = arrRef.ints();
checkIndex(ints.length, idx);
ints[idx] = val;
}
}
StringPool.java
package org.itstack.demo.jvm.rtda.heap.methodarea;
import org.itstack.demo.jvm.rtda.heap.ClassLoader;
import java.util.HashMap;
import java.util.Map;
/**
-
http://www.itstack.org
-
create by fuzhengwei on 2019/4/29
*/
public class StringPool {
private static Map<String, Object> internedStrs = new HashMap<>();
public static Object jString(ClassLoader loader, String goStr) {
Object internedStr = internedStrs.get(goStr);
if (null != internedStr) return internedStr;
char[] chars = goStr.toCharArray();
Object jChars = new Object(loader.loadClass(“[C”), chars);
Object jStr = loader.loadClass(“java/lang/String”).newObject();
jStr.setRefVal(“value”, “[C”, jChars);
internedStrs.put(goStr, jStr);
return jStr;
}
public static String goString(Object jStr) {
Object charArr = jStr.getRefVar(“value”, “[C”);
return new String(charArr.chars());
}
}
Interpret.java
package org.itstack.demo.jvm;
import com.alibaba.fastjson.JSON;
import org.itstack.demo.jvm.instructions.Factory;
import org.itstack.demo.jvm.instructions.base.BytecodeReader;
import org.itstack.demo.jvm.instructions.base.Instruction;
import org.itstack.demo.jvm.rtda.Frame;
import org.itstack.demo.jvm.rtda.Thread;
import org.itstack.demo.jvm.rtda.heap.ClassLoader;
import org.itstack.demo.jvm.rtda.heap.methodarea.*;
import org.itstack.demo.jvm.rtda.heap.methodarea.Class;
import org.itstack.demo.jvm.rtda.heap.methodarea.Object;
//指令集解释器
class Interpret {
Interpret(Method method, boolean logInst, String args) {
Thread thread = new Thread();
Frame frame = thread.newFrame(method);
thread.pushFrame(frame);
if (null != args){
Object jArgs = createArgsArray(method.clazz().loader(), args.split(" "));
frame.localVars().setRef(0, jArgs);
}
loop(thread, logInst);
}
private Object createArgsArray(ClassLoader loader, String[] args) {
Class stringClass = loader.loadClass(“java/lang/String”);
Object argsArr = stringClass.arrayClass().newArray(args.length);
Object[] jArgs = argsArr.refs();
for (int i = 0; i < jArgs.length; i++) {
jArgs[i] = StringPool.jString(loader, args[i]);
}
return argsArr;
}
private void loop(Thread thread, boolean logInst) {
BytecodeReader reader = new BytecodeReader();
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
读者福利
分享一份自己整理好的Java面试手册,还有一些面试题pdf
不要停下自己学习的脚步
nst) {
BytecodeReader reader = new BytecodeReader();
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-R61LyDVe-1710428344775)]
[外链图片转存中…(img-eUbGDMgS-1710428344776)]
[外链图片转存中…(img-EPRDuhEN-1710428344776)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-oTFc5lng-1710428344777)]
读者福利
分享一份自己整理好的Java面试手册,还有一些面试题pdf
不要停下自己学习的脚步
[外链图片转存中…(img-4n0aFloy-1710428344778)]
[外链图片转存中…(img-TjBtIwrX-1710428344778)]