Java反射机制详解

概述

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

功能

Java反射机制主要提供以下功能:
在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

反射机制

对于一个字节码文件.class,虽然表面上我们对字节码文件一无所知,但该文件本身却记录了许多的信息。Java再将.class字节码文件载入时,JVM将会产生一个java.lang.Class对象代表这个.class字节码文件,从这个字节码文件我们可以获得喝多该类的基本信息,直接是反射机制。

反射机制所需要的类主要由java.lang中的Class类和java.lang.reflect包中的Construct类、Field类、Method类和Parameter类。Class类是一个比较特殊的类,它是Java反射机制的基础,,Class类的对象表示的是正在运行的Java程序中的类或接口,也就是任何一个类被加载时,即将类的.class文件(字节码文件)读入内存的同时,都自动为之创建一个java.lang.Class对象。Class类没有公共的构造方法,它的对象是JVM在加载类时通过类加载器中的defineClass()方法创建的,因此不能显示地创建一个Class对象。通过这个Class对象,才可以获取该对象的其他信息。

Tip:类的内部信息:类名、方法、字段、属性、构造器等。
Tip:反射的强大之处:用private修饰的方法也能够通过反射获取到。

如何反射获取对象?

获取反射对象,最主要的是了解反射主要的API:
java .lang.Class : 代表一个类
java.lang.reflect.Method:代表类的方法
java.lang.reflect.Filed:代表类的成员变量
java.lang.reflect.Constructer:代表类的构造方法

		//todo 返回与具有给定字符串名称的类或接口关联的类对象
        Class aClass = Class.forName("reflect.Student");

        //todo 获取student方法show并调用
        Method show = aClass.getMethod("show");
        Object o = aClass.newInstance();//初始化对象
        show.invoke(o);

        //todo 获取student类的构造器
        Constructor constructor = aClass.getConstructor();

        //todo 获取student对象的公共字段name(不能获取私有字段)
        Field name = aClass.getField("name");

Class类详解

在Object类中定义了public final Class getClass()方法,此方法被所有的子类继承。这个方法的返回值是一个Class类型,此类(Class类)是Java反射的源头,实际上所谓的反射从程序的运行结果来看也很好理解,即:可以通过反射求出类的名称。

Class类本身也是一个类
Class对象由系统创建对象
一个加载的类在内存当中只有一个Class对象
一个Class对象的实例对象对应的是一个加载到JVM的.class文件
每个类的实例都知道自己由哪个Class实例生成
通过Class可以完整的获取到一个类中的所有被加载的结构
Class类是Reflection的根源,针对任何你想动态加载和运行的类,唯有先获得对应的Class对象

反射图

来自百度图片

反射的意义优点

增加程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力。
通过反射机制可以让程序创建和控制任何类的对象,无需提前硬编码目标类。
使用反射机制能够在运行时构造一个类的对象、判断一个类所具有的成员变量和方法、调用一个对象的方法。
反射机制是构建框架技术的基础所在,使用反射可以避免将代码写死在框架中。

反射的缺点

1、性能问题。
Java反射机制中包含了一些动态类型,所以Java虚拟机不能够对这些动态代码进行优化。因此,反射操作的效率要比正常操作效率低很多。我们应该避免在对性能要求很高的程序或经常被执行的代码中使用反射。而且,如何使用反射决定了性能的高低。如果它作为程序中较少运行的部分,性能将不会成为一个问题。
2、安全限制。
使用反射通常需要程序的运行没有安全方面的限制。如果一个程序对安全性提出要求,则最好不要使用反射。
3、程序健壮性。
反射允许代码执行一些通常不被允许的操作,所以使用反射有可能会导致意想不到的后果。反射代码破坏了Java程序结构的抽象性,所以当程序运行的平台发生变化的时候,由于抽象的逻辑结构不能被识别,代码产生的效果与之前会产生差异。

反射的应用场景

JDBC数据库连接;
逆向代码 ,例如反编译;
与注解相结合的框架 例如Retrofit;
反射机制应用框架 例如spring,ssm,springboot等;
动态生成类框架 例如Gson;

Just Do It:

“虫子,从来没有被真正战胜过!”
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值