JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,构造函数;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
类的加载
类加载是一个将.class字节码文件实例化成Class对象并进行相关初始化的过程。java的类加载是一个运行时核心基础模块,主要是在启动之初进行类的Load(加载)、Link(链接)、Init(初始化)。
类的加载时机
加载:
就是指将class文件读入内存,并为之创建一个Class对象。
任何类被使用时系统都会建立一个Class对象,字节码对象。
链接:
验证 进行final是否合规、类型是否正确、静态变量是否合法等校验操作
准备 负责为类的静态成员分配内存,并设置默认初始化值
解析 解析类的方法,确保类与类之间的相互引用正确性,完成内存结构布局
初始化:
这一阶段会调用类构造器的方法,在堆栈中完成对象初始化操作
简单入门案例
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@Builder
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class Goods {
private String name;
private String colour;
private String taste;
}
@SneakyThrows
@Test
public void test() {
//反射方式一:通过对象调用getClass方法获取字节码对象
Goods goods3 = new Goods();
Class<? extends Goods> GoodsClass1 = goods3.getClass();
System.out.println("字节码对象1-->" + GoodsClass1);
//反射方式二:通过类名调用class字段获取字节码对象
Class<Goods> goodsClass2 = Goods.class;
System.out.println("字节码对象2-->" + goodsClass2);
//反射方式三:通过Class类中的方法获取指定路径的类的字节码对象
Class<?> goodsClass3 = Class.forName("priv.leetCode.chained.model.Goods");
//通过反射创建Goods对象
Goods ClassGoods = (Goods) goodsClass3.newInstance();
ClassGoods.setName("爱情");
ClassGoods.setTaste("酸臭");
ClassGoods.setColour("灰色");
System.out.println("字节码对象3-->" + goodsClass3);
System.out.println("GOODS-->" + ClassGoods);
//如果有方法可以这样使用
//通过反射机制,获取调用的方法对象
//参数一:方法名称 参数二:方法参数类型
//Method method = goodsClass3.getMethod("XXXXX", String.class);
//执行方法
//参数一:执行方法的对象 参数二:方法传递的参数值
//method.invoke(goodsClass3.newInstance(), "XXX");
/**
* 创建对象的不同方式
*/
System.out.println();
System.out.println("=======创建对象的不同方式==========");
//使用builder模式的链式Bean
Goods goods = Goods.builder().taste("甜的").colour("红的").name("苹果").build();
System.out.println("builder-->" + goods);
//使用@Accessors(chain = true) 静态的链式编程
Goods goods1 = new Goods().setName("香蕉").setColour("黄的").setTaste("甜的");
System.out.println("Accessors-->" + goods1);
//调用有参构造方法
Goods goods2 = new Goods("西瓜", "绿的", "甜的");
System.out.println("AllArgs-->" + goods2);
}