java反射的实战教程(简单且高效)

news2024/9/23 9:31:24

1. 参考

建议按顺序阅读以下文章
学了这么久的java反射机制,你知道class.forName和classloader的区别吗?
Java反射(超详细!)

2. 实战

2.1 通过Class.forName()方法获取字节码
这个方法会去我们的操作系统寻找这个class文件(java编译生成的字节码文件),并将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。注意这里的静态块指的是在类初始化时的一些数据。

public class User {
    private static int a = 10;
    {
        System.out.println("普通代码块");
    }
    static{
        System.out.println("静态变量a:"+a);
        System.out.println("静态代码块");
    }
}

// 测试
public class FDDTest {
    public static void main(String[] args) {
        try {
            Class forNameUser = Class.forName("com.fdd.reflect.User");
            System.out.println("Class.forName testing...");
            System.out.println("user " + forNameUser.getName());
        } catch (ClassNotFoundException e){
            e.printStackTrace();
        }
    }   
}

/** 
	静态变量a:10
	静态代码块
	Class.forName testing...
	user com.fdd.reflect.User
*/

2.2 创建对象。

class ReflectTest02{
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        // 通过反射机制,获取Class,通过Class来实例化对象
        Class c = Class.forName("javase.reflectBean.User");
        // newInstance() 这个方法会调用User这个类的无参数构造方法,完成对象的创建。
        // 重点是:newInstance()调用的是无参构造,必须保证无参构造是存在的!
        Object obj = c.newInstance();
        System.out.println(obj);
    }
}

2.3 获取并调用属性Field

class ReflectFieldQuery{
    public static void main(String[] args) throws ClassNotFoundException {
		// 反射机制创建对象
        Class studentClass = Class.forName("javase.reflectBean.Student");
        //获取所有的属性
        Field[] fields = studentClass.getDeclaredFields();
        for (Field f : fields){
        	// 获取属性的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号
            // 用Modifier类的toString转换成字符串
        	String modifiers = Modifier.toString(f.getModifiers());
          	// 获取属性的类型
          	String typeName = f.getType().getSimpleName();
          	// 获取属性的名字
         	String fieldName = f.getName();
        }
    }
}

class ReflectFieldUpdate{
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException {
        //使用反射机制给属性赋值
        Class studentClass = Class.forName("javase.reflectBean.Student");
        Object obj = studentClass.newInstance();
        Field nameField = studentClass.getDeclaredField("name");
      	
      	// 打破封装(反射机制的缺点:打破封装,可能会给不法分子留下机会!!!)
        // 这样设置完之后,在外部也是可以访问private的。
        nameField.setAccessible(true);
        nameField.set(obj, "liming");
        System.out.println(nameField.get(obj));
    }

2.4 获取并调用方法Method

class ReflectMethodQuery{
    public static void main(String[] args) throws ClassNotFoundException {
        Class userServiceClass = Class.forName("java.lang.String");

        // 获取所有的Method(包括私有的!)
        Method[] methods = userServiceClass.getDeclaredMethods();
        for (Method m : methods){
            String modifiers = Modifier.toString(m.getModifiers());
            String returnTypeName = m.getReturnType().getSimpleName();
            String methodName = m.getName();
            Class[] parameterTypes = m.getParameterTypes();
        }
    }
}

// 重点:必须掌握,通过反射机制怎么调用一个对象的方法?五颗星*****
class ReflectMethodInvoke{
    public static void main(String[] args) throws Exception {
        //使用反射机制调用方法
        Class userServiceClass = Class.forName("javase.reflectBean.UserService");
        // 创建对象
        Object obj = userServiceClass.newInstance();
        // 获取Method
        Method loginMethod = userServiceClass.getDeclaredMethod("login", String.class, String.class);
        Object resValues = loginMethod.invoke(obj, "admin", "123");//注:方法返回值是void 结果是null
        System.out.println(resValues);
    }
}

2.5 获取并调用构造器Constructor

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

        Class vipClass = Class.forName("javase.reflectBean.Vip");
        Constructor[] constructors = vipClass.getDeclaredConstructors();
        for (Constructor c : constructors){
            String modifiers = Modifier.toString(c.getModifiers());
            String returnTypeName = c.getReturnType().getSimpleName();
            String methodName = c.getName();
            Class[] parameterTypes = c.getParameterTypes();
        }
    }
}

class ReflectConstructorInvoke{
    public static void main(String[] args) throws Exception {
        Class vipClass = Class.forName("javase.reflectBean.Vip");
        // 调用无参数构造方法
        Object obj1 = vipClass.newInstance();//Class类的newInstance方法
        Constructor c1 = vipClass.getDeclaredConstructor(int.class, String.class, String.class, boolean.class);
        Object obj2 = c1.newInstance(321, "lsi", "1999-10-11", true);
        System.out.println(obj2);

        // 获取无参数构造方法
        Constructor c2 = vipClass.getDeclaredConstructor();
        Object obj3 = c2.newInstance();
        System.out.println(obj3);
    }
}

附录

Class类方法
在这里插入图片描述
Field类方法
在这里插入图片描述
在这里插入图片描述
Method类方法
在这里插入图片描述
Constructor类方法
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1325013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux、widnows的免费局域网桌面远程工具之NoMachine

统信UOS、银河麒麟及其他的linux桌面系统/windows系统都可进行远程桌面操作使用。 1.先到官网下载https://downloads.nomachine.com/自己使用的软件版本。 2.首先下载windwos端的的版本64位进行安装,安装是先暂时退出windows的杀毒软件,以免提示你各种确…

RabbitMQ入门指南(三):Java入门示例

专栏导航 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、AMQP协议 1.AMQP 2.Spring AMQP 二、使用Spring AMQP实现对RabbitMQ的消息收发 1.案例准备阶段 2.入门案例(无交换机) 3.任务模型案例(Work Queues&#xff0…

论文笔记:Accurate Localization using LTE Signaling Data

1 intro 论文提出LTELoc,仅使用信令数据实现精准定位 信令数据已经包含在已在LTE系统中,因此这种方法几乎不需要数据获取成本仅使用TA(时序提前)和RSRP【这里单位是瓦】(参考信号接收功率) TA值对应于信号…

5.6 Linux rsync 服务

1、rsync 概念介绍 官方网站:rsync rsync(Remote Sync) 是一个Unix/linux系统下的文件同步和传输工具。Rsync通过“rsync算法”提供了一个客户机和远程服务器的文件同步的快速方法。 采用C/S模式 端口tcp:873 a. rsync 特性 ① 可以镜像保存整个目录树和文件系…

月薪30k的软件测试工程师,是一个什么样的工作状态?

一位大佬的亲身经历 用了大概6年的时间,成为了年薪30w的测试开发。 回顾我从功能测试到测试开发的成长路径,基本上是伴随着“3次能力飞跃”实现的。 年名企大厂测试岗位内推文末获取!2022年名企大厂测试岗位内推文末获取! 第一…

OpenCV消除高亮illuminationChange函数的使用

学更好的别人, 做更好的自己。 ——《微卡智享》 本文长度为1129字,预计阅读4分钟 导语 上一篇《OpenCV极坐标变换函数warpPolar的使用》中介绍了极坐标变换的使用,文中提到过因为手机拍的照片,部分地方反光厉害。OpenCV本身也有一…

使用yarn安装electron时手动选择版本

访问1Password或者其他可以提供随机字符的网站,获取随机密码运行安装命令 操作要点,必须触发Couldnt find any versions for "electron" that matches "*"才算成功 将复制的随机密码粘贴到后面 例如:yarn add --dev elec…

CAS-源码分析引出Unsafe类、Unsafe类详解

CASDemo演示 public class CASDemo {public static void main(String[] args) {AtomicInteger atomicInteger new AtomicInteger(5);System.out.println(atomicInteger.compareAndSet(5, 2022) "\t" atomicInteger.get());//true 2022System.out.println(atomicI…

vit-transfomers 逐段精读

Vision Transformer Explained | Papers With Code 有趣的特性 在cnn中处理的不太好,但是在transformers 都能处理的很好的例子。 Intriguing Properties of Vision Transformers | Papers With Code 标题 AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE…

基于ETM+遥感数据的城市热岛效应现状研究的解决方案

1.引言 城市热岛效应(Urban Heat Island Effect)是指城市中的气温明显高于外围郊区的现象。在近地面温度图上,郊区气温变化很小,而城区则是一个高温区,就像突出海面的岛屿,由于这种岛屿代表高温的城市区域&…

【已解决】vs2015操作创建声明定义由于以下原因无法完成

本博文解决这样的一个问题,就是vs2015下用qt,在快速创建槽函数时给笔者报了个错误,错误的完整说法是这样子的”操作创建声明/定义“由于下列原因无法完成,所选的文本不包含任何函数签名。第一次遇到这种花里胡哨的问题&#xff0c…

[CVPR-23] PointAvatar: Deformable Point-based Head Avatars from Videos

[paper | code | proj] 本文的形变方法被成为:Forward DeformationPointAvatar基于点云表征动态场景。目标是根据给定的一段单目相机视频,重建目标的数字人,并且数字人可驱动;通过标定空间(canonical space&#xff09…

Jmeter实现CSV数据批量导入

CSV:逗号分隔值,是一种简洁且常见的数据存储格式。 1、参数化: 在Jmeter中,可以通过“用户自定义的变量”来实现参数化使操作方便,使用语法位:${参数名},如下图: 而CSV也同理&…

第二百一十八回 如何修改CircleAvatar的大小

文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"修改页面导航中遇到的问题"沉浸式状态样相关的内容,本章回中将介绍如何修改avada的大小.闲话休提,让我们一起Talk Flutter吧。 1.…

代码随想录算法训练营第四十一天|198.打家劫舍 ,213.打家劫舍II ,337.打家劫舍III

198. 打家劫舍 - 力扣(LeetCode) 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入&#…

支持向量机 支持向量机概述

支持向量机概述 支持向量机 Support Vector MachineSVM ) 是一类按监督学习 ( supervisedlearning)方式对数据进行二元分类的广义线性分类器 (generalized linear classifier) ,其决策边界是对学习样本求解的最大边距超亚面 (maximum-margin hyperplane)与逻辑回归和…

第二百一十七回 修改页面导航中遇到的问题

文章目录 1. 问题介绍2. 使用方法3. 代码与分析3.1 示例代码3.2 代码分析4. 内容总结我们在上一章回中介绍了"分享一种更新页面数据的方法"相关的内容,本章回中将介绍修改页面导航中遇到的问题.闲话休提,让我们一起Talk Flutter吧。 1. 问题介绍 我们在页面之间导…

C++刷题 -- 字符串

C刷题 – 字符串 文章目录 C刷题 -- 字符串1.重复的子字符串 1.重复的子字符串 https://leetcode.cn/problems/repeated-substring-pattern/submissions/490209402/ 暴力解法 第一个for循环用来标定子串的末尾,根据末尾取出子串 第二个while循环用来检查原字符串是…

WEB渗透—PHP反序列化(六)

Web渗透—PHP反序列化 课程学习分享(课程非本人制作,仅提供学习分享) 靶场下载地址:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场 课程地址:PHP反序列化漏洞学习_哔哩…

AT32 F435简介4/N ChibiOS porting plan

AT32 F435简介4/N ChibiOS porting plan 1. 源由2. 框图3. Makefile4. 分析4.1 Startup Code4.2 RT Port Layer4.3 HAL Board Layer4.4 HAL Port Layer 5. 总结6. 参考资料 1. 源由 对比STM32 F405进行AT32 F435 MCU的资料研读,期望获取更多差异化信息;…