Java如何加载.class文件
Java虚拟机
java虚拟机:
抽象化的计算机,通过在实际的计算机上个防真模拟计算机功能来实现的,有自己完善的硬件架构:处理器,堆栈,寄存器等,
还具有相应的指令系统,jvm屏蔽了与具体操作系统平台相关的信息,使得java程序只需要生成在java虚拟机上运行字节码,就可以在不同平台上不加修改的运行,
其中最重要的两点:
JVM内存结构模型,GC jvm是内存中的虚拟机,jvm的存储就是内存,所有写的类,常量,变量,方法都在内存中决定着程序的健壮和高效
谈谈反射
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意犯法和属性;
这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
例子
Method
newInstance()方法返回的是泛型
getDelaredMethod可以获得该类所有的方法,除去继承和实现了接口的方法
如果是私立的方法,必须使用setAccessible(true)方法
getMethod可以获得该类所有的公有方法,还有所继承的以及实现了接口的方法
Field:
getDeclaredField获取属性
如果是私有属性要设置setAccessible(true)
注释以及写的很详细了
package com.binglian.reflect;
public class Robot {
private String name;
public void sayHi(String helloSentence){
System.out.println(helloSentence+" "+name);
}
private String throwHello(String tag){
return "Hello "+tag;
}
}
package com.binglian.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 ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException{
Class rc=Class.forName("com.binglian.reflect.Robot");
Robot r=(Robot)rc.newInstance();
System.out.println("Class name is "+rc.getName()); //输出Class name is com.binglian.reflect.Robot
Method getHello=rc.getDeclaredMethod("throwHello", String.class);//调用rc的throwHello这个方法给Method
getHello.setAccessible(true);//设置为true 如果不设置为true 会报错 因为这个throwHello这个方法是私立的
Object str=getHello.invoke(r, "Bob"); //getHello调用了throwHello的方法 并把Bob字符串传进去
System.out.println("getHello result is "+str); //传进去输出getHello result is Hello Bob
//因为这里name没有值 所以为null
Method sayHi=rc.getMethod("sayHi", String.class);
sayHi.invoke(r, "Welcome");
Field name=rc.getDeclaredField("name");//获取name这个属性 getDeclaredField是获取属性
name.setAccessible(true);//私有的属性
name.set(r, "Alice");
sayHi.invoke(r, "Welcome");//调用sayHi的方法并把Welcome 放入进去
}
}
类从编译到执行的过程
编译器将Robot.java 源文件编译为Robot.class字节码文件
ClassLoader将字节码转换为JVM中的Class<Robot>对象
JVM利用Class<Robot>对象
谈谈Classloder
ClassLoder 在java中有着非常重要的作用,它主要工作在Class装载的加载阶段,其主要作用是从系统外部获得Class二进制数据流,它是java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader 负责通过将Class文件里的二进制数据流装载系统,然后交给Java虚拟机进行连接、初始化等操作