反射和注解

一.反射

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

      参考博文

转载于:https://www.cnblogs.com/memo-song/p/9021680.html

java_day21_反射和注解相关推荐

  1. 学习Kotlin(七)反射和注解

    推荐阅读: 学习Kotlin(一)为什么使用Kotlin 学习Kotlin(二)基本语法 学习Kotlin(三)类和接口 学习Kotlin(四)对象与泛型 学习Kotlin(五)函数与Lambda表达 ...

  2. 使用基于注解的mybatis时,利用反射和注解生成sql语句

    在开发时遇到一个问题,在使用基于注解的mybatis插入一个对象到mysql时,在写sql语句时需要列出对象的所有属性,所以在插入一个拥有10个以上属性的对象时sql语句就会变得很长,写起来也很不方便 ...

  3. java注解的反射_Java注解与反射

    概要 本文主要是总结Java注解与反射的相关知识,加深自己对Java类动态语言的理解,同时为日后学习Spring打下基础. 注解: 什么是注解 Annotation的作用 不是程序本身,但是可以对程序 ...

  4. junit单元测试,反射,注解

    今日内容 1. Junit单元测试 2. 反射 3. 注解 Junit单元测试: * 测试分类:1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值.2. 白盒测试:需要写代码的.关注程 ...

  5. java 注解与反射_Java注解与反射直接上手

    什么是注解(Annotation) 注解顾名思义为注释.讲解,可以理解为一种标签或标记,可以用在类.方法或者域上.向类.方法等添加注解,相当于给他们贴上了一层标签. 注解使用 在使用注解时,在类名.方 ...

  6. Java 使用反射处理注解

    Java 使用反射处理注解 自定义注解的格式: [public|final] @interface 注解名//@interface 表明:这是一个自定义注解 {注解元素//注解元素 是无参数的方法 } ...

  7. 【JAVA SE】第十七章 反射、注解与Spring事务底层原理

    第十七章 反射.注解与Spring事务底层原理 文章目录 第十七章 反射.注解与Spring事务底层原理 一.反射 1.简介 2.意义 3.缺点 4.应用场景 5.反射技术的使用 二.注解 1.概念 ...

  8. Java基础13:反射与注解详解

    Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...

  9. 通过源码理解反射与注解是什么东西?

    反射+注解(Java):练习(Java) 1.通过反射获得注解 2.获得注解value的值 3.获得注解value的值 代码示例: package reflect;import java.lang.a ...

最新文章

  1. 「BZOJ 2342」「SHOI 2011」双倍回文「Manacher」
  2. spring18-1:采用jdk的动态代理 proxy。
  3. 第七章 控制PL/SQL错误
  4. Codeforces 508E Arthur and Brackets 区间dp
  5. sublime编写python路径报错怎么改_sublime开发Python的编码问题
  6. oracle 数据库运维技术,Oracle数据库智能运维标准化工艺研究-orastar-DIY数据库运维工具-第1期 导论篇...
  7. Android Loader 异步加载详解二:探寻Loader内部机制
  8. Redis 未授权访问缺陷可轻易导致系统被黑
  9. 他让全世界凶手睡不着觉,现实版福尔摩斯,退休了4次又被拽回来工作,无敌实在是太寂寞了~...
  10. Docker上部署WebERP系统,开源ERP框架
  11. 设计模式--请参阅本质
  12. HDU 4607 Park Visit(树的直径)
  13. 机器学习和传统编程有什么区别?✅
  14. NP、OSPF路由聚合
  15. Office2007 三合一绿色精简版
  16. java编程 编写求解九宫格_java编程-九宫格问题
  17. screen.colorDepth(色彩深度) 和 screen.pixelDepth(像素深度)
  18. Oracle 错误疑难解决方案和总结
  19. 西游记中唐僧禅心坚定不好女色
  20. SSM框架学习(2)CRM项目软件开发周期

热门文章

  1. 如何得到通过GetOpenFileName选择的多个文件的文件名
  2. C语言 递归实现分解质因数
  3. java 使用servlet做学生管理系统(无框架)
  4. 爬虫:通过滑动或者点触验证码的方法及实现(点触+滑动)
  5. Python 操作 Excel,总有一个模块适合自己
  6. WH-G405tf连接公网服务器进行透传
  7. 数组去重是面试中经常问到的问题
  8. 自己写的一个复杂查询
  9. pig 的chararry类型不能用比较运算符comparison operator
  10. ECMA262 Edition5 Object,Object的属性和方法,Object.prototype的方法.