zoukankan      html  css  js  c++  java
  • java_day21_反射和注解

    反射和注解

    一.反射

      反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。程序中一般的对象的类型都是在编译期就确定下来的,而Java反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。
     反射的核心是JVM在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。

      参考博文 

    Java反射框架主要提供以下功能:      参考知乎

    • 1.在运行时判断任意一个对象所属的类;
    • 2.在运行时构造任意一个类的对象;
    • 3.在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);
    • 4.在运行时调用任意一个对象的方法

      (一)、得到构造器的方法-Constructor

    1. onstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数
    2. Constructor[] getConstructors() -- 获得类的所有公共构造函数
    3. Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)
    4. Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关)

      (二).获得字段信息的方法-Field

    1. Field getField(String name) -- 获得命名的公共字段
    2. Field[] getFields() -- 获得类的所有公共字段
    3. Field getDeclaredField(String name) -- 获得类声明的命名的字段
    4. Field[] getDeclaredFields() -- 获得类声明的所有字段

      (三).得方法信息的方法-Method

    1. Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法
    2. Method[] getMethods() -- 获得类的所有公共方法
    3. Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型,获得类声明的命名的方法
    4. Method[] getDeclaredMethods() -- 获得类声明的所有方法

      (四).获取Class(类类型)的三种方式

        1.根据类的对象获取

          Person person = new Person ( );

          Class clazz = person.getClass ( );

        2.根据类获取

          Class clazz = Person.class;

        3.通过类名获取

          Class clazz = Class.forName("com.lanou3g.code0510.reflection.Person")

       (五).通过反射调用方法的代码:

          Person person = new Person ( );//创建person类的对象

          person.setName("张三");//设置属性值

          person.setAge(19);//设置属性值

          Class clazz = Person.Class;//创建Class对象

          //通过类的方法名获得该方法

          Method showMethod = clazz.getDeclaredMethod ("show");

          showMethod.setAccessible (true);//让这个类的方法可以被访问

          showMethod.invoke(Person);//调用这个方法

          

    二.注解

      它提供了一种结构化的,并且具有类型检查能力的新途径,从而使得程序员能够为代码加入元数据,而不会导致代码杂乱且难以阅读。

      1.基本格式:public @interface 注解名 {定义体}

      2.四个元注解,用于修饰注解的注解

       1).@Target:表示该注解可以用于什么地方。
        取值(ElementType)包括:
        CONSTRUCTOR:用于描述构造器
        FIELD:用于描述域
        LOCAL_VARIABLE:用于描述局部变量
        METHOD:用于描述方法
        PACKAGE:用于描述包
        PARAMETER:用于描述参数
        TYPE:用于描述类、接口(包括注解类型) 或enum声明

       2).@Retention:表示需要在什么级别保存该注解信息。

        取值(RetentionPolicy)包括:
        SOURCE:在源文件中有效(即源文件保留)
        CLASS:在class文件中有效(即class保留)
        RUNTIME:在运行时有效(即运行时保留),因此可以通过反射机制读取注解的信息。

       3).@Documented:表示将此注解包含在javadoc中。

       4).@Inherited:表示允许子类继承父类中的注解。

          参考博文

  • 相关阅读:
    [cf1038E][欧拉路]
    [最小费用最大流(板子)]
    [网络流24题]
    [ACM International Collegiate Programming Contest, Amman Collegiate Programming Contest (2018)]
    [Split The Tree][dfs序+树状数组求区间数的种数]
    [CSL 的魔法][求排序最少交换次数]
    [CSL 的字符串][栈,模拟]
    ZOJ 3949 Edge to the Root 树形DP
    第十三周 Leetcode 363. Max Sum of Rectangle No Larger Than K(HARD)
    POJ 2104 HDU 2665 主席树 解决区间第K大
  • 原文地址:https://www.cnblogs.com/memo-song/p/9021680.html
Copyright © 2011-2022 走看看