java基础-反射机制的原理与应用

最近看到Spring框架中的IOC的实现原理就用到了反射机制,特意全面的学习一下反射,本文是看到了很多大牛的文章以及自己测试代码总结出来的,如果有不对的地方,还请谅解!

首先,我们都知道Java语言具有平台无关性、跨平台性和可移植性,是因为java的源代码会被编译成.class文件字节码,而java环境中提供了不同平台的虚拟机JVM,编译生成的.class字节码文件,由JVM去解释执行,也就是java语言运行时,与java的源代码文件已经没有关系了,运行操作执行的是字节码文件,所以说java语言具有平台无关性。

一. 什么是java反射机制

java反射机制是指,在运行状态中,对于任意一个类都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象方法的功能称为java的反射机制。

反射机制是在运行中的状态下,也就是说,Java的反射机制,操作的字节码.class文件。在使用反射机制时,首先要加载类的字节码文件,JVM会为每个类创建一个java.lang.Class类的实例,通过该对象可以动态获取这个类的信息。

二. 如何获取Class类

每一个Class类的对象就代表了一种被加载进入JVM的类,它代表了该类的一种信息映射,可以通过三种方式获取Class类:

1. Class类的forName()方法的返回值

2. 访问所有类都会拥有的静态的class属性

3. 调用所有对象都会有的getClass()方法

三. 获取Class类的属性(包括私有属性)

通过Class类的getDeclaredField()或getDeclaredFields()方法获取到类的属性以及属性值的方法,先创建一个UserInfo的实体:

根据反射获取Class对象,然后根据Class类获得类中的所有的字段,包括public、private和protected,不包括父类中申明的字段,获取属性与属性值:方式一:

方式二:

测试调用方法,查看结果:

获取属性的方法,除了getDeclaredFields(),还有getFields()方法,也可以获取类的属性

四. 获取Class类的方法

1. 获取类中所有的方法,包括public、private和protected,不包括父类中申明的方法

Method[] methods = objClass.getDeclaredMethods();

for (Method m : methods) {

    LOGGER.info("方法为:", m);

}

2. 获取类中所有公有方法,包括父类中的和实现接口中的所有public 方法

Method[] methods = objClass.getMethods();

for (Method m : methods) {

      LOGGER.info("方法为:", m);

}

3. 执行方法

(1) 利用反射知识,通过classStr(即:类的完全限定名)获取Class类对象

       Class cls = Class.forName(classStr);

(2) 实例化对象:以User对象为例

             User user = cls.newInstance();

(3) 获取User的name属性,得到设置name属性的方法名

    String mathod = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);

(4) 执行method方法:先获取到方法名,getMethod:第一个参数是方法名,后面跟方法参数的类

     Method setName = cls.getMethod("setName", String.class);

     setName.invoke(user , "李思");

执行setName方法,设置了user的名字为:李思

五. 利用反射实例化一个对象(Spring框架中,IOC实现原理中使用的反射部分)

1. 直接使用Class类的newInstance()方法实例化对象,通过配置文件中class属性,获取类的完全限定名,即:包名 + 类名

   Class class = Class.forName("com.fanshe.User");

   User user = class.newInstance();

2. 使用特定的构造方法创建对象,则需要先获取Contructor实例,再用newIntance()方法创建对象

   Class clazz = Class.forName("com.User");

   Constructor ctor = clazz.getConstructor();  // 根据构造方法,获取Contructor实例

   User user1 = (User) ctor.newInstance();

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值