zoukankan      html  css  js  c++  java
  • 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对象都是同一个。

  • 相关阅读:
    项目工程化之git提交规范以及 CHANGELOG生成
    移动端 弹窗-内容可滚动,背景不动
    项目readme文件目录生成工具 treer
    css animation动画
    【网络】从套接字到Web服务器
    【网络】图解HTTP-1
    【MySQL】搞懂ACID原则和事务隔离级别
    【MySQL】备份与恢复
    【MySQL】索引
    【Redis】主从复制原理
  • 原文地址:https://www.cnblogs.com/CjtBlog/p/13600364.html
Copyright © 2011-2022 走看看