java反射

windows下boost库的基本使用方法 1、首先到boost官网去下载最新的版本的boost库: http://www.boost.org/ 2、解压文件,在命令提示符中打开到boost库的根目录下,执行以下命令: bjam --toolset=msvc --build-type=complete stage 等待程序编译完成,大约要两个小时左右,会在boost根目录下生成bin.v2和stage两个文件夹,其中bi 阅读详情

案例代码:https://gitee.com/wangzai6/java-reflection.git
案例视频:https://www.bilibili.com/video/BV1C4411373T?p=1&vd_source=fc7fa697b97f292319c5b0cde4755484

1.反射概要

反射是将类的各个部分分装为其他对象

好处:

  • 可以在程序运行过程中,操作这些对象
  • 可以解耦,提高程序可扩展性

2.反射使用

在这里插入图片描述

1.获取class对象方式

 1.Class.forName(全类名):将字节码文件加载进内存,返回字节码对象 (多用于配置文件)
 2.类名.class:通过类名的属性获取class  (多用于参数的传递)
 3.对象.getClass() (多用于对象获取字节码)

2.案例

Person

package com.hejiawang.domain;

/**
 * @description:
 * @author: Mr.Wang
 * @create: 2022-07-06 09:56
 **/
public class Person {
    private String name;
    private int age;
    public String a;
    protected String b;
    String c;
    private String d;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", a='" + a + '\'' +
                ", b='" + b + '\'' +
                ", c='" + c + '\'' +
                ", d='" + d + '\'' +
                '}';
    }

    public void eat(){
        System.out.println("eat...");
    }

    public void eat(String food){
        System.out.println("eat..." + food);
    }
}

ReflectDemo1

package com.hejiawang.reflect;

import com.hejiawang.domain.Person;

/**
 * @description:
 * @author: Mr.Wang
 * @create: 2022-07-06 09:55
 **/
/*
 *    1.Class.forName("全类名"):将字节码文件加载进内存,返回字节码对象
   2.类名.class:通过类名的属性获取class
   3.对象.getClass()
 * */
public class ReflectDemo1 {
    public static void main(String[] args) throws Exception {
//        1.Class.forName("全类名")
        Class cls1 = Class.forName("com.hejiawang.domain.Person");
        System.out.println(cls1);
//        2.类名。class
        Class cls2 = Person.class;
        System.out.println(cls2);
//       对象.getClass()
        Person p = new Person();
        Class cls3 = p.getClass();
        System.out.println(cls3);
//      比较三个对象
        System.out.println(cls1 == cls2);
        System.out.println(cls1 == cls3);
    }
}

打印结果
在这里插入图片描述
结论:
同一个字节码文件(*.class)在一次程序运行中,只会被加载一次,不论通过哪种方式获取的Class对象都是同一个

3.class对象功能

1.获取成员变量们

  • Field[] getFields
  • Field getField(String name)
  • Field[] getDeclaredFields()
  • Field getDeclaredField(String name)

2.获取构造方法们

  • Constructor<?>[] getConstructors()
  • Constructor getConstructor(Class<?>… parameterTypes)
  • Constructor<?>[] getDeclaredConstructors()
  • Constructor getDeclaredConstructor(Class<?>… parameterTypes)

3.获取成员方法们

  • Method[] getMethods()
  • Method getMethod(String name,Class<?>… parameterTypes)
  • Method[] getDeclaredMethods()
  • Method getDeclaredMethod(String name,Class<?>… parameterTypes)

4.Field对象

1.设置值

public void set(Object obj,Object value)

2.获取值

public Object get(Object obj)

3.忽略访问权限修饰符的安全检查

setAccessible(true) 暴力反射,即可访问private的成员变量

4.案例

package com.hejiawang.reflect;

import com.hejiawang.domain.Person;
import jdk.management.resource.internal.inst.FileOutputStreamRMHooks;

import java.lang.reflect.Field;

/**
 * @description:
 * @author: Mr.Wang
 * @create: 2022-07-06 13:03
 **/
public class ReflectDemo2 {
    public static void main(String[] args) throws Exception {
        /*
        *
        1.获取成员变量们
        Field[] getFields 获取所有public修饰的成员变量

        Field getField(String name)

        Field[] getDeclaredFields()

        Field getDeclaredField(String name)

        2.获取构造方法们
        Constructor<?>[] getConstructors()

        Constructor getConstructor(Class<?>… parameterTypes)

        Constructor<?>[] getDeclaredConstructors()

        Constructor getDeclaredConstructor(Class<?>… parameterTypes)

        3.获取成员方法们
        Method[] getMethods()

        Method getMethod(String name,Class<?>… parameterTypes)

        Method[] getDeclaredMethods()

        Method getDeclaredMethod(String name,Class<?>… parameterTypes)
        * */
        Class personClass = Person.class;
//        1.Field[] getFields 获取所有public修饰的成员变量
        Field[] fields = personClass.getFields();
        for (Field field : fields){
            System.out.println(field);
        }
        System.out.println("--------------");
        Field a = personClass.getField("a");
//        获取成员变量a的值
        Person p = new Person();
        Object value1 = a.get(p);
        System.out.println(value1);
//        设置a的值
        a.set(p,"飞哥");
        System.out.println(p);
        System.out.println("=============");
//        Field[] getDeclaredFields()  获取所有的成员变量。不考虑访问修饰符
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField:declaredFields){
            System.out.println(declaredField);
        }
//        Field getDeclaredField(String name)
        Field d = personClass.getDeclaredField("d");
//        忽略访问权限修饰符的安全检查
        d.setAccessible(true); //暴力反射
        Object value2 = d.get(p);
        System.out.println(value2);
    }
}

打印结果
在这里插入图片描述

4.Constructor对象

1.创建对象

public T newInstance(Object… initargs)
如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法

2.案例

package com.hejiawang.reflect;

import com.hejiawang.domain.Person;

import java.lang.reflect.Constructor;

/**
 * @description:
 * @author: Mr.Wang
 * @create: 2022-07-06 13:20
 **/
public class ReflectDemo3 {
    public static void main(String[] args) throws Exception {
        /*
        *
        2.获取构造方法们
        Constructor<?>[] getConstructors()

        Constructor getConstructor(Class<?>… parameterTypes)

        Constructor<?>[] getDeclaredConstructors()

        Constructor getDeclaredConstructor(Class<?>… parameterTypes)
        * */
        Class personClass = Person.class;
        Constructor constructor = personClass.getConstructor(String.class, int.class);
        System.out.println(constructor);
//        创建对象
        Object person = constructor.newInstance("肥宅子", 18);
        System.out.println(person);
        System.out.println("-------------");
//        无参构造方法
        Constructor constructor1 = personClass.getConstructor();
        System.out.println(constructor1);
//        创建对象
        Object person1 = constructor1.newInstance();
        System.out.println(person1);
        System.out.println("-------------");
//        无参构造方法简化
        Object person2 = personClass.newInstance();
        System.out.println(person2);
//        constructor.setAccessible(true);
    }
}

打印结果
在这里插入图片描述

5.Method对象

1.执行方法

public Object invoke(Object obj, Object… args)

2.获取方法名称

public String getName()

3.案例

package com.hejiawang.domain;

/**
 * @description:
 * @author: Mr.Wang
 * @create: 2022-07-06 09:56
 **/
public class Person {
    private String name;
    private int age;
    public String a;
    protected String b;
    String c;
    private String d;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", a='" + a + '\'' +
                ", b='" + b + '\'' +
                ", c='" + c + '\'' +
                ", d='" + d + '\'' +
                '}';
    }

    public void eat(){
        System.out.println("eat...");
    }

    public void eat(String food){
        System.out.println("eat..." + food);
    }
}
package com.hejiawang.reflect;

import com.hejiawang.domain.Person;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/**
 * @description:
 * @author: Mr.Wang
 * @create: 2022-07-06 20:49
 **/
public class ReflectDemo4 {
    public static void main(String[] args) throws Exception {
        /*
        *
        3.获取成员方法们
        Method[] getMethods()

        Method getMethod(String name,Class<?>… parameterTypes)

        Method[] getDeclaredMethods()

        Method getDeclaredMethod(String name,Class<?>… parameterTypes)
        * */
        Class personClass = Person.class;
//        获取指定名称的方法
        Method method1 = personClass.getMethod("eat");
        Person p = new Person();
//        执行方法
        method1.invoke(p);
//       有参方法
        Method method2 = personClass.getMethod("eat", String.class);
        method2.invoke(p,"米饭");
        System.out.println("-----------------");
//        获取所有public修饰的方法
        Method[] methods = personClass.getMethods();
        for (Method method : methods){
            System.out.println(method);
            String methodName = method.getName();
            System.out.println(methodName);
//            method.setAccessible(true);
        }
//        获取类名
        String className = personClass.getName();
        System.out.println(className);
    }

打印结果
在这里插入图片描述

6.实战Demo

需求:写一个“框架“,在不改变任何类代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法
实现:配置文件+反射

1.创建配置文件

在这里插入图片描述

className=com.hejiawang.domain.Person
methodName=eat

2.代码案例

package com.hejiawang.domain;

/**
 * @description:
 * @author: Mr.Wang
 * @create: 2022-07-06 09:56
 **/
public class Person {
    private String name;
    private int age;
    public String a;
    protected String b;
    String c;
    private String d;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", a='" + a + '\'' +
                ", b='" + b + '\'' +
                ", c='" + c + '\'' +
                ", d='" + d + '\'' +
                '}';
    }

    public void eat(){
        System.out.println("eat...");
    }

    public void eat(String food){
        System.out.println("eat..." + food);
    }
}

打印结果
在这里插入图片描述

Java反射 Java的反射(reflection)机制是指在程序的运行状态中,借助取得任何类的内部信息,可以动态地构造任意一个类的对象,并能直接操作任意对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。反射主要用到java.lang.Class类和包下的一些类,是 Java 反射机制的核心包,提供了操作类及其成员(字段、方法、构造函数等)的类和接口。表示类的对象。提供了获取类的字段、方法、构造函数等方法。 阅读详情

相关推荐

C++反射机制实现

C++反射机制实现,根据类名字符串创建该类的实例;根据类的属性字符串来设置属性;

C++ Boost.Reflection库(现在是Boost.PFR)的下载、安装、使用详细教程

Boost.Reflection(现在是Boost.PFR)是一个用于C++的开源库,它提供了一种运行时反射机制。这个库可以让程序在运行时动态地查询、访问类和对象的结构信息,例如类的成员函数、属性、父类等等。通过这些功能,Boost.Reflection可以帮助开发者编写更加灵活、可扩展的代码。

Lion_Long的博客 3197

利用易特天下 ipbox&零层壹号 sdwan 组网盒子实现异地组网

一款支持zerotier的异地组网盒子

v808v808的博客 3348

JS学习记录2

Global对象 eval json Math对象 Number对象 Object对象

十三月的博客 548

FreeModbus V1.6主机模式实战:如何在STM32上实现Modbus RTU主从一体通信

本文详细介绍了如何在STM32平台上利用FreeModbus V1.6开源协议栈实现Modbus RTU主从一体通信。文章深入剖析了V1.6版本主机模式的架构设计,提供了从硬件配置、串口与定时器移植到FreeRTOS操作系统适配的完整实战指南,并分享了数据缓冲区管理、多线程协同及高级调试技巧,为构建稳定可靠的工业通信网关提供了系统化解决方案。

weixin_29194255的博客 372

STM32 使用IO口模拟I2C时序

上一篇《I2C协议详解》 我们了解了I2C的操作流程,这一篇,我们就使用I2C,来对EEPROM进行操作吧。 我们做两种选择: 1.时序由IO口模拟高低电平,需要了解协议并按照协议操作相应的IO口。 2.时序由硬件自行产生,不需要人工干预; 由硬件产生的I2C时序,我们借助Stm32Cube配置实现便可,我们这一篇,抛开Stm32Cube,手撕代码,根据I2C的时序,一步步地实现I2C对...

8937

Java反射机制——通过反射机制实例化对象(详解)

1、使用反射机制实例化对象比较灵活。 Java代码只需写一遍,在不改变Java源代码的基础之上,可以做到不同对象的实例化。 非常灵活(符合OCP开闭原则:对扩展开放,对修改关闭。) 如果只要静态代码块执行,使用Class.forName(”完整类名“)。 2、java.util包下提供了一个资源绑定器,用于获取属性配置文件中的内容。 使用该方式时,属性配置文件必须放在类路径下; 资源绑定器,只能绑定xxx.properties文件 。......

Best_Basic的博客 3705

jmeter问题系列:Begin size 0 is not equal to fixed size 5

Begin size 0 is not equal to fixed size 5 ,问题的解决

雨水的早晨的博客 2411

Java------反射机制之通过反射实例化对象

通过Class的newInstance()方法来实例化对象 注意:newInstance()内部实际上调用了无参数构造方法,必须保证无参数构造的存在

yaoshutong的博客 1251

别再为淘宝滑块发愁了!一个Python脚本自动获取x5sec cookie的保姆级教程

本文提供了一套完整的Python自动化解决方案,帮助开发者轻松应对淘宝滑块验证码问题。通过模拟浏览器行为、精准识别滑块缺口位置和生成拟人化移动轨迹,脚本能够自动获取关键的x5sec cookie,显著提升爬虫效率。教程涵盖环境配置、验证机制分析、代码实现及反检测策略,是解决淘宝滑块验证的实用指南。

weixin_30300225的博客 574

将机器人urdf模型转换为Mujoco环境下的mjcf模型

在使用gym环境进行人形模型站立训练的过程中,我想要将之前ros环境下的机器人urdf模型导入到mujoco环境下,这时候就需要将urdf模型转换为mujoco专用的mjcf模型。-AzureLoong.urdf是机器人模型(我这里使用青龙的模型);--custom_robot.xml是转换完成之后的机器人模型的名字和格式;包要求 Python 版本必须是 3.11 或更高),保证自己的其他训练环境和依赖不被干扰。首先将meshes文件迁移到需要输出的目录下,然后再运行转换命令。最后就可以成功输出了。

weixin_44334573的博客 3754

Java之反射

1.什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于 任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的 方法的功能称为java语言的反射机制。 2.Class类对象的三种实例化模式 在默认情况下我们是根据包名.类名找到类。而反射是根据对象来取得对象的信息来源。 要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所 以先要获取到每一个字节码文件对应的Clas....

柠檬精 4万+

Cocos Creator 2.4 APK逆向实战:如何完整提取游戏资源并还原工程(附工具包)

本文详细介绍了针对Cocos Creator 2.4打包的APK进行逆向工程的完整流程,包括环境搭建、资源索引解析、打包文件提取、图集拆分以及工程结构还原。重点讲解了如何利用config.json和.jsb文件完整提取游戏资源,并生成可被Cocos Creator识别的工程目录与.meta文件,最终实现工程还原的目标。

h3i4j的博客 1493

Java 反射

反射(reflection)是 Java 中的一项特性,它允许程序在运行时查询和操作类的信息。即,在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意方法和属性。获取到方法和属性后,就可以对其进行修改。这种动态获取信息以及动态调用对象方法的功能也就是Java的反射机制

2301_76161469的博客 8772

把审批体验做成一体化:SAP Business Workflow 里的 Secondary Method、Before Method 与 After Method

摘要:SAP Business Workflow 中,Task 的 Secondary、Before 和 After 三类方法对提升审批体验和可追溯性至关重要。Secondary Method 可自动展示辅助信息(如审批时弹出排班报表),但需注意其独立会话特性;Before Method 适合预处理和审计留痕;After Method 确保收尾动作可靠执行。三类方法按特定顺序调用,且错误不影响主流程。合理使用这些方法能减少事务码切换,增强审计能力,优化用户体验。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 185

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java反射&python反射

作为一只主学java,次学python的猿,反射的梗,怎能不知道 一、反射是什么: 维基百科上给出的定义:在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。 以我浅薄的编程思想理解的反射: 反射可以让我们在不打开程序文件的情况下,清楚的知道该程序的内部结构...

远处 1475

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java 的反射

Java反射机制允许程序在运行时动态获取类信息并操作对象,是Java动态性的核心体现。反射通过Class类获取类结构,包括构造方法、字段和方法,还能创建对象、调用方法和修改字段值。反射支持泛型类型信息获取,广泛应用于框架开发、动态代理等场景。尽管反射功能强大,但性能开销较大,且可能破坏封装性,需谨慎使用。

weixin_73916358的博客 1252

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java 反射体系

Java反射(Reflection)是Java语言的一个重要特性,它允许运行中的Java程序对自身进行检查,并且可以直接操作程序的内部属性。通过反射,我们可以在运行时获取类的信息、创建对象、调用方法以及访问和修改字段等。Java反射体系主要包括以下几个核心类:Class类:代表一个类或接口。每个类都有一个对应的Class对象,该对象包含了类的所有信息,如名称、父类、实现的接口、构造器、方法和字段等。可以通过以下几种方式获得Class类名.class对象.getClass()

weixin_47363690的博客 1512

Java反射之方法反射demo

Java反射之方法反射demo package reflect; import java.lang.reflect.Method; public class ClassDemo3 { public static void main(String[] args) { String s = "hello"; ClassUtil.printClassMethodMessage(s

龙腾四海365的专栏 2692

java 反射_反射实例——JAVA反射机制

一、Java反射反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。其中LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基于反射机制的语言。最近,反射机制也被应用到了视窗系统、操作...

weixin_39713578的博客 138

java反射三种方法_反射及暴力反射

作者:逯小逯出自:SegmentFault 思否原文:segmentfault.com/a/1190000037432381反射一、概述(1)反射的定位是很重要的,JVM和底层框架都离不开反射(2)反射的原理是拿到你的class文件里的数据,进行数据的操作(CURD)(3)反射提供了丰富的方法,来操作类里的各种数据(属性/方法/构造)(4)REflection(反射)是Java程序开发语言的特征之...

weixin_39586353的博客 2389

JAVA反射

Java是先编译再运行的语言,程序中对象的类型在编译期就确定下来了;而当程序在运行时需要动态加载某些类时(这些类因为之前用不到没有被加载到JVM),通过反射可以在运行时动态地创建对象并调用其属性,我们不需要提前在编译期知道运行的对象是谁。Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。Java反射机制的本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取t对象的各种信息。java反射详解。

qq_39239864的博客 959

Java反射概念及类的反射

Java中,反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接

wangliaizq10000的专栏 7390
上一篇: Linux命令详解./configure、make、make install 命令
下一篇: java设计模式
Persistence___
博客等级 码龄8年 47粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值