Java 反射机制

【Java核心高阶进阶】44-Java8核心新特性 模块十:Java新特性演进 · 第 1 篇Java 8 是 Java 语言历史上最重要的一次发布,它引入的函数式编程范式从根本上改变了 Java 的编码方式。即便到了 JDK 21 的今天,Lambda、Stream、Optional 仍是日常开发的高频工具。本篇将深入这些特性的语法、原理与底层机制,帮助你不仅会用,更知其所以然。 阅读详情

Java 反射机制也是进阶的知识点,在 Android 中有挺多地方用到,虽然我们自己写代码会比较少用到,但是这对阅读一些源码是挺有帮助的。就比如:RemoteView 中的一系列 set 方法,其最终就是通过反射机制去实现的。

什么是 Java 反射机制

Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
或许看完上面这段话之后还有点蒙蔽,我举个栗子:

User user = new User();

假如我已经有个 User 类,那么我可以利用反射机制,来知道 User 类里面有什么成员变量和方法,并且我能够调用这些变量和方法。

反射机制的简单运用

首先,大概浏览一下下面的代码。然后,思考一个问题:
我们写 Java 代码这么久了,我们新建的类(例如上面的:Reflect 类,User 类)都是谁的对象?
初次看到这个问题,我是蒙蔽的。搜寻答案之后,是 java.lang.Class 的对象,而我们的 Reflect 类和 User 类也有另外一种称呼,就是类的类型(class type)。而这就跟我们要说的反射机制跟这个 class type 有关系。下面这段代码就是反射的简单运用,有注释在旁边,应该也挺容易理解的。

package com.zone;
public class Reflect {
    public static void main(String[] args) {
//      类是 java.lang.Class 的对象
        User user = new User();
//      方法一
        Class userAlias1 = User.class;//获取类的类型
        User user1;
        try {
            user1 = (User)userAlias1.newInstance();//通过类的类型获取实例
            user1.printName("create by userAlias1");//通过实例调用方法
        } catch (InstantiationException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IllegalAccessException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
//      方法二
        Class userAlias2 = user.getClass();//获取类的类型
        try {
            User user2 = (User)userAlias2.newInstance();//通过类的类型获取实例
            user2.printName("create by userAlias2");//通过实例调用方法
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
//      方法三
        Class userAlias3 = null;
        try {
            userAlias3 = Class.forName("com.zone.User");//获取类的类型
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            User user3 = (User)userAlias3.newInstance();//通过类的类型获取实例
            user3.printName("create by userAlias3");//通过实例调用方法
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
class User{
    public void printName(String message){
        System.out.println("My name is zone. "+ message);
    }
}

那么我们稍微解释一下方法一:

//      方法一
        Class userAlias1 = User.class;//获取类的类型
        User user1;
        try {
            user1 = (User)userAlias1.newInstance();//通过类的类型获取实例
            user1.printName("create by userAlias1");
        } catch (InstantiationException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IllegalAccessException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

userAlias1 相当于 User 类的别名,userAlias1 还是指向 User 类的,因此我们可以通过它来获取实例。当然看成为别名是我个人的看法,只是为了更好理解。

user1 = (User)userAlias1.newInstance();//通过类的类型获取

获取方法的名称,参数类型,返回类型

    public static void printClassMessage(Object obj){
        Class c = obj.getClass();
        System.out.println("类的名称是:"+c.getName());
//      获取父类和本类的方法
        Method[] ms=c.getMethods();
//      获取本类的方法
//      c.getDeclaredMethods();
        for (int i = 0; i < ms.length; i++) {
//          获取方法的返回值的类的类型(class type)
            Class returnType = ms[i].getReturnType();
            System.out.print(returnType.getSimpleName()+" ");
//          获取方法的名字
            System.out.print(ms[i].getName()+"(");//这一句是为了打印出来更美观
//          获取参数的类的类型
            Class[] paramTypes = ms[i].getParameterTypes();
            for (int j = 0; j < paramTypes.length; j++) {
                if (j==paramTypes.length-1) {
                    System.out.print(paramTypes[j].getName());
                }else {
                    System.out.print(paramTypes[j].getName()+",");
                }
            }
            System.out.println(");");//这一句是为了打印出来更美观

        }
    }

这里写了一个方法,通过传入一个实例,来获取类的名字,类的方法,方法的参数和返回值。来看看将 user 实例传进去,会有什么打印出来:

User user = new User();
printClassMessage(user);

以下为控制台打印出的数据:

类的名称是:com.zone.User
void printName(java.lang.String);
void wait();
void wait(long,int);
void wait(long);
boolean equals(java.lang.Object);
String toString();
int hashCode();
Class getClass();
void notify();
void notifyAll();

可以看到第一个方法是我们自己写的方法 void printName(java.lang.String);

获取成员变量的类型和名称

    private static void printFieldsMessage(Object obj) {
        Class c = obj.getClass();
        Field[] fs = c.getFields();//获取 public 变量
//      Field[] fs = c.getDeclaredFields();//获取所有成员变量
        for (Field field : fs) {
            Class fieldType = field.getType();
            String typeName  = fieldType.getName();//获取成员变量的类型属性的 class type
            String fieldName = field.getName();//获取成员变量的名称
            System.out.println(typeName+fieldName);
        }
    }

下面为 User 类添加如下代码:

public String name = "zone";

然后传入 user 实例运行,运行结果如下:

java.lang.String  name

获取构造函数信息

    private static void printConstructorMessage(Object obj){
        Class c  = obj.getClass();
//      Constructor[] cs = c.getConstructors();//获取 public 修饰的构造方法
        Constructor[] cs = c.getDeclaredConstructors();//获取所有的构造方法
        for (Constructor constructor : cs) {
            System.out.print(constructor.getName()+"(");//输出构造函数名
            Class[] paramTypes = constructor.getParameterTypes();//获取构造函数参数类型
            for (Class class1 : paramTypes) {
                System.out.print(class1.getName()+",");//输出参数名
            }
            System.out.println(")");
        }
    }

通过反射调用方法

接下来为 User 类添加如下方法:

    public void printStr(String str1,String str2){
        System.out.println(str1+" && "+str2);
    }

然后通过反射来调用方法:

        User user = new User();
        Class c1 = user.getClass();
        try {
            Method m = c1.getDeclaredMethod("printStr", String.class,String.class);//获取 public 方法
//          Method m2 = c1.getMethod("printStr", String.class,String.class);
//          Method m3 = c1.getDeclaredMethod("printStr", new Class[]{String.class,String.class});//获取自己声明的方法
            m.invoke(user, "first","second");//通过反射调用方法
        } catch (NoSuchMethodException e2) {
            e2.printStackTrace();
        } catch (SecurityException e2) {
            e2.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

浏览上面代码之后,先来说说 getDeclaredMethod() 的参数,第一个参数是要调用的方法的名字。从第二个参数开始,是要放反射方法的参数的类的类型,这有两种方式。第一种: new 一个类的类型(class type) 的数组,数组里面放反射的方法的参数的类的类型(class type)。第二种: 直接开始放反射方法的参数的类的类型(class type)。文字描述起来有点绕,拿上面的例子解说一下:

Method m3 = c1.getDeclaredMethod("printStr", new Class[]{String.class,String.class});

“printStr”是我要反射的方法。String.class,String.class,是 printStr(String str1,String str2) 方法的参数的类的类型。

java 反射学到这里就告一段落了。等待发现更多知识点的你一起分享。

RGB渐变颜色转换公式及例程 设Step=51,将RGB(255,0,0)颜色渐变为RGB(0,255,0),即RGB(255,0,0)经过51次颜色渐变转为RGB(0,255,0);设Step=51,将RGB(0,255,0)颜色渐变为RGB(0,0,255),即RGB(0,255,0)经过51次颜色渐变转为RGB(0,0,255);设Step=51,将RGB(0,0,255)颜色渐变为RGB(255,0,0),即RGB(0,0,255)经过51次颜色渐变转为RGB(255,0,0);分步骤的方式,使其渐变色循环整个颜色值; 阅读详情

相关推荐

AG16K MCU ARM Cortex M3

其中,Input文件为Keil生成的mcu程序文件,输出为合成后的存储格式Bin文件,Program address 为上方表格中“程序运行 RAM 地址(4bytes)”,即 Keil 中设置的程序运行地址。其中 MCU 程序的地址,根据 mcu.ip 中设置的 FLASH_BIAS 进行设置。AG16K MCU 的 FPGA 工程中,需调用 alta_mcu_m3 的硬核 IP,包含在 alta_sim.v 的库文。Quartus II。//MCU 程序在 FLASH 中存放的首地址。

Embeded_FPGA的博客 1806

java的反射机制浅谈

一、java的反射机制浅谈最近研究java研究得很给力,主要以看博文为学习方式。以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出。受到各位指教之处,如若让小生好好感动,说不定会请各位吃饭哦!1.何谓反射机制根据网文,java中的反射机制可以如此定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。2.反射机制如何实现谈到反射机

Winiex's Blog 12万+

人形机器人骨骼材料选型实战:从铝合金到碳纤维的5种方案对比

本文深入探讨人形机器人骨骼材料的选型策略,对比铝合金、镁合金、钛合金、碳纤维复合材料及3D打印材料等5种方案的性能优劣。通过建立强度-重量比、疲劳寿命等核心评价维度,结合具体应用场景,提供科学的材料决策方法论,助力开发者优化机器人结构设计,实现性能与成本的平衡。

weixin_29199873的博客 440

Java反射机制

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象的方法的功能称为java语言的反射机制。在仅知道“包名+类名”的情况下使用。动态获取类的信息。

2303_77640525的博客 2188

SAP 财务快速记账之—G/L Item Fast Entry

SAP FICO 运维解决方案

lijinbao171022的博客 1647

制作Ubuntu22.04启动盘

现在越来越多程序代码都需要运行在linux环境下,运行这些代码的前提是安装一个稳定的linux操作系统。本文选择Ubuntu 22.04去制作系统启动盘。本文主要对ubuntu22.04的启动盘制作过程进行了详细的说明,希望能帮助到有需要的朋友。

lyx_ok的博客 1万+

Java的反射机制

定义在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。反射(Reflection)是Java语言的特性之一,能够让Java程序在运行时动态地执行类的方法、构造方法等。可以说有了反射,不管什么类在我们面前都毫无隐私可言,什么privateprotecteddefault。

晓的博客 1287

OLED的字模提取(保姆级)---基于PCtoLCD2013

做为一个刚刚开始接触编程不久的白菜,这个OLED想做一个信息显示,可是商家给我的例程里就是88,816两种字体的格式,我的屏幕是0.91寸的8*16的字体显示上感觉特别丢丢儿小,我就想整个大的,哎,只怪直接学习习惯不好,总是学一半,绕了好大一圈,才搞好,想写一篇博客,时刻提醒踏实学习,第一次写博客,小白一枚,勿喷。。 OLED屏幕驱动程序功能 我们对Markdown编辑器进行了一些功能拓展与语法支...

qq_44886611的博客 7781

Java中的反射机制

在我的上篇文章模拟JDK动态代理实现中涉及到了反射机制,学无止境,在此系统的学习一下Java中的反射机制。首先给出Java反射机制的定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 从以上的描述中可以看出Java中的动态特性,那么

yhao的博客 9072

Open3D 使用CPD算法对点云配准【2025最新版】

Coherent Point Drift相干点漂移算法实现点云配准(python代码)博客长期更新,本文最近更新时间为:2025年2月2日。

点云侠的博客 8万+

华为OD机试双机位C卷-部门人力分配 (Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【部门人力分配】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 部门人力分配。

qq_45776114的博客 1874

Java 反射机制介绍

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java反射机制在框架设计中极为广泛,需要深入理解 反射基础 RRIT(Run-Time Type Identification)运行时类型识别。在《Thinking in Java》一书第十四章中有提到,其作用是在运行时识别一个对象的类型和类的信息。主要有两种方式:一种是“传统的”RTTI,它假定

vincent_wen0766的博客 785

NX二次开发新建组件

NXOpen新建组件

qq_39541524的博客 329

JAVA反射机制总结

JAVA反射机制总结JAVA反射机制总结 反射的概述 什么是反射 为什么用反射机制 反射机制的关键 获取Class对象 获得构造器的方法 获得属性的方法 获得方法信息的方法 关于getMethods和getDeclaredMethods的区别 反射总结 巨人的肩膀反射的概述什么是反射? 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改他状态或行为的一种能力。 JAVA

Bing_ka的专栏 2101

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

什么是java反射机制

1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 2反射机制能做什么 反射机制主要提供了以下功能:  在运行时判断任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判断任意一个类所...

陈旭媛 1299

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java-反射机制(超详解)_java反射机制

新星计划,等你来造,一起学习进步!点击跳转活动奖励:❀【新秀奖】新注册用户发布第一篇文章(500字以上)获得电子【新秀勋章】;❀【基础奖】完成任务挑战用户可获专属电子勋章(潜力新星)+抽奖机会(百分百中奖)❀【特别奖】各导师评选团队综合top5,获实力新星实体证书/实体奖牌红色款二选一+APP作者推荐关注+实力(1)Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期 借助于ReflectionAPI取得任何类的内部信息,并能直接操作任意对象的内 部属性及方法。

2501_90250883的博客 1444

对Java中反射机制的理解

简单的说,反射机制就是在程序的运行过程中被允许对程序本身进行操作,比如自我检查,进行装载,还可以获取类本身,类的所有成员变量和方法,类的对象,还可以在运行过程中动态的创建类的实例,通过实例来调用类的方法,这就是反射机制一个比较重要的功能了。那么要通过程序来理解反射机制,首先要理解类的加载过程。 在Java程序执行的时候,要经历三个步骤:加载、连接和初始化。首先程序要加载到JVM的方法区中,然...

小Gd 的博客 1万+

java反射机制历史_java反射机制浅谈

一、Java的反射机制浅谈最近研究java研究得很给力,主要以看博文为学习方式。以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出。受到各位指教之处,如若让小生好好感动,说不定会请各位吃饭哦!1.何谓反射机制根据网文,java中的反射机制可以如此定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一...

weixin_33281940的博客 179

java反射机制的用处_java反射机制原理详解 java的反射机制用处在哪?

Java中的反射机制的原理和用途是什么?java反射机制的实现原理java反射机制有什么用,具体举例说明增加程序的灵活性。 如struts中。请CSS布局HTML小编今天和大家分享的派发控制。 当请CSS布局HTML小编今天和大家分享来到时。struts通过查询配置文件。找到该请CSS布局HTML小编今天和大家分享对应的action。已经方法。 然后通过反射实例化action。并调用响应metho...

weixin_30696571的博客 409
上一篇: Android进阶-view 的事件分发机制
下一篇: 腾讯云 centos7 配置服务器所需要知道的
zone7_
博客等级 码龄10年 144粉丝 133原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值