iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java开发反射机制的实战经验总结
  • 924
分享到

Java开发反射机制的实战经验总结

2024-04-02 19:04:59 924人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录前言一、创建Class的三种方式二、反射获取类的所有属性和属性类型三、反射动态修改类属性的注解值四、反射获取类的方法及调用方式总结前言 我在实际项目当中有经常用到反射机制,故而将

前言

我在实际项目当中有经常用到反射机制,故而将学会的反射用法做一些汇总笔记,当做以后复盘所用。

存在这样一个类:


package com.example.demo;
import com.alibaba.fastJSON.annotation.jsONField;
public class User {
    private String name;
    @Value( value ="age_a")
    private String age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
     public String getAge() {
        return age;
    }

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

一、创建Class的三种方式

1 - Class clazz = Class.forName("com.example.demo.User");

注意一点,这里的forName("xxx")的类名需要全名,且为接口或类,否则加载不了。

2 - User user = new User();

Class clazz2 = user.getClass();

3 - Class clazz3 = User.class;

以上三种方式,都可以获取到类User的Class对象,通过Class,即可以开始玩反射了。

二、反射获取类的所有属性和属性类型


Class clazz = User.class;
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
    System.out.println("属性名:"+field.getName());
    System.out.println("属性的类型:"+field.getGenericType().getTypeName());
}

打印输出User的属性和属性类型——

属性名:name

属性的类型:java.lang.String

属性名:age

属性的类型:java.lang.String

利用反射获取到类的字段属性后,是不是可以利用反射来创建一个对象呢?答案是肯定的。

例如,可以类似下面代码,通过反射得到的字段属性,进而创建一个对象。


Map<String,Object> fileds = new HashMap<>();
fileds.put("name","张三");
fileds.put("age","10");
Object o = User.class.newInstance();
 Field[] fields = o.getClass().getDeclaredFields();
 for (Field field : fields) {
     //设置后可用反射访问访问私有变量
     field.setAccessible(true);
     //通过反射给属性赋值
     field.set(o,fileds.get(field.getName()));
 }
 User user1 = (User) o;
 System.out.println(user1.toString());

什么场景下可能需要这样做的呢?像一些内部数据与外部数据字段的映射,就可以通过类似的字段反射方式,将源数据映射给目标数据,进而得到可以插入数据库的目标对象。

三、反射动态修改类属性的注解值

注意一点,我们在设置User类时,对其中一个字段加了注解:@Value( value ="age_a")。这是一种设置值的注解,既然是设置值,是否还可以在代码运行过程中,根据不同情况来动态修改呢?

字段上的注解,其实都存放在一个memberValues属性里,这是一个map,可以这样来获取——


Field[] fields = User.class.getDeclaredFields();
for (Field field : fields) {
    //设置后可用反射访问访问私有变量
    if ("age".equals(field.getName() )){
        field.setAccessible(true);
       //获取 annotation 这个代理实例所持有的 InvocationHandler
       InvocationHandler invocationHandler = Proxy.getInvocationHandler(field.getAnnotation(Value.class));
       // 获取 InvocationHandler 的 memberValues 字段
        Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues");
        memberValues.setAccessible(true);
        Map<String, Object> values = (Map<String, Object>) memberValues.get(invocationHandler);
        System.out.println(values);
    }
}

debug打断点,可以看到——

这个Map<String,Object>存储的是该@注解里的所有属性值,这里,@Value只有一个value属性——


public @interface Value {
    String value();
}

若把它换成类似@JSONField(name="age_a"),把上边的代码稍微修改下,如:


Field[] fields = User.class.getDeclaredFields();
for (Field field : fields) {
    if ("age".equals(field.getName() )){
        field.setAccessible(true);
          InvocationHandler invocationHandler = Proxy.getInvocationHandler(field.getAnnotation(JSONField.class));
  ......
    }
}

@JSONField注解的内部属性有如下方式——

再运行刚刚的代码,可以看到,这里Map<String,Object>获取存储到的,便是这个注解里所有的属性与对应的属性值。

到了这一步,回到先前上边的问题,若要动态改变这个注解的值,怎么处理呢?

其实,很简单,只需要直接进行值设置就可以了,例如——


InvocationHandler invocationHandler = Proxy.getInvocationHandler(field.getAnnotation(Value.class));
Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues");
memberValues.setAccessible(true);
Map<String, Object> values = (Map<String, Object>) memberValues.get(invocationHandler);
values.put("value","new_age");
memberValues.setAccessible(false);

只是,注意一点是,这里的key需要对应上注解里是属性值。

四、反射获取类的方法及调用方式


 Object o=User.class.newInstance();
//通过反射获取到User的setAge方法,后面的String.class表示这个setAge方法的参数类型,若有多个,则按顺序列出
//同时,若为其他类型,如List,Long,则为List.class,Long.class
 Method m =  (Method) o.getClass().getMethod("setAge",String.class);
 m.invoke(o,"name");
 User user = (User) o;
 System.out.println(user);

打印可见,age已为name,说明setAge调用成功了。

这类使用场景,在代理当中出现比较多。

最后,通过反射实现一个Map转成对象的封装工具——


   public Object MapToObject(Object object,Map<String, Object> map) throws IllegalAccessException {
        Class cla =  object.getClass();
        Field[] fields = cla.getDeclaredFields();
        for(Field field:fields){
            field.setAccessible(true);
            if("serialVersionUID".equals(field.getName()))continue;
            if(map.get(field.getName())!=null) {
                Object value=map.get(field.getName());
                value=convertValType(value,field.getType());
                field.set(object, value);
            }
        }
        return object;
    }


    private static Object convertValType(Object value, Class<?> fieldTypeClass) {
        Object o = null;
        if (Long.class.getName().equals(fieldTypeClass.getName())
                || long.class.getName().equals(fieldTypeClass.getName())) {
            o = Long.parseLong(value.toString());
        } else if (Integer.class.getName().equals(fieldTypeClass.getName())
                || int.class.getName().equals(fieldTypeClass.getName())) {
            o = Integer.parseInt(value.toString());
        } else if (Float.class.getName().equals(fieldTypeClass.getName())
                || float.class.getName().equals(fieldTypeClass.getName())) {
            o = Float.parseFloat(value.toString());
        } else if (Double.class.getName().equals(fieldTypeClass.getName())
                || double.class.getName().equals(fieldTypeClass.getName())) {
            o = Double.parseDouble(value.toString());
        } else {
            retVal = o;
        }
        return retVal;
    }

总结

到此这篇关于Java反射机制的文章就介绍到这了,更多相关Java开发反射机制内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java开发反射机制的实战经验总结

本文链接: https://www.lsjlt.com/news/130015.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java开发反射机制的实战经验总结
    目录前言一、创建Class的三种方式二、反射获取类的所有属性和属性类型三、反射动态修改类属性的注解值四、反射获取类的方法及调用方式总结前言 我在实际项目当中有经常用到反射机制,故而将...
    99+
    2024-04-02
  • Java反射机制的学习总结
    一、什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。 二、哪里用到反射机制 有些...
    99+
    2022-11-15
    Java 反射机制
  • Git开发实战:项目经验分享与总结
    Git是一款分布式版本控制系统,广泛应用于软件开发领域。在实际的项目开发中,合理利用Git进行团队协作和版本管理,能够极大地提高开发效率和项目质量。本文将分享我在Git开发中的实战经验,并总结一些注意事项和技巧,希望对读者有所启发和帮助。一...
    99+
    2023-11-04
    开发 git 实战
  • 实战经验总结:高效开发Go语言项目
    Go语言近年来在软件开发领域中的应用越来越广泛,因为它的简洁、高效和并发处理能力。开发Go语言项目的过程中,掌握一些实战经验可以帮助开发者更高效地进行开发。本文将总结一些高效开发Go语言项目的经验,分享给读者。一、项目结构设计良好的项目结构...
    99+
    2023-11-02
    Go语言开发 实战经验 高效开发
  • uniapp开发小程序的经验总结
    1. 新建UI项目 首先,我们的UI是基于ColorUI,当ColorUI没有的样式,就基于Uniapp自带的UI。所以项目的开始要引入这两个UI框架。 如下,新建一个uni-ui...
    99+
    2024-04-02
  • CSS开发实战:解密各种网页效果的项目经验总结
    CSS开发实战:解密各种网页效果的项目经验总结引言:在现代网页设计中,CSS(层叠样式表)扮演着至关重要的角色。通过CSS技术,网页可以展现出丰富的视觉效果,让用户获得良好的浏览体验。本文将总结一些常见的网页效果,并分享一些在实际项目中的C...
    99+
    2023-11-02
    网页开发 项目经验 CSS效果
  • Java泛型机制与反射原理相关知识总结
    一、泛型的概念 1.1 基础案例 泛型在Java中的应用非常广泛,最常见则是在集合容器中,先看下基础用法: public class Generic01 { public...
    99+
    2024-04-02
  • 缩减SCSS 50%样式代码的实战经验总结
    本篇内容介绍了“缩减SCSS 50%样式代码的实战经验总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1...
    99+
    2024-04-02
  • java的反射机制如何实现
    Java的反射机制是指在运行时动态获取和操作类的相关信息的能力。通过反射,可以在运行时获取类的属性、方法、构造函数等信息,还可以动态...
    99+
    2023-08-31
    java
  • Java反射机制的实例分析
    这篇文章将为大家详细讲解有关Java反射机制的实例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在 Java 运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法对于任意一个对象...
    99+
    2023-06-17
  • Java 反射机制的实例详解
    Java 反射机制的实例详解前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来。那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现。正文 Java反射机制定义Java反射机制是指在运行状态中...
    99+
    2023-05-31
    java 反射机制 ava
  • C#开发新闻发布系统的项目经验总结
    C#开发新闻发布系统的项目经验总结项目背景新闻发布系统是一种用于发布和管理新闻内容的软件系统。随着互联网的发展,新闻媒体越来越重视在线新闻的传播和发布,因此,开发一个高效、稳定的新闻发布系统对于新闻机构来说是非常重要的。本文将对C#开发新闻...
    99+
    2023-11-02
    C#开发 新闻发布 项目经验总结
  • PHP开发:实现各类功能的经验总结与建议
    PHP是一种广泛使用的服务器端脚本语言,用于创建动态Web应用程序,并且随着互联网的飞速发展和各行业数字化的提升,PHP的开发工作也日益受到重视。在PHP的开发过程中,我们会遇到很多不同的需求和难点。在这篇文章中,我将分享一些我从实践中总结...
    99+
    2023-11-22
    经验总结 建议 PHP功能
  • 项目实战:如何运用CSS预处理器提升开发效率的经验总结
    项目实战:如何运用CSS预处理器提升开发效率的经验总结如今,网站和应用的开发离不开CSS(层叠样式表),它为页面的样式和布局提供了一种强大的控制方式。然而,纯CSS编写大型项目的样式往往会面临一系列问题,例如复杂度高、维护困难、代码冗余等。...
    99+
    2023-11-04
    开发效率 经验总结 CSS预处理器
  • java反射机制是如何实现的
    Java反射机制是通过Java的`java.lang.reflect`包中的类和接口来实现的。该包中包含了一些重要的类,如`Clas...
    99+
    2023-10-08
    java
  • 总结Go语言微服务开发的最佳实践与经验
    Go语言微服务开发的最佳实践与经验总结 引言:随着云计算和容器化技术的发展,微服务架构正在成为当今开发中越来越受欢迎的一种架构模式。Go语言作为一种高效且易于构建可扩展系统的语言,逐渐成为微服务架构中的首选语...
    99+
    2024-01-23
    最佳实践 经验总结 微服务开发
  • Python开发经验总结:提高开发效率的技巧和工具
    Python开发经验总结:提高开发效率的技巧和工具在当今快节奏的软件开发环境中,提高开发效率成为了每个开发者都关注的重点。作为一种功能强大且易学易用的编程语言,Python在软件开发领域中日益受到青睐。本文将总结一些提高Python开发效率...
    99+
    2023-11-22
    性能优化 (performance optimization) 调试器 (Debugger) 自动化 (Automati
  • C#开发智能门禁系统的项目经验总结
    C#开发智能门禁系统的项目经验总结引言:随着科技的不断进步,智能门禁系统在如今的社会生活中扮演着非常重要的角色。智能门禁系统通过运用现代化的技术手段,实现了对出入人员的身份识别、权限控制、安全监控等功能。本文将围绕C#开发智能门禁系统的项目...
    99+
    2023-11-02
    C# 智能门禁系统 项目经验总结
  • 突破瓶颈:Go语言项目开发的经验总结
    作为一种相对新兴的编程语言,Go语言在近年来的发展中受到了越来越多的关注。特别是在项目开发方面,Go语言有着优势,因为它比其他语言更适合开发高性能、并发、分布式的系统。但是,即使使用Go语言,也会遇到项目开发中的瓶颈和挑战,因此在本文中,我...
    99+
    2023-11-02
    Go语言 项目开发 经验总结
  • C#开发智能安防系统的项目经验总结
    随着社会的不断发展,人们对安全的关注度越来越高。而在如今这个信息时代,计算机技术与安全系统的结合也变得越来越紧密。C#是一种常用的编程语言,在安防系统的开发中也会被广泛使用。本文将围绕着C#开发智能安防系统的项目经验总结展开。一、智能安防系...
    99+
    2023-11-02
    C#开发 智能安防系统 项目经验总结
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作