• 第十六章 反射与注解


     

    所有 Java 类均继承了 bjet 类,在 Object 类中定义了一个 getClass0方法,该回一个类型为Class的对象。例如下面的代码:

    JTextField textField = new JTextField();//创建JTextField对象
    Class textFieldC = textField.getClass();//获取Class对象
    利用Class类的对象textFieldC,可以访问用来返回该对象的 textField 对象的描述信息。可的主要描述信息如表16.1所示。

    16.1.1访问构造方法
    在通过下列一组方法访问构造方法时,将返回Constructor类型的对象或数组。每个Constructor对象代表一个构造方法,利用Constructor 对象可以操纵相应的构造方法:

    1,getConstructors0)
    2,getConstructor(Class...parameterTypes)

    3,getDeclaredConstructors0)

    4,getDeclaredConstructor(Class...parameterTypes)。

    如果是访问指定的构造方法,需要根据该构造方法的入口参数的类型来访问。例如,访问一个入口参数类型依次为 String 型和 nt 型的构造方法,通过下面两种方式均可实现:

    objectClass.getDeclaredConstructor(String.class, int.class);
    objectClass.getDeclaredConstructor(new Classl[] {String.class, int.clas };

     

    例如,判断对象constructor 所代表的构造方法是否被 private 修饰,以及以字符形式获的该构造方
    法的所有修饰符的典型代码如下:

    int modifiers = constructor.getModifiers();
    boolean isEmbellishByPrivate = Modifier.isPrivate(modifiers);
    String embellishment = Modifier.toString(modifiers):
    [例16.1]反射一个类的所有构造方法

    ConstructorDemol,在该类中通过反射访间 com.mrDemol 类中的所有构造方法造构造方法是否允许带有可变数量的参数、入口参数类型和可能抛出的异常类型信息输出到控制台:

    1. import java.lang.reflect.Constructor;
    2. import com.mr.Demo1;
    3. public class ConstructorDemo1 {
    4. public static void main(String[] args) {
    5. Demo1 d1= new Demo1("10","20","30");
    6. Class<? extends Demo1> Demo1Class = d1.getClass();
    7. //获得所有构造方法
    8. Constructor[] declaredConstructors =
    9. Demo1Class.getDeclaredConstructors();
    10. for (int i= 0; i < declaredConstructors.length; i++){//遍历构造方法
    11. Constructor<?> constructor = declaredConstructors[i];
    12. System.out.println("查看是否允许带有可变数量的参数:" +constructor.isVarArgs());
    13. Class[] parameterTypes = constructor.getParameterTypes(); //获取所有参数类型
    14. for (int j= 0; j< parameterTypes.length; j++) {
    15. System.out.println(""+ parameterTypes);}
    16. System.out.println("该构造方法可能抛出的异常类型为:");
    17. //获得所有可能抛出的异常信息类型
    18. Class[] exceptionTypes = constructor.getExceptionTypes();
    19. for (int j = 0; j< exceptionTypes.length; j++) {
    20. System.out.println(""+ exceptionTypes[i]);
    21. }
    22. Demo1 d2 = null;
    23. while(d2 == null) {
    24. try{//如果构造方法的访问权限为 private或 protected,则抛出异常,即不允许访问
    25. if(i==2)//通过执行默认没有参数的构造方法创建对象
    26. d2 =(Demo1) constructor.newInstance();
    27. else if(i==1)
    28. //请过执行具有两个参数的构造方法创建对象
    29. d2 =(Demo1)constructor.newInstance("7",5);
    30. else {//通过执行具有可交数最参数的构造方法创建对象
    31. Object[] parameters = new Object[] {new String[] {"100","200","300"}};
    32. d2 =(Demo1) constructor.newInstance(parameters);
    33. }
    34. }catch(Exception e) {
    35. System.out.println("在创建对象时抛出异常,下面执行setAccessible()方法");
    36. constructor.setAccessible(true);
    37. }
    38. }
    39. if(d2 != null) {
    40. d2.print();
    41. System.out.println();
    42. }
    43. }
    44. }
    45. }

    16.1.2 访间成员变量
    通过下列一想方法访问成员变量时,将返回Field类型的对象或数组,每个Field 对象代表一个成员变量:

    getFields0)
    getField(String name)
    getDeclaredFields().
    getDeclaredFicld(String name)
    如果是访问指定的成员变,可以通过该成员变量的名称来访问。例如,访问一个名称为brithday访问方法如下

    object. getDeclaredField("birthday");

     [例16.2]反射一个类的所有成员变量

    16.2Annotation注解功能

    @override  限定重写父类方法

    @suppresswarnings   抑制编译器警告 

    @deprecated   标示已过时 

    16.4创建自定义的注解

     

     

    16.2.2访问Annotation 信息

     

     

     

  • 相关阅读:
    SpringBoot三层架构
    mysql数据库
    C++笔记之通用多态函数包装器std::function
    C#A类调用B类的方法,在方法中更新B类的控件
    Python:实现reverse letters反向字母算法(附完整源码)
    C++学习笔记(二十二)
    CSS Id和Class选择器
    apktool反编译及后续打包
    Linux如何使用Nginx部署前端项目
    oninput和onchange事件有什么区别以及使用场景
  • 原文地址:https://blog.csdn.net/m0_74240127/article/details/134086603