- 平台无关性 一次编译 到处运行
- GC
- 语言特性
- 面向对象
- 类库
- 异常处理
Compile Once, Run Anywhere
javac
javap -c
为什么JVM不直接将源码解析成机器码去执行
- 准备工作:每次执行都需要各种检查
- 兼容性:也可以将别的语言解析成字节码
JVM如何加载.class文件
Java虚拟机
package com.java.reflect;
public class Robot {
private String name;
private String throwHello(String tag) {
return "Hello " + tag;
}
public void sayHi(String content) {
System.out.println(content + " " + content);
}
}
package com.java.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectSample {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
Class rc = Class.forName("com.java.reflect.Robot");
Robot r = (Robot) rc.newInstance();
System.out.println("Class name is " + rc.getName());
Method getHello = rc.getDeclaredMethod("throwHello", String.class);
getHello.setAccessible(true);
Object str = getHello.invoke(r,"Bob");
System.out.println("Get Hello result is" + str);
Method sayHi = rc.getMethod("sayHi", String.class);
sayHi.invoke(r, "Welcome");
Field name = rc.getDeclaredField("name");
name.setAccessible(true);
name.set(r, "Alice");
sayHi.invoke(r, "Welcome");
}
}