01.Java反射机制

01.Java反射机制

1.基本概念

  • 通常情况下编写代码都是固定的,无论运行多少次执行的结果也是固定的,在某些特殊场合中编写代码时不确定要创建什么类型的对象,也不确定要调用什么样的方法,这些都希望通过运行时传递的参数来决定,该机制叫做动态编程技术,也就是反射机制。
  • 通俗来说,反射机制就是用于动态创建对象并且动态调用方法的机制。
  • 目前主流的框架底层都是采用反射机制实现的。
    如:
    Person p = new Person(); - 表示声明Person类型的引用指向Person类型的对象
    p.show(); - 表示调用Person类中的成员方法show

2.Class类

基本概念

  • java.lang.Class类的实例可以用于描述Java应用程序中的类和接口,也就是一种数据类型。
  • 该类没有公共构造方法,该类的实例由Java虚拟机和类加载器自动构造完成,本质上就是加载到内存中的运行时类。

2.1获取Class对象的方式

  1. 使用数据类型.class的方式可以获取对应类型的Class对象(掌握)。
  2. 使用引用对象.getClass()的方式可以获取对应类型的Class对象。
  3. 使用包装类.TYPE的方式可以获取对应基本数据类型的Class对象。
  4. 使用Class.forName()的方式来获取参数指定类型的Class对象(掌握)。
  5. 使用类加载器ClassLoader的方式获取指定类型的Class对象。

2.2几种获取Class对象的方式

2.2.1使用数据类型.class的方式:
  1. 代码示例:
public static void main(String[] args) {
        Class c1 = String.class;
        System.out.println("c1=" + c1); //输出: class java.lang.String
        Class<Integer> c2 = int.class;
        System.out.println("c2=" +c2);         //输出:int
        Class<Void> c3 = void.class;
        System.out.println("c3=" + c3);        //输出:void
        Class c4 = double[].class;
        System.out.println("c4=" + c4);         //输出:calss getName()
        
    }
  1. 结合jdk手册来看

    image-20220228170602883

  2. 运行结果

    image-20220228170656252

2.2.2使用引用对象.getClass()的方式
public static void main(String[] args) {
        //使用对象.getClass()方式获取对象的Calss对象
        String str1 = new String("hello");
        Class c1 = str1.getClass();
        System.out.println("c1 ="+ c1);// class java.lang.String

        Integer it = 10;
        Class c2 = it.getClass();
        System.out.println("c2 ="+ c2);// class java.lang.Integer

        int it2 = 20;
//        it2.getClass(); Error: 基本数据类型的变量不能调用方法

    }
  • 运行结果

    image-20220228172211442

2.2.3使用包装类.TYPE的方式

示例代码:

      //使用包装类。TYPE的方式来获取对应基本数据类型的Class对象
        Class cl1 = Integer.TYPE; //对应的就是int
        System.out.println("cl1 = " +cl1); //输出:int
//        区别
        Class cl2  = Integer.class;
        System.out.println("cl2=" + cl2);//输出:class java.lang.Integer

结果:

image-20220228173415331

2.2.4使用Class.forName()的方式

1.代码示例

 public static void main(String[] args) throws ClassNotFoundException {
        //使用Class.forName()的方式
//        Class c1 = Class.forName("String");//错误:要求写完整的名称 : 包名.类名
        Class c2 =Class.forName("java.lang.String");
        System.out.println(c2);

        Class c3 = Class.forName("java.util.Date");
        System.out.println("c3= "+ c3);
    }

2.运行结果

image-20220228195137708

2.2.5使用类加载器ClassLoader的方式

代码示例

        //使用类加载器ClassLoader的方式
//        ClassLoader classLoader = String.class.getClassLoader();
//        System.out.println("classLoader = " +classLoader);//null
        ClassLoader classLoader = Invoke03.class.getClassLoader();
        System.out.println("classLoader = " +classLoader);
        Class c4 =classLoader.loadClass("java.lang.String");
        System.out.println("c4 = " + c4);//class  java.lang.String

运行结果

image-20220228195758352

2.3常用的方法(掌握)

方法声明功能介绍
static Class<?> forName(String className)用于获取参数指定类型对应的Class对象并返回
T newInstance()用于创建该Class对象所表示类的新实例
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员阿红

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值