zoukankan      html  css  js  c++  java
  • Java 反射机制:(十一)获取运行时类的包、注解、接口等信息

    一、获取运行时类所在包

        根据 Class 对象获取运行时类所在的包

    1     @Test
    2     public void test1(){
    3         Class clazz = Person.class;
    4 
    5         Package pack = clazz.getPackage();
    6         System.out.println(pack);
    7     }

       获取Package实例对象后,调用Package实例对象的 getName()获取包名。

    二、获取类加载器

        获取某个类的加载器:

    public ClassLoader getClassLoader():返回该类的类加载器
    

       有些实现可能使用 null 来表示引导类加载器。如果此对象表示一个基本类型或 void,则返回 null。 

    三、获取类名

    public String getName():以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
    

      Demo:

     1     @Test
     2     public void test1(){
     3         //java.lang.String
     4         System.out.println(String.class.getName());
     5         //int
     6         System.out.println(int.class.getName());
     7         //[I
     8         System.out.println(int[].class.getName());
     9         //[[[I
    10         System.out.println(int[][][].class.getName());
    11         //[Ljava.lang.Object;
    12         System.out.println(Object[].class.getName());
    13     }

        如果此类对象表示的是非数组类型的引用类型,则返回该类的二进制名称,即包.类名。

        如果此类对象表示一个基本类型或 void,则返回该基本类型或 void 所对应的 Java 语言关键字相同的字符串名。

        如果此类对象表示一个数组类,则名字的内部形式为:表示该数组嵌套深度的一个或多个'['字符加元素类型名。元素类型名的编码如下:

    Element

    Type Encoding

    byte

    B

    short

    S

    int

    I

    long

    L

    float

    F

    double

    D

    boolean

    Z

    char

    C

    class or interface

    Lclassname;

    四、获取类型修饰符

    public int getModifiers():返回此类或接口以整数编码的 Java 语言修饰符。
    

      

        修饰符由 Java 虚拟机的 public、protected、private、final、static、abstract和 interface对应的常量组成,它们应当使用 Modifier 类的方法来解码。

        如果底层类是数组类,则其public、private 和 protected 修饰符与其组件类型的修饰符相同。

        如果此 Class 表示一个基本类型或 void,则其 public 修饰符始终为 true,protected和private修饰符始终为 false。

        如果此对象表示一个数组类、一个基本类型或 void,则其 final 修饰符始终为 true、其 接口修饰符始终为 false。

        Demo:

    1     @Test
    2     public void test2(){
    3         Class<?> clazz = String.class;
    4         int mod = clazz.getModifiers();            // 返回 int 类型的常量
    5         System.out.println(Modifier.toString(mod));//public final
    6         System.out.println(Modifier.isPublic(mod));//true
    7     }

    五、获取运行时类实现的接口

    public Class<?>[] getInterfaces():确定此对象所表示的类或接口实现的接口。
    

      

        如果此对象表示一个类,则返回值是一个数组,它包含了表示该类所实现的所有接口的对象。数组中接口对象顺序与此对象所表示的类的声明与 implement 子句中接口名顺序一致。

         如果此对象表示一个接口,则该数组包含表示该接口扩展的所有接口的对象。数组中接口对象顺序与此对象所表示的接口的声明的 extends 子句中接口名顺序一致。

         如果此对象表示一个不实现任何接口的类或接口,则此方法返回一个长度为0的数组。

         如果此对象表示一个基本类型或 void ,则此方法返回一个长度为 0 的数组。

         根据 Class 对象获取运行时类实现的接口

     1     @Test
     2     public void test2(){
     3         Class clazz = Person.class;
     4 
     5         Class[] interfaces = clazz.getInterfaces();
     6         for(Class c : interfaces){
     7             System.out.println(c);
     8         }
     9 
    10         System.out.println();
    11         //获取运行时类的父类实现的接口
    12         Class[] interfaces1 = clazz.getSuperclass().getInterfaces();
    13         for(Class c : interfaces1){
    14             System.out.println(c);
    15         }
    16 
    17     }

        运行结果

        

    六、获取运行时类声明的注解

        可以通过反射 API,获得相关的注解信息。

    public Annotation[] getAnnotations() :返回此元素上存在的所有注解。
    public Annotation[] getDeclaredAnnotations():获取某元素上存在的所有注解。该方法将忽略继承的注解。
    public <T extends Annotation> T getAnnotation(Class<T> annotationClass):如果存在该元素的指定类型的注解,则返回这些注解,否则返回 null。

        根据 Class 对象获取运行时类声明的注解

    1     @Test
    2     public void test3(){
    3         Class clazz = Person.class;
    4 
    5         Annotation[] annotations = clazz.getAnnotations();
    6         for(Annotation annos : annotations){
    7             System.out.println(annos);
    8         }
    9     }

         Demo:

     1 import java.lang.annotation.Retention;
     2 import java.lang.annotation.RetentionPolicy;
     3 
     4 public class TestAnnotation {
     5     public static void main(String[] args) {
     6         Class<?> clazz = MyClass.class;
     7         MyAnnotation my = clazz.getAnnotation(MyAnnotation.class);
     8         System.out.println(my.value());
     9     }
    10 }
    11 @MyAnnotation
    12 class MyClass{
    13     
    14 }
    15 @Retention(RetentionPolicy.RUNTIME)
    16 @interface MyAnnotation{
    17     String value() default "Hello,World";
    18 }

       注意:要想通过反射获取到某个注解的信息,该注解声明时必须加@Retention(RetentionPolicy.RUNTIME)元注解,表明滞留注解信息到运行时

    七、获取内部类或外部类信息

    public Class<?>[] getClasses():返回所有公共内部类和内部接口。包括从超类继承的公共类和接口成员以及该类声明的公共类和接口成员;
    
    public Class<?> getDeclaringClass():如果此 Class 对象所表示的类或接口是一个内部类或内部接口,则返回它的外部类或外部接口,否则返回null;
    
    public Class<?>[] getDeclaredClasses():返回 Class 对象的一个数组,这些对象反映声明为此 Class 对象所表示的类的成员的所有类和接口。                        包括该类所声明的公共、保护、默认(包)访问及私有类和接口,但不包括继承的类和接口;
    

      Demo:

     1     @Test
     2     public void test5(){
     3         Class<?> clazz = Map.class;
     4         Class<?>[] inners = clazz.getDeclaredClasses();
     5         for (Class<?> inner : inners) {
     6             System.out.println(inner);
     7         }
     8         
     9         Class<?> ec = Map.Entry.class;
    10         Class<?> outer = ec.getDeclaringClass();
    11         System.out.println(outer);
    12     }

    八、

    九、

    十、

  • 相关阅读:
    Android studio测试软件——Monkey学习及运用
    MockPlus原型设计介绍
    MockPlus,一款好用的原型设计软件
    44道JavaScript难题 ---- 送命题
    使用JSONP实现跨域
    XML-RPC简单理解与博客园的MetaWeblog协议
    新型冠状病毒防控知识问答
    树莓派搭建个人服务器
    树莓派也跑Docker和.NET Core
    BugNet使用指南
  • 原文地址:https://www.cnblogs.com/niujifei/p/14891010.html
Copyright © 2011-2022 走看看