首页 > 其他分享 >反射快速入门

反射快速入门

时间:2024-07-18 20:08:33浏览次数:13  
标签:反射 入门 构造方法 对象 方法 Example 获取 快速 class

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

比如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");
    }
}

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

标签:反射,入门,构造方法,对象,方法,Example,获取,快速,class
From: https://www.cnblogs.com/hashcodee/p/18310338

相关文章

  • RxJava快速入门
    简单来说RxJava是一个实现响应式编程的类库。那什么是响应式编程?响应式编程的核心思想是"数据流是第一等公民”,程序的逻辑建立在数据流的变化之上。响应式编程的几个核心概念:(1)数据流:在响应式编程中,数据以流(Streans)的形式存在。流就像一条河,源源不断。比如一个数组或集合可......
  • Java多线程入门
    创建线程的三种方式继承Thread类classMyThreadextendsThread{@Overridepublicvoidrun(){for(inti=0;i<100;i++){System.out.println(getName()+""+i);}}publicstaticvoidmain(String[]args......
  • 基于Python语言的入门算法和数据结构(持续更新中,求关注一波)[链表 栈 队列 复杂度 操作]
    这篇文章主要是讲的Python语言的算法,本人还在不断记笔记中,文章也会持续更新,内容比较浅薄,请大家指教另外推荐一个比较好用的记笔记的软件Typora,自己已经使用很久了,感觉不错。。。虽然但是还是有欠缺。目录第一章算法概述1.1什么是数据结构?01数据结构都有哪些组成方式02......
  • 自学网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    如何入门网络安全_网络安全自学由于我之前写了不少网络安全技术相关的故事文章,不少读者朋友知道我是从事网络安全相关的工作,于是经常有人在微信里问我:我刚入门网络安全,该怎么学?要学哪些东西?有哪些方向?怎么选?不同于Java、C/C++等后端开发岗位有非常明晰的学习路线,网路安......
  • 自学网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    如何入门网络安全_网络安全自学由于我之前写了不少网络安全技术相关的故事文章,不少读者朋友知道我是从事网络安全相关的工作,于是经常有人在微信里问我:我刚入门网络安全,该怎么学?要学哪些东西?有哪些方向?怎么选?不同于Java、C/C++等后端开发岗位有非常明晰的学习路线,网路安......
  • mysql入门
    1.mysql下载 https://dev.mysql.com/downloads/mysql/我下载的是这个(两个的区别:上面的是联网安装,下面的是直接下载到本地安装)  2.下载后点击安装,按照指示一直点击下一步就可以安装过程中需要记录自己设置的密码,以及WindowsServiceName,之后连接的时候需要用到。 ......
  • 如何快速排查线上问题 -copy qf
    排查流程图flowchartTBA-->B-->C-->D-->EsubgraphA[认识问题]A1[收集信息]A2[确认问题]A3[复现问题]A4[影响范围]A1-->A2-->A3-->A4endsubgraphB[诊断/确认问题]B1[检查网络连接]......
  • VS快速全局查找Unity死循环代码
    1、编写一个死循环方法,然后运行调试vsusingUnityEngine;publicclassDeadLoop:MonoBehaviour{//StartiscalledbeforethefirstframeupdatevoidStart(){DeadLoopMethod();}voidDeadLoopMethod(){while(t......
  • Windows入门
    1.隐藏和显示控制台窗口WM_SYSCOMMAND:系统命令消息。SC_MINIMIZE:将窗口最小化。SC_RESTORE:将窗口还原。#include<windows.h>intmain(){HWNDhWnd=GetConsoleWindow();::SendMessage(hWnd,WM_SYSCOMMAND,SC_MINIMIZE,NULL);//程序运行至此处后,控制台......
  • 如何免费、无成本、快速的发布搭建自己的项目网站
    在这里推广使用OutSystems免费版本进行小型代码发布和部署的初步使用,待用户量增大后再考虑是否升级,可以先根据自身需求实现初步功能对于想要在无成本前提下快速实现自身想要的功能的用户有很大帮助,拥有自己的网站,可以尝试使用优点1.快速开发低代码平台:通过拖放......