注解

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

先了解一些怎么正常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. 利用Node.js编写跨平台的spawn语句

    node const child = cp.spawn('npm', ['run', 'build']); 报错 events.js:182 throw er; // Unhandled 'error ...

  2. 使用resize浏览器窗口大小改变事件容易出现的问题

    1.使用jQuery的resize时间的时候发现每次改变浏览器窗口大小事resize事件会执行两次, 解决办法 var resizeTimer=null; $(window).resize(funct ...

  3. (转载)虚拟化(3):os调度策略。

    转自:https://zhuanlan.zhihu.com/p/38046313 这一章主要是介绍几个简单的调度器策略.内容比较简单,就简单汇总下. 首先我们对现有的计算机环境有如下几个假设: 1.每 ...

  4. c# 表格控件SourceGrid使用总结

    网上SourceGrid相关的资料很少,使用过程中做了下记录,以便日后查用 1:初始化 this.grid = new SourceGrid.Grid(); this.grid.Size = new ...

  5. JZ-005-用两个栈实现队列

    用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 题目链接: 用两个栈实现队列 代码 import java.util.Stack; / ...

  6. 安装CentOS 7

    1.安装引导 首先要设置计算机的启动顺序为CD-ROM或USB 启动,保存设置后将CD放入光驱或插入USB,重新启动计算机. 计算机重启后显示有几个选项的引导菜单.如果在 60 秒内没有按任何键,则运 ...

  7. 06-CircuitBreaker断路器

    1.介绍 Spring Cloud Circuit breaker provides an abstraction across different circuit breaker implement ...

  8. 【译】ASP.NET Core 6 中的性能改进

    原文 | Brennan Conroy 翻译 | 郑子铭 受到 Stephen Toub 关于 .NET 性能的博文的启发,我们正在写一篇类似的文章来强调 6.0 中对 ASP.NET Core 所做 ...

  9. cobbler check执行报错

    httpd does not appear to be running and proxying cobbler, or SELinux is in the way. 当执行cobbler check ...

  10. laravel中{{}}和{!! !!}的区别详解

    {{}}支持转义 一段html代码只是被当成普通的字符串输出 {!! !!} 不支持转义 一段html代码可以被正常的解析 public function html(){ $address=" ...