Java反射API

Java反射API详解与应用场景 一、Java反射API简介: 什么是反射:反射是指在运行时访问、检查、修改了解Java类、接口、字段和方法的能力。 核心类与接口:包括 Class, Constructor, Field, Method ,Modifier等。 二、利用反射进行类操作: 加载类:使用 Class 类的 forName() 方法加载类,获取类的Class对象。 创建实例:通过 Class 对象的 newInstance() 方法创建类的实例。 获取类信息:如获取类名、包名、父类、接口等。 三、利用反射进行构造器操作: 阅读详情

Java反射API

Java反射机制提供的功能

  • 获取一个类的所有成员变量及方法(含构造方法(有/无 参数))

  • 创建一个类的对象:

1、获取一个对象具有的成员变量及赋值

2、调用一个对象的方法

3、判断一个对象所属的类

java.lang.Class 类

java.lang.Class类是反射机制的基础

Class存放着对应类型对象的运行时信息

  • 在Java程序运行时,Java虚拟机为所有类型维护一个java.lang.Class对象

  • 该Class对象存放着所有关于该对象的 运行时信息

  • 泛型形式为Class< T >

Java反射机制的实现除了依靠Java.lang.Class类,还需要依靠:Constructor类、Field类、Method类:

  • Class类

类对象

  • Constructor类

类的构造器对象

  • Field类

类的属性对象

  • Method类

类的方法对象

使用

在使用Java反射机制时,主要步骤包括:

    1. 获取 目标类型的Class对象
    1. 通过 Class 对象分别获取Constructor类对象、Method类对象 & Field 类对象
    1. 通过 Constructor类对象、Method类对象 & Field类对象分别获取类的构造函数、方法&属性的具体信息,并进行后续操作

获取目标类型的Class对象


public class T {

    public static void main(String[] args) throws ClassNotFoundException {

        //Object.getClass()

        String s = "test";

        Class<?> class_ = s.getClass();

        System.out.println(class_);

        //输出
        //class java.lang.String

        System.out.println("-------------------------------");

        //T.class

        Class<?> class_1 = Double.class;

        System.out.println(class_1);

        //输出
        //class java.lang.Double

        System.out.println("-------------------------------");

//        /Class.forName

        Class<?> class_2 = Class.forName("java.lang.Character");

        System.out.println(class_2);

        //输出
        //class java.lang.Character

        System.out.println("-------------------------------");


        //TYPE语法

        Class<?> classType = Boolean.TYPE;
        System.out.println(classType);
        // 输出
        //boolean

    }
}



通过Class对象分别获取Constructor类对象、Method类对象 & Field 类对象

Class类中的方法:

获取类的构造函数(传入构造函数的参数类型)

  • 获取指定的构造函数 (公共 / 继承)
    Constructor getConstructor(Class<?>… parameterTypes)

  • 获取所有的构造函数(公共 / 继承)
    Constructor<?>[] getConstructors()

  • 获取指定的构造函数 ( 不包括继承)
    Constructor getDeclaredConstructor(Class<?>… parameterTypes)

  • 获取所有的构造函数( 不包括继承)
    Constructor<?>[] getDeclaredConstructors()

例子:


public class T1 {

    public static void main(String[] args) throws NoSuchMethodException {


        Class<?> class_ = Data.class;


        Constructor constructor = class_.getConstructor(int.class);

        System.out.println(constructor);

        System.out.println("------------");

        for (Constructor c:class_.getConstructors()) {
            System.out.println(c);
            //public better_write.Learn_reflection.A2.Data(int,double,java.lang.String,float,char)
            //public better_write.Learn_reflection.A2.Data(float,char)
            //public better_write.Learn_reflection.A2.Data()
            //public better_write.Learn_reflection.A2.Data(int,double,java.lang.String)
        }

        System.out.println("------------");

        for (Constructor c : class_.getDeclaredConstructors()) {
            System.out.println(c);
            //private better_write.Learn_reflection.A2.Data(double,java.lang.String,float)
            //public better_write.Learn_reflection.A2.Data(int,double,java.lang.String,float,char)
            //public better_write.Learn_reflection.A2.Data(float,char)
            //public better_write.Learn_reflection.A2.Data()
            //public better_write.Learn_reflection.A2.Data(int,double,java.lang.String)
            //public better_write.Learn_reflection.A2.Data(int)
        }

        System.out.println("------------");
        
    }
}


不带 "Declared"的方法支持取出包括继承、公有(Public) & 不包括有(Private)的构造函数

带 "Declared"的方法是支持取出包括公共(Public)、保护(Protected)、默认(包)访问和私有(Private)的构造方法,但不包括继承的构造函数

获取类的属性(传入属性名)

  • 获取指定的属性(公共 / 继承)
    Field getField(String name)

  • 获取所有的属性(公共 / 继承)
    Field[] getFields()

  • 获取指定的所有属性 (不包括继承)
    Field getDeclaredField(String name)

  • 获取所有的所有属性 (不包括继承)
    Field[] getDeclaredFields()


public class T2 {


    public static void main(String[] args) throws NoSuchFieldException {

        Class<?> class_ = Data.class;

        for (Field f : class_.getFields()) {
            System.out.println(f);
            //public java.lang.String better_write.Learn_reflection.A2.Data.string
        }

        System.out.println("-----------------------------");

        Field f1 = class_.getField("aShort");
        //public short better_write.Learn_reflection.A2.Data.aShort


        System.out.println(f1);


    }
    
}


获取类的方法(传入方法名 & 参数类型)

  • 获取指定的方法(公共 / 继承)
    Method getMethod(String name, Class<?>… parameterTypes)

  • 获取所有的方法(公共 / 继承)
    Method[] getMethods()

  • 获取指定的方法 ( 不包括继承)
    Method getDeclaredMethod(String name, Class<?>… parameterTypes)

  • 获取所有的方法( 不包括继承)
    Method[] getDeclaredMethods()


public class T3 {


    public static void main(String[] args) throws NoSuchMethodException {


        Class<?> class_ = Data.class;

        for (Method m : class_.getMethods()) {
            System.out.println(m);
            //public static int better_write.Learn_reflection.A2.Data.m1(int,int)
            //public final void java.lang.Object.wait() throws java.lang.InterruptedException
            //public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
            //public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
            //public boolean java.lang.Object.equals(java.lang.Object)
            //public java.lang.String java.lang.Object.toString()
            //public native int java.lang.Object.hashCode()
            //public final native java.lang.Class java.lang.Object.getClass()
            //public final native void java.lang.Object.notify()
            //public final native void java.lang.Object.notifyAll()
        }

        System.out.println("--------------------------------------------");

        Method m1 = class_.getMethod("m1", int.class, int.class);
        //public static int better_write.Learn_reflection.A2.Data.m1(int,int)
        System.out.println(m1);

        System.out.println("--------------------------------------------");

        Method m2 = class_.getMethod("m5");
        //public void better_write.Learn_reflection.A2.Data.m5()

        System.out.println(m2);


    }
}

通过 Constructor类对象、Method类对象 & Field类对象分别获取类的构造函数、方法 & 属性的具体信息 & 进行操作

通过Constructor 类对象获取类构造函数信息
  • String getName();// 获取构造器名

  • Class getDeclaringClass();// 获取一个用于描述类中定义的构造器的Class对象

  • int getModifiers();// 返回整型数值,用不同的位开关描述访问修饰符的使用状况

  • Class[] getParameterTypes();// 获取一个用于描述参数类型的Class对象数组


public class T4 {


    public static void main(String[] args) {

        Class<?> class_ = Data.class;

        for (Constructor c:class_.getConstructors()) {
            System.out.println(c.getName());
            System.out.println("");
            System.out.println(c.getDeclaringClass());
            System.out.println("");
            System.out.println(c.getModifiers());
            System.out.println("");
            for (Class cc : c.getParameterTypes()) {
                System.out.println("para class type  " + cc);
            }
            System.out.println("---------------------------------------------------");

        }

    }
}

通过Field类对象获取类属性信息
  • String getName();// 返回属性的名称

  • Class getDeclaringClass(); // 获取属性类型的Class类型对象

  • Class getType();// 获取属性类型的Class类型对象

  • int getModifiers(); // 返回整型数值,用不同的位开关描述访问修饰符的使用状况

  • Object get(Object obj) ;// 返回指定对象上 此属性的值

  • void set(Object obj, Object value) // 设置 指定对象上此属性的值为value

public class T6 {

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, InstantiationException {

        Class<?> class_ = Data.class;

        for (Field f : class_.getFields()) {

            System.out.println(f.getName());
            System.out.println("");
            System.out.println(f.getDeclaringClass());
            System.out.println("");
            System.out.println(f.getType());
            System.out.println("");
            System.out.println("-------------------------");
        }

        System.out.println("********");
        Data data = (Data) class_.newInstance();
        Field f1 = class_.getField("string");
        f1.set(data,"ass");

        System.out.println(data.getString());

        System.out.println(f1.get(data));
    }
}

通过Method 类对象获取类方法信息
  • String getName();// 获取方法名

  • Class getDeclaringClass();// 获取方法的Class对象

  • int getModifiers();// 返回整型数值,用不同的位开关描述访问修饰符的使用状况

  • Class[] getExceptionTypes();// 获取用于描述方法抛出的异常类型的Class对象数组

  • Class[] getParameterTypes();// 获取一个用于描述参数类型的Class对象数组


public class T5 {


    public static void main(String[] args) {

        Class<?> class_ = Data.class;

        for (Method m : class_.getMethods()) {

            System.out.println(m.getName());
            System.out.println("");
            System.out.println(m.getDeclaringClass());
            System.out.println("");
            System.out.println(m.getModifiers());
            System.out.println("");
            for (Class cc : m.getParameterTypes()) {
                System.out.println("para : " + cc);
            }
            System.out.println("---------------------");


        }

    }
}


结合使用


public class T9 {

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException {

        Class<?> class_ = Class.forName("better_write.Learn_reflection.A2.Data");

        Data d1 = (Data) class_.newInstance();

        d1.setaChar('a');

        System.out.println(d1.getaChar());


        Field char_field = class_.getDeclaredField("aChar");



        char_field.set(d1,'l');

        System.out.println(d1.getaChar());

        System.out.println(char_field.get(d1));

        System.out.println("--------------------------------------------");

        Data d2 = (Data) class_.getConstructor(float.class,char.class).newInstance(12f,'4');

        System.out.println(d2);

        Method m1 = class_.getDeclaredMethod("m2");

        m1.setAccessible(true);
        m1.invoke(d1);

        Method m2 = class_.getDeclaredMethod("m4");

        m2.invoke(d1);
        
    }
}


Java:Java 反射API简介 Java反射API可用于检查和修改用Java编写的程序的运行时行为。在这篇Java编程教程中,我们将研究Java反射API,它的特性和优点,如何使用它,它的缺点等等。 阅读详情

相关推荐

解释Java中的反射API

Java中的反射API允许程序在运行时获取类的内部信息,并可以操作这些类的字段、方法和构造器。:面试官可能会要求你列举一些常用的反射API,并解释它们的作用和使用方法。你需要能够熟练地使用这些API来获取类的内部信息,并操作类的字段、方法和构造器。:在回答中,你可以适当展现你的思考过程,如为什么选择使用反射、如何设计解决方案等。:在回答中,你应该突出反射API的核心特点和优势,以及你在使用反射时遇到的挑战和解决方案。:面试官会询问你在实际项目中是否使用过反射,以及你是如何使用反射来解决实际问题的。

2401_84909878的博客 494

java--基础--20.3--反射--反射api的功能详解

java–基础–20.3–反射–反射api的功能详解 1、Java反射简介 1.1、定义 JAVA反射机制是在运行状态中 对于任意一个类,都能够知道这个类的所有属性和方法 对于任意一个对象,都能够调用它的任意一个方法 这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。 1.2、反射机制的核心 允许在运行时通过Java Reflection APIs来取得已知名字的class类的内部信息(包括其modifiers(诸如public, static等等)、

zhou920786312的博客 774

Java反射案例

Java反射案例,可以参考: Java反射机制 - 相关API:https://blog.youkuaiyun.com/niuba123456/article/details/85951088

java 反射常用API

一、反射的作用 1.提高程序的灵活性2.屏蔽掉实现的细节,让使用者更加方便好用 二、反射使用的地方:自定义组件/框架 三、反射常用的API..............

m0_67730362的博客 689

CS5212芯片实战:手把手教你设计DP转VGA转换电路(附完整原理图)

本文详细介绍了CS5212芯片在DP转VGA转换电路设计中的实战应用,包括芯片架构解析、核心电路设计要点、PCB布局与电磁兼容设计、调试技巧及进阶应用开发。通过完整的原理图和实用设计指南,帮助工程师快速掌握高可靠转换器的设计方法,特别适合需要国产化替代方案的场景。

weixin_30576827的博客 390

sldd数据字典导出为excel

sldd导出为excel

zpfjf的博客 2237

java笔记(30)——反射的 API 及其 使用

java JDK5.0之后有了反射机制,这里讲述了java反射中的API以及利用反射机制从类中读取信息到文件中存储的例子。

qq_62678419的博客 1143

如何利用DeepSeek自动生成PLC程序?

在工业自动化领域,PLC是核心控制设备,其编程效率和质量直接影响生产线的运行效果。 然而,传统PLC编程依赖工程师手动编写代码,不仅耗时耗力,还容易出错。通过自动生成PLC程序,DeepSeek不仅大幅提升了编程效率,还优化了代码质量。 那么DeepSeek到底能否自动生成PLC程序呢? 有位电气工程师就尝试让DeepSeek设计一套五层电梯控制系统的PLC程序,下面就让我们看看吧。 技术原理:DeepSeek如何实现自动编程DeepSeek利用自然语言处理技术,将工程师输入的文本指令转换为PLC代码。例

Qinmingyue13的博客 6172

Java核心API-反射

在计算机学科中,反射是指计算机程序在运行时可以访问、检测和修改它本身状态或行为的一种能力。通过Java的反射机制,程序员可以更深入地控制程序的运行过程,如在程序运行时对用户输入的信息进行验证,还可以逆向控制程序的执行过程。理解反射机制是学习Spring框架的基础。

FreedomLifepa的博客 1840

2024年广东省职业院校技能大赛“区块链技术应用”任务书—区块链应用系统开发参考答案

摘要 本文档提供了2024年广东省职业院校技能大赛"区块链技术应用"项目中区块链电子签章前端功能开发的参考答案。主要内容包括:1)注册页面开发,实现身份证号码双向绑定和注册请求发送;2)登录页面开发,实现用户认证、状态保存和页面跳转;3)个人印章页面开发,实现注销功能和印章信息展示。每个任务均包含具体实现代码片段和功能测试要点,涵盖Vue.js框架下的数据绑定、axios请求处理和本地存储等关键技术点。

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 343

silero-vad 训练自己的数据

silero-vad 训练自己的数据

jacke121的专栏 815

java 反射api_Java的反射API

java 反射api 如果您曾经问​​过自己以下问题: –“如何在字符串中仅包含其名称的方法调用?” –“如何动态列出类中的所有属性?” –“如何编写将任何给定对象的状态重置为默认值的方法?” 然后,您可能已经听说过Java的Reflection API,如果您还没有听说过,这是一个很好的机会,了解它的全部含义和用途。 此功能确实功能强大,但一如既往,必须使用一些良好的判断。 它...

最佳 Java 编程 315

如何在 DevOps 管道中实现 AI?

AI与DevOps的融合(AIOps)正在重塑软件开发生命周期。本文系统阐述了AI在DevOps中的五大应用场景:智能监控、自动化测试、安全防护、CI/CD优化和事件管理,并提出了六步实施框架:痛点识别、工具选型、流程集成、智能监控、MLOps和治理合规。通过Netflix、Google等企业的实践案例,验证了AI在提升部署效率(降低40%故障率)、缩短问题解决时间(MTTR减少60%)方面的显著价值,同时指出数据质量、模型偏差等实施挑战。研究表明,战略性地

介绍AWS Azure GCP devops Terraform 等技术 497

java反射的api_Java反射API

java反射的api Java反射API (Java Reflection API) Reflection means ability of a software to analyze itself. In Java, Reflection API provides facility to analyze and change runtime behavior of a class at run...

cunfen6312的博客 336

使用R语言读取和处理CSV数据集

查看数据集的结构str(data)# 查看数据集的摘要统计信息str()函数将显示数据集的结构信息,包括变量名称、类型和前几行的值。summary()函数将提供数据集的摘要统计信息,如均值、中位数、最小值、最大值等。

CyberGenius的博客 3855

将Windbg附加到软件进程上排查异常闪退的问题

使用Windbg和Process Explorer排查因为内存泄漏导致的软件异常闪退问题。

dvlinker的技术专栏 1万+

java 反射api_反射是最重要的Java API

java 反射api 前几天我在想-这是最重要的Java API。 哪种SE和EE API可以使大多数Java生态系统成为可能,而哪些API不能重新创建为第三方库。 正如您可能已经猜到标题一样,我认为它是Reflection API 。 是的,它不可避免地是每个项目的直接或间接的一部分。 但这对于许多其他API(尤其是Collection API)而言确实如此。 但是,Reflection...

最佳 Java 编程 244

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java的反射API

如果您曾经问​​过自己以下问题: –“如何在字符串中仅包含其名称的方法调用?” –“如何动态列出类中的所有属性?” –“如何编写一种将任何给定对象的状态重置为默认值的方法?” 然后您可能已经听说过Java的Reflection API,如果您还没有听说过,这是一个很好的机会,了解它的全部含义以及可用于什么。 此功能确实功能强大,但一如既往必须使用一些良好的判断力。 它为表带来的...

最佳 Java 编程 397

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java 反射 api_七分钟理解 Java 的反射 API

像java一样,一种具有反射功能的语言。允许开发人员在运行时检查类型、方法、字段、注解等,并在程序运行时决定是否使用。 为此,Java的反射API提供类,类,字段,构造函数,方法,注释和其他。 使用它们可以与编译时未知的类型进行交互,例如创建未知类的实例并对它们调用方法。这个快速提示旨在让您深度了解什么是反射,它在Java中的使用,以及它可以用于什么。 之后,你将准备好开始或工作更长的教程。 为了...

weixin_39609423的博客 146

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java反射常用API

Java反射机制 1、什么是Java反射机制 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 Java的反射机制允许编程人员在对类未知的情况下,获取类相关信息的方式变得更加多样灵活,调用类中相应方法,是Java增加其灵活性与动态性的一种机制。 2、反射的源头 反射是通过什么为源头来取得一个实体类的所有属性和方法的呢?反射是通过对一个类的Cl

wenpan的博客 3026

Java 反射 API 简介

通常来说,使用反射 API 的第一步便是获取 Class 对象。在 Java 中常见的有这么三种。 使用静态方法 Class.forName 来获取。 调用对象的 getClass() 方法。 直接用类名 +“.class”访问。对于基本类型来说,它们的包装类型(wrapper classes)拥有一个名为“TYPE”的 final静态字段,指向该基本类型对应的 Class对象。 例如,Integer.TYPE 指向 int.class。对于数组类型来说,可以使用类名 +“[ ].cl...

MyySophia的博客 297

java反射API

反射 API 用来生成 JVM 中的类、接口或则对象的信息。 Class 类:反射的核心类,可以获取类的属性,方法等信息。 Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性 值。 Method 类: Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或 者执行方法。 Constructor 类: Java.lang.reflec 包中的类,表示类的构造方法。 反射使用步骤(获取 Class 对象、调用对象方法

初心不改,事在人为 229

java反射api_JAVA反射机制的API

展开全部图3的各个Java class成份,分62616964757a686964616fe58685e5aeb931333339666666别对应于图4的Reflection API,其中出现的Package、Method、Constructor、Field等等classes,都定义于java.lang.reflect。Java class 内部模块(参见图3)Java class 内部模块说明...

weixin_35048266的博客 236
上一篇: Java反射理解
下一篇: 实现一个简单的词法分析器
Coder_py
博客等级 码龄10年 106粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值