反射快速入门

· 浏览次数 : 7

正文

反射就是通过字节码文件获取类的成员变量、构造方法和成员方法的所有信息。
利用反射,我们可以获取成员变量的修饰符、名字、类型、取值。我们可以获取构造方法的名字、形参,并利用通过反射获取的构造方法创建对象。我们可以获取成员方法的修饰符、名字、形参、返回值、抛出的异常、注解,并运行通过反射获取的方法。

比如idea中的自动提示就是通过反射获取的,idea通过反射获取该对象的所有能调用的方法,并将它显示出来,又比如idea中函数的形参提示也是通过反射获取的。

反射是通过字节码文件对象获取成员变量、成员方法、构造方法的所有信息,所以,我们先要获取字节码文件对象,再去从字节码文件对象中获取成员变量、构造方法和成员方法,最后再进行解剖获取所有信息。

获取class对象的3种方式:

(1)class.forName("全类名");
(2)类名.class;
(3)对象.getClass();

那我们应该如何选择呢?

创建一个类的对象,我们需要经历以下3个阶段:

  • 源代码阶段:Java->class,在这个阶段,虚拟机是没有把代码加载到内存当中的,全都是硬盘中进行操作。在这个阶段用第一种方式获取class字节码文件对象。第一种方式最为常用。
  • 加载阶段:把字节码文件加载到内存中。这个阶段使用第二种方式来获取字节码文件对象。第二种方式通常都是当作参数进行传递。
  • 运行阶段:在该阶段使用第三种方式。当我们已经有了这个类的对象时才可以使用第三种方式。

利用反射获取构造方法:

Constructor<?>[] getConstructors()//返回所有公共构造方法对象的数组
Constructor<?>[] getDeclaredConstructors()//返回所有构造方法对象的数组
Constructor<T> getConstructor(Class<?>..parameterTypes)//返回单个公共构造方法对象
Constructor<T> getDeclaredConstructor(Class<?>.. parameterTypes)//返回单个构造方法对象
T newInstance(Object... initargs)//根据指定的构造方法创建对象
setAccessible(boolean flag)//设置为true可以绕过访问控制权限,使得 private 属性或方法也可以被访问。

//setAccessible(boolean flag)使用示例
public class Example {
    private String privateField = "privateValue";
}
public class AnotherClass {
    public static void main(String[] args) throws Exception {
        Example instance = new Example();
        Field field = Example.class.getDeclaredField("privateField");
        field.setAccessible(true);
        System.out.println("Private Field Value: " + field.get(instance)); // 可以通过反射访问私有字段
    }
}

Class类中用于获取成员变量的方法:

Field[] getFields()//返回所有公共成员变量对象的数组
Field[] getDeclaredFields()//返回所有成员变量对象的数组
Field getField(String name)//返回单个公共成员变量对象
Field getDeclaredField(Stringname)//返回单个成员变量对象
void set(Object obj, Object value)//给成员变量赋值
Object get(Object obj)//获取成员变量的值。
setAccessible(boolean flag)//使用 setAccessible(true) 可以绕过访问控制权限,使得 private 属性或方法也可以被访问。

//set,get示例
public class Example {
    private String name;
    private int age;

    public static void main(String[] args) throws Exception {
        Example example = new Example();

        Field nameField = Example.class.getDeclaredField("name");
        Field ageField = Example.class.getDeclaredField("age");

        // 设置字段值
        nameField.set(example, "John Doe");
        ageField.set(example, 30);

        // 获取字段值
        System.out.println("Name: " + nameField.get(example));
        System.out.println("Age: " + ageField.get(example));
    }
}

Class类中用于获取成员方法的方法:

Method[] getMethods()//返回类中所有公共成员方法对象的数组,包括继承的
Method[] getDeclaredMethods()//返回类中所有成员方法对象的数组,不包括继承的
Method getMethod(String name, Class<?>... parameterTypes)//返回单个公共成员方法对象
Method getDeclaredMethod(String name, Class<?>... parameterTypes)//返回单个成员方法对象
Object invoke(Object obj,Object... args)//运行方法
//参数一:用obj对象调用该方法
//参数二:调用方法的传递的参数(如果没有就不写)
//返回值:方法的返回值(如果没有就不写)
setAccessible(boolean flag)//使用 setAccessible(true) 可以绕过访问控制权限,使得 private 属性或方法也可以被访问。

//invoke使用示例:
public class Example {
    public void greet(String name) {
        System.out.println("Hello, " + name + "!");
    }

    public static void main(String[] args) throws Exception {
        Example example = new Example();
        Method method = Example.class.getMethod("greet", String.class);

        // 调用 greet 方法
        method.invoke(example, "John");
    }
}

注意:获取公共方法时也会获取父类中的所有公共方法。获取所有权限的方法时,就不会获取父类的方法

与反射快速入门相似的内容:

反射快速入门

反射就是通过字节码文件获取类的成员变量、构造方法和成员方法的所有信息。 利用反射,我们可以获取成员变量的修饰符、名字、类型、取值。我们可以获取构造方法的名字、形参,并利用通过反射获取的构造方法创建对象。我们可以获取成员方法的修饰符、名字、形参、返回值、抛出的异常、注解,并运行通过反射获取的方法。 比

3min快速掌握Go语言正/反向代理的姿势

先重温一下什么叫反向代理,正向代理。 鹅厂二面,nginx回忆录 所谓正向/反向代理取决于代理的是出站请求,还是入站请求。 正向代理: 代理的出站请求, 客户端能感知到代理程序,架构上距离客户端更近。 反向代理: 代理的是入站请求,客户端认为代理程序就是服务器,客户端感知不到代理逻辑,架构上距离服务

[转帖]我国煤炭产量位居全球第1,天然气产量排第4,那石油排第几呢?

https://mp.weixin.qq.com/s/nxUS_IUNNIMDbLLuWoXAJQ 英国石油公司(BP)发布的《世界能源统计年鉴》(Statistical Review of World Energy 2022)显示:在全球经济、贸易快速反弹带动下,2021年的煤炭总产量已接近81.

安全攻防丨反序列化漏洞的实操演练

通过实操演练,深入浅出、快速吃透反序列化漏洞的根本原理。

性能提升-如何设置Windows操作系统TIME_WAIT状态的TCP连接快速回收时间?

大规模Windows环境下,采用Nginx反向代理服务后,操作系统会产生较多TIME_WAIT的TCP(Transmission Control Protocol)连接,操作系统默认TIME_WAIT的TCP连接回收时间是4分钟,TCP默认动态端口范围为开始端口49152,结束端口65535。这样会

电源电路E24系列反馈电阻计算表格

可调电源,包括DCDC、LDO电路的设计中,经常需要计算反馈电阻进行选型。为了提高效率,优化选型采购,抽空做了个表格进行快速计算。 1.一般反馈电阻电路如下。 输出电压公式为:Vout=Vfb*(Rh+Rl)/Rl 2.E24电阻 标准电阻值被组织成一组称为E系列的值。E系列优选或标准电阻值范围是国

利用代码生成工具快速生成基于SqlSugar框架的Winform界面项目

我们接触一个新事物的时候,如果一个事物能够给我们带来非常直观的感官认识,那么我们就很容易接受,反之可能需要很长时间的潜移默化的了解认识才能接受。万物化繁为简,透过本质看表象,往往也是一个认知迭代深入的过程。在我介绍很多篇随笔《SqlSugar开发框架》,能够看完的肯定不会是一开始就学习的人员,毕竟技术的陈述是比较枯燥无味的,而最好的认识来自于一些快速的项目演示,本篇随笔介绍利用《代码生成工具Dat

618京东到家APP-门详页反爬实战

一、背景与系统安全需求分析 1. 系统的重要性 上图所示是接口所属位置、对电商平台或在线商店而言,分类查商品都是很重要的,通过为用户提供清晰的商品分类,帮助他们快速找到所需产品,节省浏览时间,提升购物效率,是购物结算产生GMV的核心环节。那么电商平台为什么都很看重商品信息的爬取? a. 数据收集和分

基于SqlSugar的开发框架循序渐进介绍(18)-- 基于代码生成工具Database2Sharp,快速生成Vue3+TypeScript的前端界面和Winform端界面

我们开发一个系统,在保证风格统一、代码强壮、可读性强等基础上,还能够结合代码生成工具快速开发相关后端,以及各种前端界面的,无疑是非常好的,既保证了项目的代码质量,又能够极大的提高开发效率。代码生成工具Database2Sharp是在完善的开发项目上,抽取出数据变化的部分,通过演绎、归纳、反复演绎和归纳等提炼方式抽取出相关的规则,以工具的方式来快速提高生产率,使得我们在开发各种不同的项目上的时候,能

iOS开发之弹窗管理

前言 “千淘万漉虽辛苦,吹尽狂沙始到金。”在这快速变化的互联网行业,身边的朋友有的选择了勇敢创业,有的则在技术的海洋中默默耕耘。时常在深夜反思,作为一个开发者,我们的价值何在?答案或许就在那行代码中,润物细无声。以下是我在日常开发中封装的一个弹窗管理工具——CLPopoverManager,希望能为