java反射--快速入门

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);

    }

三克油 

  • 12
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值