反射和类装载器ClassLoader

本文详细阐述了Java类装载器的工作原理,包括类的装载、链接和初始化过程,以及如何实现类的装载工作。重点介绍了JVM在运行时产生的三个类装载器:根装载器、ExtClassLoader和appClassLoader,并详细解释了它们各自的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类装载器工作机制:

类装载器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件。类装载器将类装入JVM中,要经过以下步骤:
1.装载:查找和导入class文件
2.链接:执行校验、准备、和解析步骤
校验:检查载入class文件数据的正确性
准备:给类的静态变量分配存储空间
解析:将符号引用转成直接引用。
3.初始化:对类的静态变量、静态代码块执行初始化工作。

类装载工作由classLoader及其子类负责。JVM在运行时会产生三个classLoader:根装载器、ExtClassLoader和appClassLoader。ExtClassLoader和appClassLoader都是ClassLoader的子类。其中ExtClassLoader负责装载JRE扩展目录ext中的jar类包。AppclassLoader负责装载classpath路径下的类包。

ClassLoader重要方法:
1.Class loadClass(String name)
2.Class defineClass(String name,byte[]b,int off,int len)
3.Class findLoaderClass(String name)
4.Class findSystemClass(String name)
5.ClassLoader getParent()


反射:
Constructor:类的构造函数反射类,通过getConstructors()或者getConstructor(Class parameterTypes)方法获取类的所有构造函数反射对象数组。
主要方法:newInstance(Object[] initargs)

Method:类方法反射类,通过getDeclaredMethods()或者getDeclaredMethod(String name,class parameterTypes)获取方法。
主要方法为:invoke(Object obj,Object[]args),obj表示操作的目标对象,args为方法入参。
其他方法:Class getReturnType();获取方法返回值类型
Class[] getParameterTypes();获取方法的入参类型数组
Class[] getExceptionTypes() 获取方法的异常类型数组

Field:类的成员变量反射类,通过getDeclaredFields()或者getDeclaredField(String name)方法获取类的成员变量数组或者特定类的成员变量反射对象。
主要方法:set(Object obj,Object value),obj表示操作的目标对象,value为目标对象的成员变量设置值。

例子:
public class PrivateCar {
private String color;
protected void drive(){
System.out.println("drive private car! the color is:"+color);
}
}

public class PrivateCarReflect {
public static void main(String[] args) throws Throwable{ ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("com.baobaotao.reflect.PrivateCar");
PrivateCar pcar = (PrivateCar)clazz.newInstance();
Field colorFld = clazz.getDeclaredField("color");
colorFld.setAccessible(true);
colorFld.set(pcar,"红色");
Method driveMtd = clazz.getDeclaredMethod("drive",(Class[])null);
//Method driveMtd = clazz.getDeclaredMethod("drive"); JDK5.0下使用
driveMtd.setAccessible(true);
driveMtd.invoke(pcar,(Object[])null);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值