美文网首页
Java反射

Java反射

作者: 科技码 | 来源:发表于2017-12-29 15:10 被阅读0次
public class MyTest  {  
  
    public int a;  
  
    public static int b;  
  
    public static final int c = 0;  
  
    private int d;  
  
} 

1. 修饰符

public static void main(String[]args) {  
  
       Class<?> clazz = MyTest.class;  
  
       Field[] fields = clazz.getDeclaredFields();  
  
       for(Field field : fields)   {  
  
           System.out.print(field.getName() +"->");  
  
           System.out.println(field.getModifiers());  
  
       }  
  
    }  

输出:

a->1
b->9
c->25
d->2

  • 通过返回的int类型的值,还是很难判断这些变量有哪些修饰符。

    在这里,需要用到java.lang.reflect.Modifier这个类。Modifier提供了很多静态方法。如public static String toString(int mod)就可以输出该整数对应的所有的修饰符。public static boolean isPublic(int mod)就可以判断该整数对应的是不是包含public修饰符。

public static void main(String[] args) {  
  
       Class<?> clazz = MyTest.class;  
  
       Field[] fields = clazz.getDeclaredFields();  
  
       for(Field field : fields)   {  
  
           System.out.print(field.getName() +"->");  
  
           System.out.println(Modifier.toString(field.getModifiers()));  

       }  
  
    }  

输出:

a->public
b->public static
c->public static final
d->private

通过Modifier的isPublicisPrivateisStatic等方法,可以判断是否包含某些修饰符,现在如果有这么一个需求,我需要找到仅有public static两个修饰符的变量。

现在看下Modifier的源码,可以看到以下代码:
public static final int PUBLIC           = 0x00000001;  
  
public static final int PRIVATE          =0x00000002;  
  
public static final int PROTECTED        = 0x00000004;  
  
public static final int STATIC           =0x00000008;  
  
public static final int FINAL            =0x00000010;  
  
public static final int SYNCHRONIZED     = 0x00000020;  
··· native transient volatile synchronized final static protected private public
0 0 0 0 0 0 1 0 0 1

把它们转换成二进制,可以看出,Modifier使用一个二进制的位来表示是否包含某个修饰符。
如果是public static,对应的整数就是二进制的:1001,也就是9。如下图:

··· native transient volatile synchronized final static protected private public
0 0 0 0 0 0 1 0 0 1

如果是public static final就是11001,也就是25。
现在如果想判断是否仅有public static两个修饰符,那么就可以判断是否field.getModifiers() == 9。


相关文章

  • 博客地址

    java注解-01、java注解-02、Git面试资源java反射-01、java反射-02、java反射-03为...

  • Java反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • 反射之一

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • 反射之二

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • Java 反射机制

    Java 反射机制 什么是反射 Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”。 ...

  • 一探究竟:Java反射效率低的原因到底在哪?

    预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低...

  • 面试官说:大家都说 Java 反射效率低,你知道原因在哪里么

    预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低...

  • Java面试题之JavaSE高级

    一、Java中的反射 1.说说你对Java中反射的理解 java中的反射首先是能够获取到Java...

网友评论

      本文标题:Java反射

      本文链接:https://www.haomeiwen.com/subject/oqbigxtx.html