注解

  概念:说明程序的,给计算机看 
  注释:用文字描述程序

先了解一些怎么正常javadoc文档

1:给类或者方法添加doc注释

2:通过命令javadoc 执行 类.java文件

新建的类:

/**
* 注解doc演示
* @author quan
* @since jdk 1.7
* @version 1.8
*/
public class Annotation {
/**
* 计算两个数的和
* @param a 整数
* @param b 整数
* @return 两束的和
*/
public int dd(int a,int b){
return a+b;
}
}

快捷键:

在类的所在的文件夹里面

shift+右键就能在这个路径下打开命令行

执行命令

查看生成的api文件

JDK种预定义的一些注解

没加入SupperssWarning的时候:
会出现一些告警

自定义注解

格式
  public @interface 注解名称

本质: 注解的本质就是一个接口,改接口默认继承Annotation接口

PS C:\Users\quan\Desktop\date> javac .\Myannotation.java
PS C:\Users\quan\Desktop\date> javap .\MyAnnotation.class
Compiled from "Myannotation.java"
public interface MyAnnotation extends java.lang.annotation.Annotation {
}

属性:接口种可以定义的成员的方法

  要求:

  

属性的只能返回值类型:基本数据类型  String 枚举  注解  以及他们的数组

定义了属性,在使用时需要给定属性的值
如果定义属性的时候,利用default关键字给定属性初始值,则使用注解时可以不赋值
如果只有一个属性需要赋值,并且属性名称时value,则value可以升序,直接定义值即可
    数组赋值时,值使用大括号包裹,如果数组之哟一个值,大括号可以不写

枚举类:

public enum PersonE {
p1,p2,p3;
}

自定义注解:

public @interface MyAnnotation {
//抽象方法
public String show() default "ALL";
public int age();
public String[] str();
public PersonE p();
}

使用自定义注解:

    @MyAnnotation(show = "quan",age = 12,str = {"quan","zhi"},p=PersonE.p1)
public void demo(){ }

元注解

用于描述注解的注解:

Target

/*
ElementType的取值
TYPE:可以作用类上
METHOD:可以作用方法上
FIELD:可以作用与成员变量上
*/

@Target(value = {ElementType.TYPE,ElementType.FIELD})//表示该MyAnnoT注解只能作用与类上
public @interface MyAnnoT {
}

Retention

 返回值时枚举类:

/*
@Retention(RetentionPolicy.RUNTIME )当前白描述的注解,会保留到class字节码文件中国,并被JVM读取到 */
@Target(value = {ElementType.TYPE,ElementType.FIELD})//表示该MyAnnoT注解只能作用与类上
@Retention(RetentionPolicy.RUNTIME )
public @interface MyAnnoT {
}

Documented

@Documented//表示,未来会集合到javadoc文档种

Inherited

@Inherited//表示是否会被继承

@Target(value = {ElementType.TYPE,ElementType.FIELD})//表示该MyAnnoT注解只能作用与类上
@Retention(RetentionPolicy.RUNTIME )
@Documented//表示,未来会集合到javadoc文档种
@Inherited//表示是否会被继承
public @interface MyAnnoT {
}

在程序中实际应用注解,解析注解

获取注解中定义中的属性值

定义一个注解:

/**
* 描述需要执行的类名和方法名
*/ @Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Pro {
String className();
String methodName();
} /*
public class ProImpl implements Pro{
String className(){
return "annotaion.Demo1";
} String methodName(){
retun "show";
}
}

定义一个类:

package annotaion;

public class Demo1 {
public void show(){
System.out.println("demo1..show...");
}
}

定义一个使用注解的累

@Pro(className = "annotaion.Demo1",methodName = "show")
public class ReflectTest {
public static void main(String[] args) throws Exception {
/*
不能改变框架的任何代码
可以创建任意类的对象,可以执行任意方法
*/
//111解析注解:获取该类的字节码文件对象
Class<ReflectTest> reflectTestClass = ReflectTest.class;
//222获取上边的注解
//其实上面就是在内存中生成一个该注解接口子类实现对象
Pro an = reflectTestClass.getAnnotation(Pro.class);
/*
public class ProImpl implements Pro{
String className(){
return "annotaion.Demo1";
} String methodName(){
retun "show";
}
}
*/
//333调用注解对象中的抽象方法,获取放回值
String className = an.className();
String methodName = an.methodName();
//利用Class的静态方法forName,传入全类名去获取指定类的Class对象
Class cls = Class.forName(className);
System.out.println(cls);//class annotaion.Demo1
//通过Class对象的newInstance去实现无参实体类
Demo1 obj1 = (Demo1) cls.newInstance();//这里使用类的强制转换
obj1.show();
System.out.println(obj1);//annotaion.Demo1@61bbe9ba Object obj = cls.newInstance();//因为这里使用Object接受,多态。
System.out.println(obj);//annotaion.Demo1@61bbe9ba
//通过Class对象去获取类的方法
Method method = cls.getMethod(methodName);
System.out.println(method);//public void annotaion.Demo1.show()
//执行方法,指定执行的实体类
method.invoke(obj); }
}

re:

class annotaion.Demo1
demo1..show...
annotaion.Demo1@61bbe9ba
annotaion.Demo1@610455d6
public void annotaion.Demo1.show()
demo1..show...

计算器检测bug案例

需要测试下面这个计算器有没有bug

package annotationDemo;

public class Calulator {
@Check
public void add(){
String str = null;
str.toString();
System.out.println("1 + 0 = " +(1 + 0));
}
@Check
public void sub(){
System.out.println("1 - 0 = " + (1 - 0));
}
@Check
public void mul(){
System.out.println("1 * 0 = " + (1 * 0));
}
@Check
public void div(){
System.out.println("1 / 0 = " + (1 / 0));
} public void show(){
System.out.println("no bug");
}
}

定义一个注解去实现:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Check {
}

程序中利用注解:

import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; /**
* 简单测试
* 主方法执行,会制动执行被加了注解的方法,判断方法是否有异常
* 将异常记录到文件当中
*/
public class TestCheck {
public static void main(String[] args) throws IOException {
//实体类
Calulator c = new Calulator();
//2获取字节码文件对象
Class cls = c.getClass();
//3获取所有方法
Method[] methods = cls.getMethods();
int number = 0;//出现异常的次数
//异常记录数据
BufferedWriter bw = new BufferedWriter(new FileWriter("bug.txt")); //4判断方法中是否有Check注释
for (Method method : methods) {
if(method.isAnnotationPresent(Check.class)){
try {
method.invoke(c);
} catch (Exception e) {
//6捕获异常
number++;
bw.write(method.getName() + "方法出异常了");
bw.newLine();
bw.write("异常名称: " + e.getCause().getClass().getSimpleName());
bw.newLine();
bw.write("异常原因: " + e.getCause().getMessage());
bw.newLine();
bw.write("~~~~~~~~~~~~~~~~~~~~~");
bw.newLine();
//记录到文件里面
}
}
}
bw.write("一共 " + number + "个异常");
bw.flush();
bw.close();
}
}

结果生成的bug.txt

java-注解相关的更多相关文章

  1. java注解相关

    本文参考很多大神的文档,特别再次表示感谢分享!! 1.何为注解?  概念:注解(Annotation),也叫元数据.一种代码级别的说明. 它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在 ...

  2. 夯实Java基础系列15:Java注解简介和最佳实践

    Java注解简介 注解如同标签 Java 注解概述 什么是注解? 注解的用处 注解的原理 元注解 JDK里的注解 注解处理器实战 不同类型的注解 类注解 方法注解 参数注解 变量注解 Java注解相关 ...

  3. java注解基础入门

    前言 这篇博客主要是对java注解相关的知识进行入门级的讲解,包括**,核心内容主要体现在对java注解的理解以及如何使用.希望通过写这篇博客的过程中让自己对java注解有更深入的理解,在工作中可以巧 ...

  4. Java注解系统学习与实战

    背景 为什么要再次梳理一下java注解,显而易见,因为重要啊.也是为研究各大类开源框架做铺垫,只有弄清楚Java注解相关原理,才能看懂大部分框架底层的设计. 缘起 注解也叫做元数据,是JDK1.5版本 ...

  5. 19.Java 注解

    19.Java注解 1.Java内置注解----注解代码 @Deprecated                                    //不推荐使用的过时方法 @Deprecated ...

  6. java注解(Annotation)解析

    注解(Annotation)在java中应用非常广泛.它既能帮助我们在编码中减少错误,(比如最常见的Override注解),还可以帮助我们减少各种xml文件的配置,比如定义AOP切面用@AspectJ ...

  7. 框架基础——全面解析Java注解

    为什么学习注解? 学习注解有什么好处? 学完能做什么? 答:1. 能够读懂别人写的代码,特别是框架相关的代码: 2. 让编程更加简洁,代码更加清晰: 3. 让别人高看一眼. spring.mybati ...

  8. Java注解教程:自定义注解示例,利用反射进行解析

    Java注解能够提供代码的相关信息,同时对于所注解的代码结构又没有直接影响.在这篇教程中,我们将学习Java注解,如何编写自定义注解,注解的使用,以及如何使用反射解析注解. 注解是Java 1.5引入 ...

  9. Java注解实践

    Java注解实践 标签 : Java基础 注解对代码的语意没有直接影响, 他们只负责提供信息给相关的程序使用. 注解永远不会改变被注解代码的含义, 但可以通过工具对被注解的代码进行特殊处理. JDK ...

  10. java注解(基础)

    一.认识注解 1.注解的定义: java提供了一种原程序中的元素关联任何信息和元数据的途径和方法. 2.学习注解的目的: (1)能够读懂别人写的代码,特别是框架相关的代码(框架中使用注解是非常方便的) ...

随机推荐

  1. Delegate 委托细说

    目录 委托的申明 委托的赋值 委托实例方法的使用C#Invoke\BeginInvoke\Endinoke  系统自带的委托Action.Action<T>.Func<T>.P ...

  2. Bagging与随机森林

    Bagging Bagging是并行式集成学习算法最著名的代表,基于自助采样法(bootstrap sampling). 给定m个样本的数据集,选取m次,每次选1个样本,构成一个新的样本集,其中有的样 ...

  3. POJ3368题解

    题目大意:一个非降序序列,有若干查询,每次查询一个区间中重复次数最多的数字的个数. 思路:因为是非降序的,所以可以从头遍历把每个相同的数字划为一个块,用p[i]表示ai划分到了哪个块里面,同时还可以记 ...

  4. python浅拷贝与深拷贝浅析

    首先我们要明确,python中大多数都是浅拷贝,我们先说原因: 1.时间花费更少 2.内存更小 3.效率更高,浅拷贝只拷贝顶层数据,一般情况下比深拷贝效率高. 容器(如列表)切片是浅拷贝

  5. 面向对象编程(C++篇2)——构造

    目录 1. 引述 2. 详述 2.1. 数据类型初始化 2.2. 类初始化 1. 引述 在C++中,学习类的第一课往往就是构造函数.根据构造函数的定义,构造函数式是用于初始化类对象的数据成员的.无论何 ...

  6. LeetCode-006-Z 字形变换

    Z 字形变换 题目描述:将一个给定字符串 s 根据给定的行数 numRows ,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "PAYPALISHIRING" 行数为 ...

  7. 扩展我们的分析处理服务(Smartly.io):使用 Citus 对 PostgreSQL 数据库进行分片

    原文:Scaling Our Analytical Processing Service: Sharding a PostgreSQL Database with Citus 在线广告商正在根据绩效数 ...

  8. 基于kubernetes平台微服务的部署

    基于kubernetes平台微服务的部署 首先下载插件: kubernetes Continuous Deploy 然后去找 .kube/ 里的config 复制里面的内容 去添加凭据: 然后就是脚本 ...

  9. linux作业--第六周

    1.编写脚本实现登陆远程主机.(使用expect和shell脚本两种形式). #expect方式 yum -y install expect vim remote_ssh.sh #!/usr/bin/ ...

  10. php pdf添加水印(中文水印,图片水印)

    1.下载软件包 链接:https://pan.baidu.com/s/1cah-mf-SCtfMhVyst_sG8w&shfl=sharepset 提取码:ld8z 2.下载pdf_water ...