概述
就是在程序的运行时间获取类的字节码文件对象,从何获得类构造方法,成员变量,方法等内容, 注意 类的字节码对象有且仅有一个,因此多线程的时候可以作为同步锁来使用
原理
在程序的运行过过程中,将类加载进内存中都必须要经过 加载 链接 初始化三个过程
加载 : 就是将class文件加载到内存中 创建class对象的过程
链接 : 判断类的内部结构,为静态成员变量分配内存 并且初始化
初始化 : 就是调用类中的方法 成员变量的过程
类加载器的概述
Bootstrap ClassLoader 根类加载器
负责加载java 核心类 比如String System Date 等
Extension ClassLoader 扩展类加载器
负责加载lib目录下的jar
Sysetm ClassLoader 系统类加载器
当JVM启动时去加载classpath 所指定的路径
应用
获取class对象三种方式
三个对象都是一样的 因为在内存中都一致
clazz1 == clazz2 ==clazz3
第一种:
Class clazz1 = Class.forName(“com.ruirui.app.Attr”)
第二种 :
Class clazz2 = Attr.class
第三种
Attr attr = new Attr( )
Class clazz3 = attr.getclass( )
关于Constructor对象
Attr attr = new Attr( )
Class clazz3 = attr.getclass( )
获取无参数构造方法对象
Constuctor con = clazz3.getConstructor( ) 获取无参数构造方法对象
Attr attr = con.newInstance( );
获取有参数构造方法对象
Constuctor con = clazz3.getConstructor(String.class , int.class ) 获取无参数构造方法对象
Attr attr = con.newInstance( “nihao”,22 );
API 介绍
getConstructor(); //获取指定的构造方法(只能获取公共的)
getConstructors(); //获取所有的公共的构造方法
getDeclaredConstructor(); //获取指定的构造方法(包括私有)
getDeclaredConstructors(); //获取所有的构造方法(包括私有)
关于Filed对象
Class clazz = Class.forName("com.ruirui.bean.Person");
Constructor c = clazz.getConstructor(String.class,int.class);
Person p = (Person) c.newInstance("nihao",23);
//Field f = clazz.getField("name");
//f.set(p, "nihao");
//成员变量私有时
Field f = clazz.getDeclaredField("name");
f.setAccessible(true);
f.set(p, "你好");
关于Method对象
Class clazz = Class.forName("com.ruirui.bean.Person");
Constructor c = clazz.getConstructor(String.class,int.class);
Person p = (Person) c.newInstance("nihao",23);
Method m = clazz.getMethod("eat");
m.invoke(p);
//eat 是方法名 int.class 后面是参数
Method m2 = clazz.getMethod("eat", int.class);
m2.invoke(p, 10);