Java 反射

这篇具有很好参考价值的文章主要介绍了Java 反射。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java 的反射机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。

这种动态获取程序信息以及动态调用对象的功能称为 Java 语言的反射机制。反射被视为动态语言的关键。

反射的作用

  1. 在运行时判断任意一个对象所属的类。
  2. 在运行时构造任意一个类的对象。
  3. 在运行时判断任意一个类所具有的成员变量和方法。
  4. 在运行时调用任意一个对象的方法。
  5. 生成动态代理。

反射就像一面镜子,它可以在运行时获取一个类的所有信息,可以获取到任何定义的信息(包括成员变量,成员方法,构造器等),并且可以操纵类的字段、方法、构造器等部分。

通过反射操作类

要想剖解一个类,必须先要获取到该类的字节码文件对象。而剖解使用的就是 Class 类中的方法。所以先要获取到每一个字节码文件对应的 Class 类型的对象。

// 获取到Person的类类型对象
// 1. 通过类获取类类型对象
Class c1 = Person.class;
// 2. 通过字符串(完整类路径)获取到类类型对象
Class c2 = Class.forName("com.dailyblue.java.reflection.Person");
// 3. 通过对象获取到当前对象的类类型对象
Person p = new Person();
Class c3 = p.getClass();
// 4. 只有8大原始类型的封装类有这个方法
Class c4 = Integer.TYPE;

三种获取类对象方式

Java 反射

Class 类的常见方法

Java 反射

通过反射操作对象

通过刚才的方式,我们获取到了类的类型对象(字节码文件对象),下来我们需要进一步通过这个类的类型对象获取到该类的实例对象。

        // 1. 获取类
        Class c = Class.forName("com.dailyblue.java.reflection.Person");
        // 2.1 获取Person类的对象
        Person p1 = new Person();
        Person p2 = new Person(1);
        // 2.2 通过反射获取Person类的对象
        // 获取到Person类的所有构造器
        Constructor[] constructors = c.getDeclaredConstructors();
        for (Constructor c1 : constructors) {
            System.out.println(c1);
        }
        System.out.println("----------------------------------------------------------");
        // 获取到具体某个构造器
        Class[] 形式参数列表 = {};
        Constructor con1 = c.getDeclaredConstructor(形式参数列表);
        Constructor con2 = c.getDeclaredConstructor(Integer.class);
        Constructor con3 = c.getDeclaredConstructor(Integer.class, String.class);
        System.out.println(con1);
        System.out.println(con2);
        System.out.println(con3);
        System.out.println("----------------------------------------------------------");
        // 通过构造器获取类的对象
        Object obj1 = con1.newInstance();
        Object obj2 = con2.newInstance(3);
        Object obj3 = con3.newInstance(4, "admin");
        System.out.println(obj1);
        System.out.println(obj2);
        System.out.println(obj3);

通过反射操作属性

我们已经获取到类的字节码对象,也通过字节码对象获取到该类的实例对象。下来我们来看看如何操纵类中的属性。

Field 类概述

Field 类代表某个类中的一个成员变量。 Field 完整类名为 java.lang.reflect.Field,它提供类或接口中单独字段的信息,以及对单独字段的动态访问。

Field 类的常见方法

Java 反射

相关代码 

        Class c = Class.forName("com.dailyblue.java.reflection.Student");
        Object obj = c.getDeclaredConstructor().newInstance();
        // 获取所有属性
        // 获取所有定义的属性
        Field[] fields1 = c.getDeclaredFields();
        // 获取所有拥有的public属性(包含继承下来的)
        Field[] fields2 = c.getFields();
        // 在所定义的属性中查找指定名称的属性
        Field f1 = c.getDeclaredField("no");
        Field f2 = c.getDeclaredField("schoolName");
        // 在所拥有的public属性中查找指定名称的属性
        Field f3 = c.getField("name");
        System.out.println("---------------------------------------");
        // 给属性赋值
        f1.setAccessible(true); // 设置私有属性可以访问
        f1.set(obj,1);
        f2.set(obj,"西北大学");
        System.out.println("---------------------------------------");
        // 获取属性的值
        Object v1 = f1.get(obj);
        Object v2 = f2.get(obj);

通过反射操作方法

Method 类的概述

Method 的方法提供了对于在类或接口中单个方法的信息和访问,反射方法可能是一个类方法或实体方法(包含抽象方法)。

Method 类的常见方法

Java 反射文章来源地址https://www.toymoban.com/news/detail-481248.html

相关代码

        // 获取类
        Class c = Class.forName("com.dailyblue.java.reflection.Student");
        // 获取对象
        Object obj = c.getDeclaredConstructor().newInstance();
        // 获取所有方法
        Method[] methods1 = c.getDeclaredMethods();
        Method[] methods2 = c.getMethods();
        System.out.println("---------------------------------");
        // 获取单个方法 第一个参数是方法名,其后参数是形式参数列表
        Method m1 = c.getDeclaredMethod("e", String.class);
        Method m2 = c.getDeclaredMethod("f");
        Method m3 = c.getMethod("d", Integer.TYPE, String.class);
        System.out.println("---------------------------------");
        // 操作方法 第一个参数是对象,其后参数是实际参数列表
        Object result1 = m1.invoke(obj, "admin");
        m2.setAccessible(true);
        Object result2 = m2.invoke(obj);
        Object result3 = m3.invoke(obj, 1, "张三");
invoke方法:

作用:调用包装在当前Method对象中的方法。
原型:Object invoke(Object obj,Object...args) 
参数解释:obj:实例化后的对象;args:用于方法调用的参数
返回:根据obj和args调用的方法的返回值
抛出错误:IllegalAccessException(Method对象强制Java语言执行控制或无权访问obj对象) IllegalArgumentException(方法是实例化方法,而指定需要调用的对象并不是实例化后的类或接口)

到了这里,关于Java 反射的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java的反射机制

    Java 的反射机制允许在程序运行期间,借助反射 API 获取类的内部信息,并能直接操作对象的内部属性及方法。 Java 反射机制提供的功能: 在运行时,使用反射分析类的能力,获取有关类的一切信息(类所在的包、类实现的接口、标注的注解、类的数据域、类的构造器、类的

    2024年02月02日
    浏览(30)
  • Java反射、代理机制

    官方解释:反射允许对封装类的字段、方法和构造方法的信息进行编程访问。 虚拟机加载类文件后,会在方法区生成一个类对象,包含了类的结构信息,如字段、方法、构造方法等。反射是一种能够在程序运行时动态访问、修改类对象中任意属性的机制(包括private属性)。

    2024年02月10日
    浏览(31)
  • Java反射机制深入详解

    一.概念 反射就是把Java的各种成分映射成相应的Java类。 Class类的构造方法是private,由JVM创建。 反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取他所有的成员变量和方法并且显示

    2024年02月06日
    浏览(28)
  • “深入探究JVM内部机制:如何实现Java程序的运行环境?“

    标题:深入探究JVM内部机制:如何实现Java程序的运行环境? 摘要:本文将深入探究Java虚拟机(JVM)的内部机制,重点讨论JVM如何实现Java程序的运行环境。我们将从JVM的结构、类加载、内存管理、垃圾回收等方面展开讲解,并通过示例代码具体展示JVM内部机制的运作过程。

    2024年02月11日
    浏览(28)
  • Java学习路线(23)——反射机制

    一、概述 (一)什么是反射: 反射指的是任何一个Class类,在“运行时”都可以直接得到全部成分。 (二)动态可获取的对象: 构造器对象——Constructor,成员变量对象——Field,成员方法对象——Method。 (三)反射关键: 第一步都是得到编译后的Class对象,然后可以获得

    2024年02月08日
    浏览(36)
  • Java重点:反射机制的使用

    目录 一、概念 二、类类 1、类类的获取方式 1)类名.Class 2)对象.getClass() 3)Class.forName() 三、反射实例化 1、调用一个公有的无参构造方法 2、调用一个公有的一个参构造方法 3、调用一个公有的两个参构造方法 4、调用一个私有的一个参构造方法 四、反射:方法调用 1、公有

    2024年02月07日
    浏览(28)
  • 【JavaSE】Java的反射机制

    1.java反射机制 1.1简介 被视为动态语言的关键,允许程序在执行期间,借助于RefectionAPI取得任何类的内部信息。在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个类对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方

    2024年04月26日
    浏览(28)
  • Java安全基础之Java反射机制和ClassLoader类加载机制

    目录 Java 反射机制 反射 java.lang.Runtime ClassLoader 类加载机制 URLClassLoader loadClass() 与 Class.forName() 的区别? Java 反射(Reflection)是 Java 非常重要的动态特性。在运行状态中,通过 Java 的反射机制,我们能够判断一个对象所属的类。了解任意一个类的所有属性和方法。能够调用任

    2024年04月22日
    浏览(28)
  • 什么是Java中的反射机制?

    Java中的反射机制是一种能够在运行时动态地获取类的信息并操作类或对象的能力。Java中的每个对象都有一个getClass()方法,该方法可以返回该对象所属的类的Class对象。反射机制通过这个Class对象可以获取类的属性、方法、构造函数等信息,然后可以在运行时动态地创建对象、

    2024年02月02日
    浏览(23)
  • 敲黑板!java反射机制和原理

    获取Class对象:首先,你需要获取表示要操作的类的 Class 对象。可以使用以下三种方式之一来获取 Class 对象: Class.forName() 方法:使用类的全限定名获取 Class 对象,例如: Class? clazz = Class.forName(\\\"com.example.MyClass\\\"); .class 语法:如果你已经有了类的实例,可以使用 .class 语法来获

    2024年02月08日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包