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:表示允许子类继承父类中的注解。

      参考博文

猜你喜欢

转载自www.cnblogs.com/memo-song/p/9021680.html