zoukankan      html  css  js  c++  java
  • 注解

    1_注解_概念

     AnnoDemo1.java

    package cn.itcast.annotation;

    /**
    * 注解javadoc演示
    *
    * @author itcat
    * @version 1.0
    * @since 1.5
    */
    public class AnnoDemo1 {

    /**
    * 计算两数的和
    * @param a 整数
    * @param b 整数
    * @return 两数的和
    */
    public int add(int a, int b ){
    return a + b;
    }
    }

     (0)

     (1)

    (2)

    (3) 

     (4)

     (5)

     若编码乱码,则选择ANSI编码(本地默认编码),重新生成

    ==========================================================================================================

    2_注解_JDK内置注解

     AnnoDemo2.java

    package cn.itcast.annotation;

    import java.util.Date;

    /**
    * JDK中预定义的一些注解
    * * @Override :检测被该注解标注的方法是否是继承自父类(接口)的
    * * @Deprecated:该注解标注的内容,表示已过时
    * * @SuppressWarnings:压制警告
    *
    *
    */

    @SuppressWarnings("all")
    public class AnnoDemo2 {

    @Override
    public String toString() {
    return super.toString();
    }

    @Deprecated
    public void show1(){
    //有缺陷
    }

    public void show2(){
    //替代show1方法
    }

    public void demo(){
    show1();
    Date date = new Date();
    }
    }

    =============================================================================

    3_注解_自定义注解_格式&本质 (1)

      ==============================================================================================================

    4_注解_自定义注解_属性定义

     

     

    Person.java

    package cn.itcast.annotation;

    public enum Person {

    P1,P2;//枚举
    }

    ---------------------------------------------------------------------------------------------------------------------------------------------------------

    MyAnno2.java

    package cn.itcast.annotation;

    public @interface MyAnno2 {

    }

    -------------------------------------------------------------------------------------------------------------------------------------------------------

    MyAnno.java

    package cn.itcast.annotation;

    import com.sun.corba.se.spi.orbutil.threadpool.Work;

    public @interface MyAnno {

    int value();
    Person per();
    MyAnno2 anno2();
    String[] strs();
    /*String name() default "张三";*/
    /*String show2();

    Person per();
    MyAnno2 anno2();

    String[] strs();*/


    }

    ----------------------------------------------------------------------------------------------------------------------------

    Worker.java

    package cn.itcast.annotation; 

    @MyAnno(value=12,per = Person.P1,anno2 = @MyAnno2,strs="bbb")
    @MyAnno3
    public class Worker {
    @MyAnno3
    public String name = "aaa";
    @MyAnno3
    public void show(){


    }
    }

     ==============================================================================================================

    5_注解_自定义注解_元注解

     (1)@Target

     

     使用:

     (2)@Retention

     

     (3)@Documented:加了注解之后,会在javaAPI文档中体现

     =================================================================================================================

    6_注解_解析注解

    注解是用来替换配置文件的

     

     

    ReflectTest.java

    package cn.itcast.annotation;

    import java.io.InputStream;
    import java.lang.reflect.Method;
    import java.util.Properties;

    /**
    * 框架类
    */


    @Pro(className = "cn.itcast.annotation.Demo1",methodName = "show")
    public class ReflectTest {
    public static void main(String[] args) throws Exception {

    /*
    前提:不能改变该类的任何代码。可以创建任意类的对象,可以执行任意方法
    */


    //1.解析注解
    //1.1获取该类的字节码文件对象
    Class<ReflectTest> reflectTestClass = ReflectTest.class;
    //2.获取上边的注解对象
    //其实就是在内存中生成了一个该注解接口的子类实现对象
    /*

    public class ProImpl implements Pro{
    public String className(){
    return "cn.itcast.annotation.Demo1";
    }
    public String methodName(){
    return "show";
    }

    }
    */

    Pro an = reflectTestClass.getAnnotation(Pro.class);
    //3.调用注解对象中定义的抽象方法,获取返回值
    String className = an.className();
    String methodName = an.methodName();
    System.out.println(className);
    System.out.println(methodName);

    //3.加载该类进内存
    Class cls = Class.forName(className);
    //4.创建对象
    Object obj = cls.newInstance();
    //5.获取方法对象
    Method method = cls.getMethod(methodName);
    //6.执行方法
    method.invoke(obj);
    }
    }

     

     =====================================================================================================================

    7_注解_案例_简单的测试框架

    Calculator.java

    package cn.itcast.annotation.demo;


    /**
    * 小明定义的计算器类
    */
    public class Calculator {

    //加法
    @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("永无bug...");
    }

    }

    ------------------------------------------------------------------------------------------------------------------------------------------

    Check.java

    package cn.itcast.annotation.demo;


    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;

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

    -------------------------------------------------------------------------------------------------------------------------------------------------------

    TestCheck.java

    package cn.itcast.annotation.demo;


    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;

    /**
    * 简单的测试框架
    *
    * 当主方法执行后,会自动自行被检测的所有方法(加了Check注解的方法),判断方法是否有异常,记录到文件中
    */
    public class TestCheck {


    public static void main(String[] args) throws IOException {
    //1.创建计算器对象
    Calculator c = new Calculator();
    //2.获取字节码文件对象
    Class cls = c.getClass();
    //3.获取所有方法
    Method[] methods = cls.getMethods();

    int number = 0;//出现异常的次数
    BufferedWriter bw = new BufferedWriter(new FileWriter("bug.txt"));


    for (Method method : methods) {
    //4.判断方法上是否有Check注解
    if(method.isAnnotationPresent(Check.class)){
    //5.有,执行
    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();

    }

    }

    --------------------------------------------------------------------------------------------------------------------------------

     

  • 相关阅读:
    重拾node第一天
    layui采坑记录 (上卷)QUQ
    解决IOS固定定位 fixed的不兼容
    layui 启用禁用切换详解
    jq form表单渲染单选框内容渲染
    vue 工具函数的封装 时间格式化函数
    CSS常见的继承属性
    git简单使用指南
    常用git命令大全
    react项目使用antd
  • 原文地址:https://www.cnblogs.com/curedfisher/p/12515201.html
Copyright © 2011-2022 走看看