Java反射机制

首先说一下反射机制的概念

反射机制是指再程序运行过程中,对任意一个类都能获取其所有属性和方法,并且对任意一个对象都能调用其任意一个方法。这种动态获取类和对象的信息,以及动态调用对象的方法的功能便是Java语言的反射机制。

说完反射的概念,谈谈反射的应用。

我们知道Java中的对象有编译时类型和运行时类型两种类型。编译时类型指的是声明对象时所采用的类型,运行时类型指为对象赋值时所采用的类型。例子如下:

Animal animal=new Cat();

在以上代码中,animal对象的编译时类型为Animal,运行时类型为Cat,因此无法在编译时获取Cat类中特有的定义的方法。对于程序在编译期间无法获得对象和类的真实信息,只能通过运行时信息来获取该对象和类的信息,而这些信息便是通过反射机制来获取的,这便是Java反射机制的核心。

接下来谈谈反射的步骤

反射的步骤如下:

  1. 获取想要操作的类的对象,通过该类对象可以调用类的任意方法。

  2. 调用Class对象所对应的类中定义的方法

  3. 使用反射API来获取并调用类的属性和方法等

获取Class对象的三种方法:

  1. 调用某个对象的getClass方法以获取该类对应的Class对象

    Animal animal = new Animal();
    Class clz = animal.getClass();

  2. 调用某个类的class属性以获取该类对应的Class对象

    Class clz = Animal.class;

  3. 调用Class类中的forName静态方法,从而获取对应的Class对象

    Class clz=Class.forName("ClassPath");  

创建对象的两种方式:

通过反射创建对象有两种方式:

  1. 使用Class对象的newInstance方法创建该Class对象对应类的实例,这种方法要求该Class对象对应的类有默认的空构造器

    Class clz=Class.forName("ClassPath");
    Animal a=(Animal)clz.newInstance();

  2. 先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance方法创建Class对象对应类的实例

    Constructor c = clazz.getDeclaredConstructor(String.class,int.class);
    Cat cat = (Cat) c.newInstance("美国短尾猫","2");

如何动态调用方法?

获取对象的Method,并调用Method的invoke方法。

  1. 获取Method对象:通过调用Class对象的getMethod(String name,Class<?>... parameterTypes)返回一个Method对象,他描述了此Class对象所表示的类或接口指定的公共成员方法。其中name参数是指所需方法的名称,parameterTypes参数是按照声明顺序标识该方法的形参类型的Class对象的一个数组。

  2. 调用invoke方法:通过调用Method对象的invoke方法来动态执行函数

            //首先获取类对象
            Class clz = Class.forName("Animal");
            //获取类对象的setName方法
            Method method = clz.getMethod("setName", String.class);
            //获取构造器对象
            Constructor constructor = clz.getConstructor();
            //根据构造器对象生成实体对象
            Animal animal = (Animal) constructor.newInstance();
            //通过方法对象的invoke函数对实体对象方法进行动态调用
            method.invoke(animal, "美国蓝白猫");

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值