iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java技巧:反射判断field类型的操作
  • 146
分享到

java技巧:反射判断field类型的操作

2024-04-02 19:04:59 146人浏览 安东尼

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

摘要

JAVA 反射机制中,Field的getModifiers()方法返回int类型值表示该字段的修饰符。 其中,该修饰符是java.lang.reflect.Modifier的静态属性

JAVA 反射机制中,Field的getModifiers()方法返回int类型值表示该字段的修饰符。

其中,该修饰符是java.lang.reflect.Modifier的静态属性。

对应表如下:


//判断是不是private类型方法
public static boolean is Private(int modifiers){
    retrurn ((modifiers & 0x2)!=0);
}

分析一下,&是按位与操作符,0x2是十六进制,二进制是10,所以只有private类型按位与不为0.

补充:java反射获取类的类名、属性名、属性类型、方法、执行方法、构造函数


public class Demo02 {
    @SuppressWarnings("all")
    public static void main(String[] args) throws Exception {
        // 另一个com.sg.myReflection.bean包下的User类
        String path = "com.sg.myReflection.bean.User";
        try {
            Class clazz = Class.forName(path);
            // 获取类名
            String strName01 = clazz.getName();// 获取完整类名com.sg.myReflection.bean.User
            String strName02 = clazz.getSimpleName();// 直接获取类名 User
            // 获取属性
            Field[] field01 = clazz.getFields(); // 返回属性为public的字段
            Field[] field02 = clazz.getDeclaredFields(); // 返回所有的属性
            Field field03 = clazz.getDeclaredField("id"); // 获取属性为id的字段
            // 获取普通方法
            Method[] Method01 = clazz.getDeclaredMethods(); // 返回public方法
            Method method = clazz.getDeclaredMethod("getId", null); // 返回getId这个方法,如果没有参数,就默认为null
            // 获取构造方法
            User u1 = (User) clazz.newInstance(); // 获取无参的构造函数这里的前提的保证类中应该有无参的构造函数
            // 获取参数为(int,String,int)的构造函数
            Constructor c2 = clazz.getDeclaredConstructor(int.class, String.class, int.class);
            // 通过有参构造函数创建对象
            User u2 = (User) c2.newInstance(1001, "小小", 18);
            // 通过反射调用普通方法
            User u3 = (User) clazz.newInstance();
            Method method03 = clazz.getDeclaredMethod("setId", int.class);
            method.invoke(u3, 1002); // 把对象u3的id设置为1002
            // 通过反射操作普通的属性
            User u4 = (User) clazz.newInstance();
            Field f = clazz.getDeclaredField("name");
            f.setAccessible(true); // 设置属性可以直接的进行访问
            f.set(u4, "石头");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

public static void getObjectValue(Object object) throws Exception {
        //我们项目的所有实体类都继承BaseDomain (所有实体基类:该类只是串行化一下)
        //不需要的自己去掉即可
        if (object != null && object instanceof BaseDomain) {//if (object!=null )  ----begin
            // 拿到该类
            Class<?> clz = object.getClass();
            // 获取实体类的所有属性,返回Field数组
            Field[] fields = clz.getDeclaredFields();
            for (Field field : fields) {// --for() begin
                System.out.println(field.getGenericType());//打印该类的所有属性类型
                // 如果类型是String
                if (field.getGenericType().toString().equals(
                        "class java.lang.String")) { // 如果type是类类型,则前面包含"class ",后面跟类名
                    // 拿到该属性的gettet方法
                    
                    Method m = (Method) object.getClass().getMethod(
                            "get" + getMethodName(field.getName()));
                    String val = (String) m.invoke(object);// 调用getter方法获取属性值
                    if (val != null) {
                        System.out.println("String type:" + val);
                    }
                }
                // 如果类型是Integer
                if (field.getGenericType().toString().equals(
                        "class java.lang.Integer")) {
                    Method m = (Method) object.getClass().getMethod(
                            "get" + getMethodName(field.getName()));
                    Integer val = (Integer) m.invoke(object);
                    if (val != null) {
                        System.out.println("Integer type:" + val);
                    }
                }
                // 如果类型是Double
                if (field.getGenericType().toString().equals(
                        "class java.lang.Double")) {
                    Method m = (Method) object.getClass().getMethod(
                            "get" + getMethodName(field.getName()));
                    Double val = (Double) m.invoke(object);
                    if (val != null) {
                        System.out.println("Double type:" + val);
                    }
                }
                // 如果类型是Boolean 是封装类
                if (field.getGenericType().toString().equals(
                        "class java.lang.Boolean")) {
                    Method m = (Method) object.getClass().getMethod(
                            field.getName());
                    Boolean val = (Boolean) m.invoke(object);
                    if (val != null) {
                        System.out.println("Boolean type:" + val);
                    }
                }
                // 如果类型是boolean 基本数据类型不一样 这里有点说名如果定义名是 isXXX的 那就全都是isXXX的
                // 反射找不到getter的具体名
                if (field.getGenericType().toString().equals("boolean")) {
                    Method m = (Method) object.getClass().getMethod(
                            field.getName());
                    Boolean val = (Boolean) m.invoke(object);
                    if (val != null) {
                        System.out.println("boolean type:" + val);
                    }
                }
                // 如果类型是Date
                if (field.getGenericType().toString().equals(
                        "class java.util.Date")) {
                    Method m = (Method) object.getClass().getMethod(
                            "get" + getMethodName(field.getName()));
                    Date val = (Date) m.invoke(object);
                    if (val != null) {
                        System.out.println("Date type:" + val);
                    }
                }
                // 如果类型是Short
                if (field.getGenericType().toString().equals(
                        "class java.lang.Short")) {
                    Method m = (Method) object.getClass().getMethod(
                            "get" + getMethodName(field.getName()));
                    Short val = (Short) m.invoke(object);
                    if (val != null) {
                        System.out.println("Short type:" + val);
                    }
                }
                // 如果还需要其他的类型请自己做扩展
            }//for() --end
        }//if (object!=null )  ----end
    }
    // 把一个字符串的第一个字母大写、效率是最高的、
    private static String getMethodName(String fildeName) throws Exception{
        byte[] items = fildeName.getBytes();
        items[0] = (byte) ((char) items[0] - 'a' + 'A');
        return new String(items);
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: java技巧:反射判断field类型的操作

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

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

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

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

下载Word文档
猜你喜欢
  • java技巧:反射判断field类型的操作
    JAVA 反射机制中,Field的getModifiers()方法返回int类型值表示该字段的修饰符。 其中,该修饰符是java.lang.reflect.Modifier的静态属性...
    99+
    2024-04-02
  • Java反射 Field类的使用全方位解析
    Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。 Field 成员变量的介绍 每个成员变量有类型和值。 java....
    99+
    2024-04-02
  • java反射获取包下所有类的操作
    我就废话不多说了,大家还是直接看代码吧~ public static void main(String[] args) { try { ...
    99+
    2024-04-02
  • 隐式类型的类型反射如何工作?
    问题内容 据我了解,go 是静态类型的,通常不进行隐式类型转换。因此,没有显式类型声明的常量是根据首次使用时的要求而定的。 因此,在下面的代码片段中,我希望 n 是 float64,因...
    99+
    2024-02-06
    隐式类型转换
  • java Stream流常见操作方法(反射,类加载器,类加载,反射)
    目录Stream流常见的中间操作方法Stream流中常见的终结操作方法反射类加载器反射概述Stream流常见的中间操作方法 Streamfilter(Predicate predic...
    99+
    2024-04-02
  • java反射之方法反射的基本操作方法
    本文接上文“java反射之获取类的信息方法(推荐)”,利用反射(invoke)来获取一个类中的方法来执行。1、定义一个类,包含三个名称相同,参数不同的方法class A{ public void print(){ System.ou...
    99+
    2023-05-31
    java 反射 方法
  • Java 反射类型Type的用法说明
    各个方法 1. 得到class的成员变量 首先得到object的class对象 然后在class对象中用getDeclaredFields()方法来获得class的成员变量 Fi...
    99+
    2024-04-02
  • Java对象类型的判断详解
    在Java中,可以使用`instanceof`运算符来判断一个对象的类型。`instanceof`运算符用于检查一个对象是否是一个特...
    99+
    2023-08-15
    Java
  • Elasticsearch的删除映射类型操作示例
    目录一 前言二 什么是映射类型?三 为什么要删除映射类型?四 映射类型的替代方法4.1 将映射类型分开存储在索引中4.2 自定义类型字段回到顶部五 没有映射类型的父/子六 删除映射类...
    99+
    2024-04-02
  • Elasticsearch的删除映射类型怎么操作
    这篇文章主要讲解了“Elasticsearch的删除映射类型怎么操作”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Elasticsearch的删除映射类型怎么操作”吧!一 前言在elasti...
    99+
    2023-06-30
  • java判断文件类型的方法是什么
    Java可以通过以下方法来判断文件的类型:1. 使用java.nio.file.Files类的probeContentType()方...
    99+
    2023-10-09
    java
  • Java 如何判断Integer类型的值是否相等
    目录判断Integer类型的值是否相等Integer赋值比较赋值操作构造函数判断Integer类型的值是否相等 我们知道Integer是int的包装类,在jdk1.5以上,可以实现自...
    99+
    2024-04-02
  • Golang函数的反射和类型断言的应用和底层实现
    Golang函数的反射和类型断言的应用和底层实现在Golang编程中,函数的反射和类型断言是两个非常重要的概念。函数的反射可以让我们在运行时动态的调用函数,而类型断言则可以帮助我们在处理接口类型时进行类型转换操作。本文将深入讨论这两个概念的...
    99+
    2023-05-16
    反射 Golang函数 类型断言
  • Java中的文件操作和数据类型详解,附带二维码生成技巧。
    Java是一门广泛使用的编程语言,它被广泛应用于各种应用程序和网站的开发中。在Java中,文件操作和数据类型是非常重要的概念。在这篇文章中,我们将详细讨论Java中的文件操作和数据类型,并介绍如何使用Java生成二维码。 文件操作 在Jav...
    99+
    2023-08-15
    文件 数据类型 二维码
  • SpringBoot调用第三方WebService接口的操作技巧(.wsdl与.asmx类型)
    SpringBoot调webservice接口,一般都会给你url如: http://10.189.200.170:9201/wharfWebService/services/Wha...
    99+
    2024-04-02
  • Java字符串操作的技巧有哪些
    本篇内容介绍了“Java字符串操作的技巧有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!01、如何在字符串中获取不同的字符及其数量?这道...
    99+
    2023-06-27
  • 使用Java反射模拟实现Spring的IoC容器的操作
    目录实现的功能:项目结构下面是程序的项目结构图:自定义注解容器实现测试实体类User的定义:实现的功能: 默认情况下将扫描整个项目的文件 可以使用@Componen...
    99+
    2024-04-02
  • 文件的真实类型如何利用java进行判断
    文件的真实类型如何利用java进行判断?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。具体代码如下:package com.zhuifeng.util.excel...
    99+
    2023-05-31
    java ava
  • 如何用java反射技术将sql操作与面向对象编程关联起来
    这篇“如何用java反射技术将sql操作与面向对象编程关联起来”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何用java反...
    99+
    2023-06-30
  • Java 开发者必须学会的 Linux 操作技巧?
    作为一名 Java 开发者,Linux 操作系统对我们来说是非常重要的,因为我们需要通过 Linux 系统来进行代码的编译、部署和运行等操作。所以,学会 Linux 的基本操作技巧是非常必要的。在本文中,我们将介绍 Java 开发者必须学...
    99+
    2023-06-17
    开发技术 linux apache
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作