当前位置: 代码迷 >> 综合 >> 个人见解:Java反射机制
  详细解决方案

个人见解:Java反射机制

热度:72   发布时间:2023-12-02 10:40:17.0

目录

  • 前言
  • 一、反射的概念
  • 二、Java 反射相关的API 简介
  • 三、Class对象
    • 常用的获取Class对象的3种方式:
  • 四、反射机制的优缺点
    • 优点:
    • 缺点:
  • 四、反射机制的功能


前言

关键性质:
Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时通过反射API取得任何一个已知名称的类的内部信息,包括其访问修饰符、父类、实现的接口,也包括属性和方法的所有信息,并可在运行时改变属性值或进行方法调用。Java 反射机制容许程序在运行时加载、探知、使用编译期间完全未知的类。也就是说,Java 可以加载一个运行时才得知名称的类,并且获得其完整结构信息,这种动态获取信息以及动态调用对象的成员的功能称为java语言的反射机制。


一、反射的概念

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。Java反射机制被称为框架设计的灵魂。

Class类:
以上的总结就是是反射的概念,通俗来讲:
反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
如图是类的正常加载过程:反射的原理在与class对象。
熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。其中这个Class对象很特殊。我们先了解一下这个C lass类。
在这里插入图片描述

二、Java 反射相关的API 简介

位于java.lang.reflect 包中

  1. Class 类:代表一个类。
  2. Filed 类:代表类的成员变量。
  3. Method 类:代表类的方法。
  4. Constructor 类:代表类的构造方法。
  5. Array 类:提供了动态创建数组,以及访问数组的元素的静态方法, 该类中的所有方法都是静态方法 。

三、Class对象

要想使用反射,首先需要获得待操作的类所对应的Class对象。
Java中,无论生成某个类的多少个对象,这些对象都会对应于同一个Class对象。
这个Class对象是由JVM生成的,通过它能够获悉整个类的结构。

常用的获取Class对象的3种方式:

  1. 使用Class类的静态方法。

Class.forName(“java.lang.String”);使用类的.class语法。如:

  1. 使用类的.class语法。

String.class;

  1. .使用对象的getClass()方法。

String str = “aa”;
Class<?> classType1 = str.getClass();

getClass()方法定义在Object类中,不是静态方法,需要通过对象来调用,并且它声明为final,表明不能被子类所覆写。直接print所获得的Class对象classType会输出:

class 完整类名

如果调用该Class对象的getName()方法,则输出完整类名,不加class。

四、反射机制的优缺点

优点:

在运行时获得类的各种内容,进行反编译,对于Java这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象。

缺点:

  1. 反射会消耗一定的系统资源,因此,如果不需要动态地创建一个对象,那么就不需要用反射;
  2. 反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。

四、反射机制的功能

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

  1. 在运行时判断任意一个对象所属的类。
  2. 在运行时构造任意一个类的对象。
  3. 在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private 方法)。
  4. 在运行时调用任意一个对象的方法。(注意:前提都是在运行时,而不是在编译时)
  相关解决方案