Class类反射详解

首先我们要知道什么是静态语言和动态语言

静态语言

是一种在运行时可以改变其结构的语言例如新的函数及其代码都可以被引进比如javascript,php等

静态语言

如java,c++,c
java不是动态语言但可以称之为准动态语言,即java有一定的动态性,我们可以通过反射机制获得类似动态语言的特性,Java的动态性让编程变得更加灵活

Java.Reflection

Reflection(反射)被视为java动态语言的关键反射机制允许在执行期间通过Reflection Api获得任何内部类信息并可以操作任意对象的内部属性和方法
加载完类之后,堆内存就会产生Class类对象,且只会产生一个,这个类对象包含了该类的所有信息我们可以通过这个对象看到类的结构,这就像一面镜子所以称之为反射

在这里插入图片描述

反射的优点与缺点

优点:可以实现动态创建对象以及编译,体现极大的灵活性
缺点:对性能有一定的影响使用反射一般是一种解释操作,我们告诉jvm我们需要做什么满足我们的需求这类操作总是慢于执行相同的操作

Class类

  • Class类本身也是一个对象
  • Class只能由系统创建,我们只能去得到他
  • 一个加载的类在jvm虚拟机中只能有一个class实例
  • 一个Class对象对应的是加载到jvm虚拟机中的.class文件
  • 通过Class可以得到完整的类中被加载的结构
  • Class类是Reflection的根源针对任何你想动态加载的类,首先要获得Class对象

获得Class类有三种方式

通过对象.calss获得
User user=new User();
Class clazz=user.calss;
通过getClass()方法获得
Class clazz=user.getClass();
通过Class.forNmae(“包名”);

另外在基本内置类型的包装类都有一个Type属性
比如Integer
Class c=Integer.TYPE;
System.out.println©;
输出为int

通过子类得到父类Class对象。getSuperClass();

基本上所有类都有Class对象,只要保证元素类型和维度一样他们的class对象就是相同的

内存分析

java内存
堆:存放new 的对象和数组,可以被所有线程共享不会存放别的对象引用
栈:存放基本变量类型比如局部变量,引用对象的变量(存放的是堆中的地址值)
方法区:可以被线程共享,存放静态变量和class对象(所有);

类加载过程

  1. 类的加载:将类的class文件读入内存并为之创建一个Class对象,由类加载器完成
  2. 类的链接:将类的二进制数合并到jre中
  3. 类的初始化:由jvm负责类的初始化

类的加载与ClassLoader的理解

  • 加载:class文件加载到内存中,并将这些静态数据转换成方法区的运行时的数据结构,然后生成java.lang.Class对象
  • 链接:二进制代码合并到jvm运行状态中的过程分为三步
    1.验证:确保类的信息符合java规范没有安全问题
    2准备:正式为类变量分配内存并设置类变量默认初始值得阶段,这些内存都将在方法区进行分配
    3解析:虚拟机常量池内的符号引用(常量名)替换为直接引用的过程

- 初始化1执行类构造器()方法类构造器

调用构造器clinit方法是将所有静态方法和讲台变量赋值;

什么时候会发生类初始化

**主动引用**

类加载器的作用

在这里插入图片描述
在这里插入图片描述
获得对象在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43203363/article/details/108908070