Java反射与类的生命周期

概述

在运行状态中,对于人一个类class文件,都能知道这个类的所有属性和方法.
对于任意一个对象,都能调用它的任意一个方法和属性
对一个类文件进行解析,需要获取其对应的字节码文件对象
优点:可以实现动态创建对象和编译
缺点:对性能有影响,使慢于直接创建并对象。

一、获取Class对象的三种方式

  1. Object类中的getClass方法
    Person p = new Person();
    Class clazz = p.getClass();
    缺点: 必须明确具体的类,并创建对象
  2. 任何数据类型都具备静态属性.class来获取其对应Class对象
    Class clazz = Person.class;
    缺点: 还需明确用到的类中的静态成员
  3. 利用类的字符串名称获取该类 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实例

  1. 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 寻找风口的猪 有详细的例子
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值