反射

549 阅读3分钟

简介

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义,通过反射可以调用私有方法和私有属性,大部分框架也都是运用反射原理的。

1.jpg

功能

反射机制主要提供以下功能:

  • 在运行时判断任意一个对象所属的类;

  • 在运行时构造任意一个类的对象;

  • 在运行时判断任意一个类所具有的成员变量和方法;

  • 在运行时调用任意一个对象的方法;

  • 生成动态代理。

JAVA中的反射及作用

假如有两个程序员,一个程序员在写程序的时需要使用第二个程序员所写的类,但第二个程序员并没完成他所写的类。那么第一个程序员的代码是不能通过编译的。此时,利用Java反射的机制,就可以让第一个程序员在没有得到第二个程序员所写的类的时候,来完成自身代码的编译。

Java的反射机制它知道类的基本结构,这种对Java类结构探知的能力,我们称为Java类的“自审”。如eclipse中,一按点,编译工具就会自动的把该对象能够使用的所有的方法和属性全部都列出来,供用户进行选择。这就是利用了Java反射的原理,是对我们创建对象的探知、自审。

获取Class对象的三种方式

Class类没有公共的构造方法,无法通过new运算符实例化;只能通过对象的getClass方法,或是通过Class.forName(…)来获得实例。

  1. 类名.class
Class personClazz = Person.class;
  1. 实例.getClass()
Person person = new Person();

Class personClazz1 = person.getClass();
  1. Class.forName("类的全路径")
Class personClazz2 = Class.forName( "com.muse.reflect.Person" );

Class类的常用方法

  • getName()
    一个Class对象描述了一个特定类的属性,Class类中最常用的方法getName以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。 

  • newInstance()
    Class还有一个有用的方法可以为类创建一个实例,这个方法叫做newInstance()。例如: x.getClass.newInstance(),创建了一个同x一样类型的新实例。newInstance()方法调用默认构造器(无参数构造器)初始化新建对象。

  • getClassLoader()
    返回该类的类加载器。

  • getComponentType()
    返回表示数组组件类型的 Class。

  • getSuperclass()
    返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。

  • isArray()
    判定此 Class 对象是否表示一个数组类。

生成对象的步骤

2.png

示例代码

使用JAVA反射的优势与弊端

  • 优点 :
  1. 能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。 
  2. 与Java动态编译相结合,可以实现无比强大的功能 
  • 缺点 :  
  1. 使用反射的性能较低
  2. 使用反射相对来说不安全 
  3. 破坏了类的封装性,可以通过反射获取这个类的私有方法和属性