zoukankan      html  css  js  c++  java
  • 反射和注解的原理

    一,注解的实现原理

    1,定义注解

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface pro {
        String className();
        String methodName();
    }

    2,注解的原理:生成对应注解的实现类

    public class proImpl implements pro{
    
        public String className() {
            return "注解中className对应的参数";
        }
        public String methodName() {
            return "注解中methodName对应的参数";
        }
    
    }

    二,使用注解的原理

      定义一个Check注解,方法用check注解,检查对应的方法处是否有错,有错就将错误的信息写入对应的bug.txt文档中.

    public class Calcuator {
        int a;
        long b;
        @Check
        public int getA() {
            System.out.println("a");
            return a;
        }
        @Check
        public void setA(int a) {
            System.out.println("a");this.a = a;
            throw new Error();
            
        }
        public long getB() {
            System.out.println("get---b");
            return b;
        }
        public void setB(long b) {
            System.out.println("ser---b");
            this.b = b;
        }
        
        @Check
        public long div() {
            return 1/0;
        }
        
    }
    Calcuator
    public @interface Check {
        
    }
    Check.注解
    package annotation;
    
    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.lang.reflect.Method;
    
    
    
    public class TestCheck {
        public static void main(String[] args) throws IOException {
            Calcuator calcuator=new Calcuator();
            //获取class对象
        Class<? extends Calcuator> class1=calcuator.getClass();
        
            //获取方法
        Method[] methods=class1.getMethods();
        int total=0;//出现异常的次数
        BufferedWriter bw=new BufferedWriter(new FileWriter("bug.txt"));
        
        for(Method method:methods) {
            if(method.isAnnotationPresent(Check.class)) {
                try {
                    method.invoke(calcuator);
                } catch (Exception e) {
                    // TODO: handle exception
                    total++;
                    System.out.println(method.getName());
                    bw.write(method.getName()+"异常方法的名称-----");
                    bw.newLine();
                    
                }
            }
            
        }
        bw.write("出现的总异常数"+total);
        bw.newLine();
        bw.flush();
        bw.close();
        }
    }
    TestCheck.实现原理

     小结:注解是一种有丰富信息的标签,通过反射获取标签的内容,进一步统一处理不同的信息。

  • 相关阅读:
    Nginx+tomcat负载均衡配置
    详解HttpURLConnection
    tomcat配置文件之Server.xml
    Android ADB命令大全(通过ADB命令查看wifi密码、MAC地址、设备信息、操作文件、查看文件、日志信息、卸载、启动和安装APK等)
    Tomcat多站点部署方式
    跨域、跨服务器调用时候session丢失的问题
    Linux系统的命令别名功能
    CentOS 升级GCC G++
    npm 安装碰到SSL问题
    centos图形界面的开启和关闭
  • 原文地址:https://www.cnblogs.com/gjx1212/p/14764539.html
Copyright © 2011-2022 走看看