zoukankan      html  css  js  c++  java
  • Java的注解与反射

    注解·反射

    注解

    - 标准注解
    • @Override:
    • @Deprecated:对不应该再使用的方法添加注释
    • @SuppressWarnings:关闭特定的警告信息
    - 元注解
    **@Retention**:标识需要在什么级别保存注释信息
    
    SOURCE:在源文件中有效(即源文件保留)
    CLASS:在 class 文件中有效(即 class 保留)
    RUNTIME:在运行时有效(即运行时保留)
    

    @Target 修饰的对象范围
    @Documented 将注释包含在JavaDoc中
    @Inherited 允许子类继承父类的注解

    反射

    1. 反射机制概念:
    在 Java 中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;
    并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方
    法的功能成为 Java 语言的反射机制。
    
    2. Java反射API
    • Class 类:反射的核心类,可以获取类的属性,方法等信息
    • Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性值
    • Method 类: Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。
    • Constructor 类: Java.lang.reflec 包中的类,表示类的构造方法
    3. 反射使用步骤(获取 Class 对象、调用对象方法)
    • 获取想要操作的类的 Class 对象,他是反射的核心,通过 Class 对象我们可以任意调用类的方法
    • 调用 Class 类中的方法,既就是反射的使用阶段。
    • 使用反射 API 来操作这些信息。
    4. 获取 Class 对象的 3 种方法

    调用某个对象的 getClass()方法

    Person p=new Person();
    Class clazz=p.getClass();
    

    调用某个类的 class 属性来获取该类对应的 Class 对象

    Class clazz=Person.class;
    

    使用 Class 类中的 forName()静态方法(最安全/性能最好)

    Class clazz=Class.forName("类的全路径"); (最常用)
    

    当我们获得了想要操作的类的 Class 对象后,可以通过 Class 类中的方法获取并查看该类中的方法和属性。

    //获取 Person 类的 Class 对象
     Class clazz=Class.forName("reflection.Person");
    //获取 Person 类的所有方法信息
     Method[] method=clazz.getDeclaredMethods();
     for(Method m:method){
     System.out.println(m.toString());
     }
     //获取 Person 类的所有成员属性信息
     Field[] field=clazz.getDeclaredFields();
     for(Field f:field){
     System.out.println(f.toString());
     }
     //获取 Person 类的所有构造方法信息
     Constructor[] constructor=clazz.getDeclaredConstructors();
     for(Constructor c:constructor){
     System.out.println(c.toString());
    
    通过反射创建对象
    1. 使用 Class 对象的 newInstance()方法来创建该 Class 对象对应类的实例,但是这种方法要求该 Class 对象对应的类有默认的空构造器。
      调用 Constructor 对象的 newInstance()
    2. 先使用 Class 对象获取指定的 Constructor 对象,再调用 Constructor 对象的 newInstance()
      方法来创建 Class 对象对应类的实例,通过这种方法可以选定构造方法创建实例。
    //获取 Person 类的 Class 对象
     Class clazz=Class.forName("reflection.Person"); 
     //使用.newInstane 方法创建对象
     Person p=(Person) clazz.newInstance();
    //获取构造方法并创建对象
     Constructor c=clazz.getDeclaredConstructor(String.class,String.class,int.class);
     //创建对象并设置属性
    Person p1=(Person) c.newInstance("李四","男",20);
    
  • 相关阅读:
    LeetCode "Sum Root to Leaf Numbers"
    LeetCode "Single Number"
    POJ #1033
    POJ #1011
    POJ #2411
    POJ #1276
    POJ #1260
    POJ #1221
    POJ #1080
    POJ #1050
  • 原文地址:https://www.cnblogs.com/cxxxxxx/p/13541920.html
Copyright © 2011-2022 走看看