Java 反射详解

一、什么是反射?

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

二、反射能做什么?

我们知道反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,包括包括其modifiers(修饰符),fields(属性),methods(方法)等,并可于运行时改变fields内容或调用methods。那么我们便可以更灵活的编写代码,代码可以在运行时装配,无需在组件之间进行源代码链接,降低代码的耦合度;还有动态代理的实现等等;但是需要注意的是反射使用不当会造成很高的资源消耗!

三、反射的使用

1、获取Class对象的三种方式

1.1 Object ——> getClass();
1.2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
1.3 通过Class类的静态方法:forName(String  className)(常用)

注意:在运行期间,一个类,只有一个Class对象产生。

2、通过 Class 类获取构造方法、成员变量、成员方法、接口、超类等

1.获取构造方法:
  1).批量的方法:
public Constructor[] getConstructors():所有"公有的"构造方法
            public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)
     
  2).获取单个的方法,并调用:
public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法:
public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;

  调用构造方法:
Constructor-->newInstance(Object... initargs)

2、newInstance是 Constructor类的方法(管理构造函数的类)
api的解释为:
newInstance(Object... initargs)
           使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
它的返回值是T类型,所以newInstance是创建了一个构造方法的声明类的新实例对象。

3、 获取成员变量并调用:
  1.批量的:
       1).Field[] getFields():获取所有的"公有字段";
       2).Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有;
  2.获取单个的:
       1).public Field getField(String fieldName):获取某个"公有的"字段;
       2).public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)
  
    设置字段的值:
       Field --> public void set(Object obj,Object value)
                   参数说明:
                   1.obj:要设置的字段所在的对象;
                   2.value:要为字段设置的值;

4、获取成员方法并调用:
  1.批量的:
       public Method[] getMethods():获取所有"公有方法";(包含了父类的方法也包含Object类)
       public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)
  2.获取单个的:
       public Method getMethod(String name,Class<?>... parameterTypes)
                   参数:
                       name : 方法名;
                       Class ... : 形参的Class类型对象
       public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
  
    调用方法:
       Method --> public Object invoke(Object obj,Object... args)
                   参数说明:
                   obj : 要调用方法的对象;
                   args:调用方式时所传递的实参;

四、根据反射获取父类属性

public class ReflectUtils {
    
    public static Field getDeclaredField(Object object, String fieldName) {
        Class<?> clazz = object.getClass();
        for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
            try {
                return clazz.getDeclaredField(fieldName);
            } catch (Exception e) {
                // 这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。
                // 如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了
            }
        }
        return null;
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值