注解和反射

一、注解

英文:Annotation

1.1 注解的概念

注解也叫元数据,用来标记代码,描述数据,是有特殊意义的。

1.2 注解作用

1、Javadoc将文档注释生成api文档时,会将一些注解内容生成到Api文档中,如               @return @see @param

2、编译时进行格式检查,如@Override

3、使用注解,减少配置文件,如框架中。

4、抑制警告

1.3 四个内置注解

就是java写好的注解,直接用。

@Override:标记重写方法

@Deprecated:标记方法已过时,但是也可以用

@SuppressWarnings():抑制编译器警告,可以抑制字节结构体范围内“{ }” 的警告,如eclipse中的黄线

@SafeVarargs:抑制堆污染警告(单独警告),如可变参数和泛型同时使用情况

      

1.4 四个元注解

在定义注解时,用于注解注解的注解

@Target:被标记的注解可以注解的位置

ElementType是枚举类型,位置有:

TYPE : 类型

FIELD : 字段

METHOD : 普通方法

PARAMETER : 参数

CONSTRUCTOR : 可以标记构造方法

LOCAL_VARIABLE : 局部变量

ANNOTATION_TYPE :可以标记在注解上面

PACKAGE :包

TYPE_PARAMETER  形式参数类型

TYPE_USE      :哪里都可以标记

@Retention:被标记的注解存在的生命周期

RetentionPolicy是枚举类型,生命周期有:

SOURCE: java源码.java文件中可以存在

CLASS :编译之后的字节码文件中可以存在

RUNTIME :运行时编译成字节码了,放入到jvm中了,这个注解还在

@Documented:被标记的注解生成文档时是否生成在文档中

@Inherited:被标记的注解在类继承中是否被继承

1.5 自定义注解

在以后的实际开发中,我们基本上不会自定义注解,都是用别人定义好的。我们自 定义的注解,如果没有第三方程序(使用反射技术)的支持,是没有任何意义的。

二、反射

英文:Reflect

2.1 面向对象再次理解

Java语言设计时,就是想将生活中的对象与对象之间的关系在计算机中体现,万事万物皆对象,而对象又可以分类即是类,类是描述对象的一个抽象模板,在编程时我们主要目的就是为了操作数据即是操作对象,数据类型即描述对象的就是类。

2.2 反射的概念

Java提供的一项技术,在运行时期动态的获得一个类的属性,方法,构造方法等,并且也可以修改这些东西(私有的也能获得)。Class类就是描述类的类型,一个类只有一个类类型。

2.3 获取字节码对象

对象.getClass();

类名.Class;

Class.forName(“类的全限定名”);

2.4 各种数据类型获得字节码对象

基本数据类型

引用数据类型

接口

枚举

数组

void

注意:1、基本数据类型的字节码对象也可以通过包装类型.TYPE获取

2、void的字节码也可以通过Void. TYPE获取

2.5 获得构造器

Constructor<T> getConstructor(Class<?>... parameterTypes) :获得指定公共构造器

Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) :获得构造器(可是私有)

Constructor<?>[] getConstructors() :获得所有公共构造器

Constructor<?>[] getDeclaredConstructors() :获得所有构造器(包括私有)

2.6使用构造器创建对象

  

2.7使用反射技术写注解描述注入对象

  思路:通过反射获取到字段和注解,通过注解值获取注入对象,将对象设置在字段中。

原文地址:https://www.cnblogs.com/zwcnblog/p/9998616.html

时间: 2024-11-10 10:30:11

注解和反射的相关文章

Java高级之注解、反射

Java的注解.反射等机制的产生,让动态代理成为可能,一般通过全限定名+类名,找到类,可以invoke它的构造方法以及其他方法,可以获取它的参数(Field)名称和值. 注解一般用在代码的注释上.代码审查上(有没有按标准写,比如inspect).代码注入(hook,asbectj),需要考虑的是,在何时注入(编译期还运行期) 反射一般用在动态将json和Object互相转化,执行相关底层代码,比如设置某个类的Accessible为false,防止别人hook修改 例:阿里的FastJson解析:

利用注解和反射将map转化成bean

一.java注解 java注解相关的类放在 java.lang.annotation 包下,其主要内容包含4个元注解和其中两个元注解的枚举类值,相对比较简单,从jdk问答即可了解 4个元注解: Documented:指示某一类型的注释将通过 javadoc 和类似的默认工具进行文档化.应使用此类型来注释这些类型的声明:其注释会影响由其客户端注释的元素的使用.如果类型声明是用 Documented 来注释的,则其注释将成为注释元素的公共 API 的一部分. Inherited:指示注释类型被自动继

理解Android中的注解与反射

前言 最近一段时间在研究EventBus和Retrofit 的过程中,都遇到了注解这个概念.由于在学习Java的时候对这方面没有深入了解过,所以看起相关的代码来,总会有点不知其所以然,这里就注解和反射的使用做一下总结. 这里我们先从反射说起,了解了反射的意义及用法后,我们在看看注解的使用,最后叙述一下在Android开发中是怎样结合使用注解与反射. 反射 Java反射(Reflection)定义 Java反射机制是指在运行状态中 对于任意一个类,都能知道这个类的所有属性和方法: 对于任何一个对象

java自定义注解与反射

java注解与反射一.Java中提供了四种元注解,专门负责注解其他的注解,分别如下 1.@Retention元注解,表示需要在什么级别保存该注释信息(生命周期).可选的RetentionPoicy参数包括: RetentionPolicy.SOURCE: 停留在java源文件,编译器被丢掉 RetentionPolicy.CLASS:停留在class文件中,但会被VM丢弃(默认) RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注

[杂记]自定义注解以及反射的应用

序:对于注解的认知是从spring开始的,不管是aop还是ioc,对于其概念是比较清楚的,但真正的实现却没有一个比较好的认知,前段时间看了下<从零开始写web框架>,但当时看的比较仓促,再说因为时间的原因,并没有细揪很多东西,这两天研究了下公司一个系统的代码,突然间对于这块有了比较好的理解,故做潦草记录. 项目使用自定义注解和反射主要是为了在webSocket请求发过来的时候,通过请求中的参数定位到类和方法,然后去执行具体的业务逻辑,具体整个流程如下. 1.自定义注解 @Target(Elem

java注解和反射的结合使用

首先反射注解,那么保留策略必须是Runtime,也就是@Retention(RetentionPolicy.RUNTIME) ①定义一个注解类 @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) public @interface MyAnnotation { int value(); } ②在定义一个类使用注解类 public class MyBean { @MyAnnotation(20) private int

java注解和反射制作dao基类的练习

首先是三个注解 主键注解 package comments; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lan

注解与反射 ---Spring与Mybatis等框架的实现原理

Java中各大框架,无论是AOP 还是 IoC 其基本实现思路都是源自Java 运行时支撑的反射功能, 而反射最基本的一点就是 任何一个类 其在JVM环境中,都有一个对象的Class对象,这个对象提供一些方面描述了类的 方法 构造函数 注解 等等等 下面就是一个反射跟注解的小例子,是一个比较好入门的小demo 理解之后,几乎所有的框架都是依照这个思路来实现的 package pw.jonwinters.annotation; import java.lang.annotation.Documen

使用自定义注解和反射 ,自动生成查询语句

1.自定义表名注解 package com.lf.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //自定义表名注解 @Target(ElementType.TYPE) @Retention(Reten