Java高级特性——反射

Java高级特性——反射

Scroll Down

定义

允许程序在运行时来进行自我检查并对内部的成员进行操作

反射主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并根据本身行为的状态和结果,调整或修改应用所描述行为的状态和相关语义

用途

在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。

反射的作用

  • 在运行时判断任意一个对象所属的类
  • 在运行时获取类的对象
  • 在运行时访问Java对象的属性,方法,构造方法等

主要类

Java.lang.reflect类库里面主要的类

  • Field:表示类中的成员变量
  • Method:表示类中的方法
  • Constructor:表示类的构造方法
  • Array:该类提供了动态创建数组和访问数组元素的静态方法

反射依赖的类

用来表示运行时类型信息的对应类

  • 每个类都有唯一一个与之相对应的Class对象
  • Class类为类类型,而Class对象为类类型对象

Clss类的特点

  • Class类也是类的一种,class则是关键字
  • Class类只有一个私有的构造函数,只有JVM能够创建Class类的实例
  • JVM中只有唯一一个和类相对应的Class对象来描述其类型信息

获取Class对象的三种方式

  • Object————>getClss()
  • 任何数据类型(包括基本数据类型)都有一个“静态”的Class属性
  • 通过Class类的静态方法:forName(Strint className)(常用)

Class对象就像一面镜子,透过这面镜子就可以看到类的结构

Demo

package demo.reflect;

public class ReflectTarget{
    public static void main(String[] args) throws ClassNotFoundException {
        //第一种方式获取Class对象
        ReflectTarget reflectTarget = new ReflectTarget();
        Class reflectTargetClass1 = reflectTarget.getClass();
        System.out.println("1st : " + reflectTargetClass1.getName());
        //第二种方式获取Class对象
        Class reflectTargetClass2 = ReflectTarget.class;
        System.out.println("2nd: " + reflectTargetClass2.getName());
        //判断第一种方式获取的class对象和第二种方式获取的是否是同一个
        System.out.println(reflectTargetClass1 == reflectTargetClass2);
        //第三种方式来获取Class对象
        Class reflectTargetClass3 = Class.forName("demo.reflect.ReflectTarget");
        System.out.println("3rd: " + reflectTargetClass3.getName());
        System.out.println(reflectTargetClass2 == reflectTargetClass3);
    }	
}

1st : demo.reflect.ReflectTarget
2nd : demo.reflect.ReflectTarget
3rd : demo.reflect.ReflectTarget

用法

获取并操作构造方法

通过Class对象可以获取某个类中的:构造方法

批量的方法

  • public Constructor[] getConstructors(): 所有"公有的"构造方法
  • public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)

获取单个的方法

  • public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法:、
  • public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;、

调用构造方法:

Constructor-->newInstance(Object... initargs)

获取并操作成员变量

通过Class对象可以获取某个类中的:成员变量

  • Field[] getFields():获取所有的"公有字段"(包含继承字段)
  • Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有

获取单个的方法

  • public Field getField(String fieldName):获取某个"公有的"字段;(包含继承字段)
  • public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)

设置字段的值:

Field -->public void set(Object obj,Object value)

参数说明:
obj:要设置的字段所在的对象;
value:要为字段设置的值;

获取并操作成员方法

通过Class对象可以获取某个类中的:成员方法

  • public Method[] getMethods():获取所有"公有方法";(包含了父类的方法也包含Object类)
  • public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)

获取单个的方法

  • public Method getMethod(String name,Class<?>... parameterTypes):获取某个"公有的"方法
  • public Method getDeclaredMethod(String name,Class<?>... parameterTypes):获取某个成员方法

参数
name : 方法名;
Class ... : 形参的Class类型对象

调用方法:

Method --> public Object invoke(Object obj,Object... args)

参数说明:
obj : 要调用方法的对象;
args:调用方式时所传递的实参;