Java反射与类的生命周期
概述
在运行状态中,对于人一个类class文件,都能知道这个类的所有属性和方法.
对于任意一个对象,都能调用它的任意一个方法和属性
对一个类文件进行解析,需要获取其对应的字节码文件对象
优点:可以实现动态创建对象和编译
缺点:对性能有影响,使慢于直接创建并对象。
一、获取Class对象的三种方式
- Object类中的getClass方法
Person p = new Person();
Class clazz = p.getClass();
缺点: 必须明确具体的类,并创建对象 - 任何数据类型都具备静态属性.class来获取其对应Class对象
Class clazz = Person.class;
缺点: 还需明确用到的类中的静态成员 - 利用类的字符串名称获取该类 forName方法
String className = “包名.Person”; //得带包名
Class clazz = Class.forName(className);
优点:扩展性强
二、 获取Class中的构造函数
1.Constructor cons = getConstructors(Class<?> … parameterType); 获取构造函数
2.getDeclaredConstructors(); 包括私有的也能拿
3.例子:
String className = “com.lzz.reflect.Person”; //得带包名
//获取对象
Class<?> clazz = Class.forName(className);
//获取构造函数
Constructor<?> constructor = clazz.getConstructor(String.class, Integer.class);
//对象初始化
Object obj = constructor.newInstance(“Yoona”, 29);
三、 获取Class中的方法
1、 获取指定的公共函数
//获取公共方法
Method[] methods = clazz.getMethods();
2. 获取本类中所有的方法
Method[] methods = clazz.getDeclaredMethods();
3.执行方法
String className = “com.lzz.reflect.Person”; //得带包名
//获取对象
Class<?> clazz = Class.forName(className);
Method method = clazz.getMethod(“introduce”, null);
//获取构造函数
Constructor<?> constructor = clazz.getConstructor(String.class, Integer.class);
//对象初始化
Object obj = constructor.newInstance(“Yoona”, 29);
method.invoke(obj, null);
四、 JVM中 Class字节码的生命周期
1.类加载概述
将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。
类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。
2、生命周期
加载、连接(验证,准备,解析)、初始化、使用、卸载。
五、Java中9大内置Class实例和数组的Class实例
-
9大内置Class实例:Byte, short, int, long, char, float, double, boolean, void关键字
Class clz=int.class; Class clz=boolean.class;等
所有的数据类型都有class属性,表示的都是Class对象拆箱类:Integer.class 和int.class非同一字节码
八大基本数据类型的包装类中都有一个常量对应的基本数据类型的Class实例,如:TYPE ————Integer.TYPE==int.class。
2.数组class实例:
Class clz=String[].class;//一维数组
Class clz=String[][].class;//二维数组
[1]:https://blog.csdn.net/u011631266/article/details/18189435 反射使用例子 @Author 千秋大业一壶茶
[2]: https://www.cnblogs.com/happyflyingpig/p/7833814.html 类加载的生命周期 @Author 寻找风口的猪 有详细的例子