Java通过反射获取指定类型的变量(1)

关键代码:

  • Modifier.isPublic(field.getModifiers()) 判断是否是public

  • Modifier.isStatic(field.getModifiers()) 判断是否是static

  • field.getGenericType() 获取变量类型

实现代码如下:


public class MediaType {

    public static int MP3 = 0x2348;

    public static int MP4 = 0x2315;

    public static int AVI = 0x4356;

}



public class Test {



    public static void main(String[] args) {

        Map<Integer, String> fieldMap = getAllPublicStaticIntField(MediaType.class);

        for (Map.Entry<Integer, String> entry : fieldMap.entrySet()) {

            System.out.println(entry.getKey() + " : " + entry.getValue());

        }

    }



    public static Map<Integer, String> getAllPublicStaticIntField(Class<?> clazz) {

        Map<Integer, String> fieldsMap = new HashMap<>();

        try {

            Field[] fields = clazz.getFields();

            for (Field field : fields) {

                int modifiers = field.getModifiers();

                boolean isPublic = Modifier.isPublic(modifiers);

                boolean isStatic = Modifier.isStatic(modifiers);

                boolean isInt = field.getGenericType() == int.class;

                if (isPublic && isStatic && isInt) {

                    fieldsMap.put((Integer) field.get(null), field.getName());

                }

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

        return fieldsMap;

    }



}



输出结果如下:


8981 : MP4

17238 : AVI

9032 : MP3



OK,三个静态变量都拿到了,当我们得到一个type值为8981,我们不用自己去代码中对比它是哪个类型的值了,直接用代码打印出来即可,如下:


public static void main(String[] args) {

    int type = 8981;

    String fieldName = getAllPublicStaticIntField(MediaType.class).get(type);

    System.out.println(type + " is " + fieldName);

}



输出如下:


8981 is MP4



注:我发现一个Bug,当我把变量的值设置为0时,则只能获取到一个变量,示例如下:


public class MediaType {

    public static int MP3 = 0;

    public static int MP4 = 0;

    public static int AVI = 0;

}



public class Test {



    public static void main(String[] args) {

        Map<Integer, String> fieldMap = getAllPublicStaticIntField(MediaType.class);

        for (Map.Entry<Integer, String> entry : fieldMap.entrySet()) {

            System.out.println(entry.getKey() + " : " + entry.getValue());

        }

    }



    public static Map<Integer, String> getAllPublicStaticIntField(Class<?> clazz) {

        Map<Integer, String> fieldsMap = new HashMap<>();

        ...

        return fieldsMap;

    }



}



最后总结

搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析

最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化

image

rn fieldsMap;

}

}




# 最后总结

搞定算法,面试字节再不怕,有需要文章中分享的这些**二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析**

最后再分享一份**终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化**

[外链图片转存中...(img-7O4OLzmj-1714394573484)]



> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值