一篇文章带你搞定JAVA反射

一篇文章带你搞定JAVA反射

什么是反射

Java反射是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;在运行时可以获取类的信息,并且可以操作类,比如获取构造方法和成员变量、方法的信息,以及调用方法等。

反射的作用

Java反射机制在框架开发和调试中经常用到,可以动态的创建对象,动态的访问和修改对象属性,动态的修改方法、调用方法。

反射的基本用法

获取类的基本信息

获取一个类的Class对象,有三种方法:

方法1:使用Class.forName()方法

Class<?> clazz1 = Class.forName("com.yourpackage.YourClass");

方法2:直接获取类对象

YourClass yourClass = new YourClass();
Class<?> clazz2 = yourClass.getClass();

方法3:使用类.class方式

Class<?> clazz3 = YourClass.class;

获取类的成员变量

获取类的成员变量,可以使用如下方式:

// 获取字段
Field[] fields = clazz.getDeclaredFields();

获取类的构造方法

获取类的构造方法,可以使用如下方式:

// 获取构造方法
Constructor<?>[] constructors = clazz.getConstructors();

获取类的方法

获取类的方法,可以使用如下方式:

// 获取所有方法
Method[] methods = clazz.getDeclaredMethods();

// 获取单个方法
Method method = clazz.getDeclaredMethod("methodName", parameterTypes);

反射实例说明

示例1:动态调用类的方法

class Student{
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void showName() {
        System.out.println("Name: " + this.name);
    }
}

public class Test {
    public static void main(String[] args) {
        try {
            //获取类的class对象
            Class clazz = Class.forName("Student"); 

            //实例化对象
            Object obj = clazz.newInstance(); 

            //获取方法
            Method method = clazz.getDeclaredMethod("setName", String.class); 

            //调用方法
            method.invoke(obj, "zhangsan"); 

            //获取方法
            method = clazz.getDeclaredMethod("showName"); 

            //调用方法
            method.invoke(obj); 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上述代码通过反射机制动态调用类的方法,输出如下:

Name: zhangsan

示例2:反射创建对象

public class Test {
    public static void main(String[] args) {
        try {
            //获取类的class对象
            Class clazz = Class.forName("java.util.ArrayList"); 

            //使用构造方法创建对象
            Object obj = clazz.newInstance(); 

            //向对象中添加元素
            Method m1 = clazz.getMethod("add", Object.class); 
            m1.invoke(obj, "hello"); 
            m1.invoke(obj, "world"); 

            //打印对象中的元素
            Method m2 = clazz.getMethod("toString");
            System.out.println(m2.invoke(obj)); 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上述代码通过反射机制创建了一个ArrayList对象,并向其中添加元素,然后打印输出ArrayList中的元素,输出如下:

[hello, world]

反射的局限

反射机制虽然强大,但也有其局限性,它会严重影响程序执行效率,而且不够安全,需要额外增加代码实现安全性的保证。

参考资料

[1].Java反射机制详解

[2].Java反射机制的构造方法、成员变量、方法及属性等详细介绍

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一篇文章带你搞定JAVA反射 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 下载软件时获取真实地址的方法

    下载软件时获取真实地址的方法攻略 在下载软件时,有时候我们需要获取软件的真实地址,以确保下载的文件是可信和安全的。下面是一些获取真实地址的方法: 方法一:使用开发者官网 打开你要下载软件的开发者官网。 寻找软件的下载页面或者下载链接。 在下载页面或链接上右键点击,选择“复制链接地址”或类似选项。 将复制的链接地址粘贴到浏览器的地址栏中,然后按下回车键。 浏览…

    other 2023年8月4日
    00
  • c#实现hook功能详解

    以下是使用C#实现hook功能的详细攻略,包含两个示例说明: 引入必要的命名空间 在使用C#实现hook功能之前,需要引入必要的命名空间。可以使用以下代码引必要的命名空间: using System; using System.Diagnostics; using System.Runtime.InteropServices; 定义钩子回调函数 在使用C#实…

    other 2023年5月8日
    00
  • vue项目中应用ueditor自定义上传按钮功能

    下面详细讲解“vue项目中应用ueditor自定义上传按钮功能”的完整攻略。 一、准备工作 1. 安装ueditor 在vue项目中引入并使用ueditor需要先下载ueditor。可以下载最新的stable版本,也可以到github上下载最新的development版本。 下载后将ueditor文件夹拷贝到项目中的静态资源文件夹中,例如,拷贝到public…

    other 2023年6月25日
    00
  • 2018版java多线程面试题集合及答案

    2018版Java多线程面试题集合及答案攻略 介绍 在Java开发中,多线程是一个非常重要的概念。掌握多线程的知识对于面试来说是必不可少的。本攻略将详细讲解2018版Java多线程面试题集合及答案,帮助你更好地准备面试。 问题1:什么是线程?Java中如何创建线程? 答案: 线程是程序执行的一条路径,是进程中的一个执行单元。在Java中,有两种方式创建线程:…

    other 2023年8月2日
    00
  • spring的xml文件打开没有namespace等操作选项的解决方案

    针对“spring的xml文件打开没有namespace等操作选项”的问题,我们可以采用以下几个步骤来解决。 步骤1:导入schema文件 在<beans>节点上方加入如下命名空间声明: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 并在<beans>节…

    other 2023年6月26日
    00
  • Mybatis结果集映射与生命周期详细介绍

    Mybatis结果集映射与生命周期详细介绍 简介 Mybatis是一款优秀的ORM框架,其结果集映射机制可以让开发者灵活地把查询结果映射到POJO对象中,方便开发者进行数据处理和业务逻辑处理。本文将详细介绍Mybatis的结果集映射机制和生命周期,并提供示例代码演示。 结果集映射 结果集映射是Mybatis中一个很重要的概念,通过结果集映射,开发者可以轻松地…

    other 2023年6月27日
    00
  • mongodb的projection

    MongoDB的Projection 简介 在MongoDB中,查询操作非常常见。虽然我们可以使用“find”方法找到我们想要的数据,但是有时我们并不需要所有的数据,这时候就需要用到”projection”(投影)来选择需要查询的字段。”projection”是MongoDB查询语言中的一个操作符。 基本语法 db.collection.find({quer…

    其他 2023年3月29日
    00
  • Java中将File转化为MultipartFile的操作

    Java中将File转化为MultipartFile的操作通常用于上传文件,下面是对这个操作的完整讲解攻略: 1. 引入依赖 在pom.xml文件中引入相关依赖,一般需要引入spring-web,commons-fileupload等依赖。 <dependency> <groupId>org.springframework</g…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部