Java EKT关键技术强化 第07章 自定义注解

  • 运行环境:

  JDK8 + IntelliJ IDEA 2018.3 


  • 源码

    计算类:

public class Caculator {
    /**
     * 加  +   jia
     * 减   -  jian
     * 乘  *  mul
     * 除  /  div
     */
        //加  +   jia
    @CheckException
    public void jia(){
        System.out.println("1+0="+(1+0));
    }

    //减   -  jian
    @CheckException
    public void jian(){
        System.out.println("1-0="+(1-0));
    }

    //乘  *  mul
    @CheckException
    public void mul(){
        System.out.println("1*0="+(1*0));
    }
    //除  /  div
    @CheckException
    public void div(){
        System.out.println("1/0="+(1/0));
    }
    @CheckException
    public void show(){
        System.out.println("菩萨保佑,没有bug");
    }
}

    注解类:

import java.lang.annotation.*;

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

    测试类:

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

public class TestCheckException {
    public static void main(String[] args) {
        /**
         * 1.整理思路
         *       1.测试@CheckExcetion注解是否生效 测试已生效
         *       2.若包含@CheckException注解,则该方法执行
         *       3.若执行有异常,则记录异常信息在bug.txt文档中
         * 2.写伪代码(写注释)
         *        1)main   选main
         *        2)测试方法 @Test
         * 3.翻译成java代码
         */
        int num=0;
        Caculator caculator=new Caculator();
        Class loadClass =null;
        BufferedWriter bufferedWriter=null;
        try {
            loadClass = ClassLoader.getSystemClassLoader().loadClass("com.chenjiangt.zy.Caculator");
            Method[] methods=loadClass.getMethods();
            try {
                bufferedWriter=new BufferedWriter(new FileWriter("Exception.txt"));
            num++;
            for (Method method:methods){
                if (method.isAnnotationPresent(CheckException.class)){
                    try {
                        method.invoke(caculator);
                    } catch (Exception e) {
                        num++;
                        bufferedWriter.write("**************");
                        bufferedWriter.newLine();
                        bufferedWriter.write("method方法有异常:"+method.getName());
                        bufferedWriter.newLine();
                        bufferedWriter.write(" 异常原因:"+e.getClass().getName());
                        bufferedWriter.newLine();
                        bufferedWriter.write(" 异常信息:"+e.getMessage());
                        bufferedWriter.newLine();
                        bufferedWriter.write("程序异常打印成功");
                    }
                }
                /**
                 * method方法有异常:div
                 *         异常原因:java.lang.ArithmeticException
                 *         异常信息:/ by zero
                 *         ------------------------
                 *         共计异常数量:1
                 */
            }

            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try {
            bufferedWriter.newLine();
            bufferedWriter.write("------------------------");
            bufferedWriter.newLine();
            bufferedWriter.write(" 共计异常数量:"+num);
            bufferedWriter.flush();
            bufferedWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 效果图:

  • 总结

    注解: 

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

      * 定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
      * 概念描述:
      * JDK1.5之后的新特性
      * 说明程序的
      * 使用注解:@注解名称

    反射:框架设计的灵魂

      * 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码
      * 反射:将类的各个组成部分封装为其他对象,这就是反射机制
      * 好处:
        1. 可以在程序运行过程中,操作这些对象。
        2. 可以解耦,提高程序的可扩展性。

      * 获取Class对象的方式:
        1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
          * 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
        2. 类名.class:通过类名的属性class获取
          * 多用于参数的传递
        3. 对象.getClass():getClass()方法在Object类中定义着。
          * 多用于对象的获取字节码的方式

     * 结论:
        同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。

原文地址:https://www.cnblogs.com/CjtBlog/p/13600364.html