• 2阶——注解


    1:注解从jdk1.5之后支持

    2: jdk中预定义的一些注解

    *@Override (检查被该注解标注的方法是否继承于父类)    @Deprecated(标注的内容表示已经过时)  @SuppressWarnings(压制警告))





    3:自定义注解
    本质相当于一个接口,接口能定义什么 注解就可以定义什么)

    public @interface MyAnotation { //javac把源文件先编译成为class 文件 在通过javap命令反编译就会发现注解的 本质是 public interface Annotaticn extends Annotation{} 这就可以说接口中能定义什么 注解就可以定义什么
      属性的返回值类型 //javadoc可以编译成Document文档
       *基本数据类型
       *String
       *枚举 注解 以上数据的数组类型

    例如:int show1();
    }

     




    4:元注解
    用于描述注解的注解
    
    
    
    //自定义注解
    @Target(value = {ElementType.TYPE,ElementType.FIELD) //定义作用范围 Type是只能作用于类上  FIELD 成员变量上
    @Retention(RetentionPolicy.RUNTIME)   // SOURCE CLASS RUNTIME
    //@Documented
    public @interface MyAnotation {  //本质是 public interface Annotaticn extends Annotation
    
    
    }


     5注解替代配置文件(框架注解的简易实现原理)

    
    
    package cn;
    
    import java.lang.reflect.Method;
    
    @Pro(className = "cn.refect.Person",methodName = "eat")  //注解替代了配置文件 相当于直接配置到了类上!
    public class ReDemo {
        public static void main(String[] args) {
            //用注解代替配置文件
    
            try {
                Class<ReDemo> clazz = ReDemo.class;
                //获取一个注解对象
                Pro po = clazz.getAnnotation(Pro.class);
                String className = po.className();
                String methodName = po.methodName();
    
                System.out.println(className);
                System.out.println(methodName);
    
                //反射执行
                Object o = clazz.newInstance();
                Method method = clazz.getMethod(methodName);
                method.invoke(o);
    
    
    
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    }


    //自定义的注解
    package cn;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Pro {
        String className();
        String methodName();
    }
    
    

     

     //利用注解来测试方法
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class TestDemo {
    
        public static void main(String[] args) {
    
            Demo4 demo4 = new Demo4();
    
            Class<Demo4> clazz = Demo4.class;
    
            Method[] methods = clazz.getMethods();
            int num = 0;
    
            for (int i = 0; i <methods.length ; i++) {
    
                if(methods[i].isAnnotationPresent(Demo2.class)){
    
                    try {
                        methods[i].invoke(demo4);
    
                    } catch (Exception e) {
                        num++;
                        System.out.println(e.getCause().getClass().getSimpleName());
                        System.out.println(e.getCause().getMessage());
                        System.out.println("-----------------------------------");
                    }
                }
            }
    
            System.out.println("一共出现了"+num+"次异常");
        }
    
    
    }
    
    
    
    public class Demo4 {

    @Demo2
    public void getsum(){
    String str = null;
    str.toString();
    System.out.println("getsum");
    }
    @Demo2
    public void getsum2(){
    int i = 0;

    int a = 10 / i;
    System.out.println("getsum2");
    }

    @Demo2
    public void getsum3(){
    System.out.println("3333");
    }

    public void hello(){
    System.out.println("right");
    }
    }



    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,ElementType.TYPE})
    public @interface Demo2 { //注解本质就是一个接口接口怎么定义的 注解就怎么定义

    // public String name(); //返回值 字符串类型
    //public int age(); //返回值 int类型
    // public Demo3 meiju(); // 返回值 枚举类型
    // public String[] all(); //以上上中的数组类型

    //直接简写如下
    // String name(); //返回值 字符串类型
    // int age(); //返回值 int类型
    // Demo3 meiju(); // 返回值 枚举类型
    // String[] all(); //以上上中的数组类型

    }
     
    
    
    




















    坚持
  • 相关阅读:
    使用Xposed+JustTrustMe来突破SSL Pinning
    反编译工具
    java练习生 使用feign
    java练习生 AOP【日志】【异常处理】
    java 中string类型转Date类型和Date类型转string类型
    Metro Style App 异步简洁而不简单的异步
    Metro Style app :浏览器扩展
    用async 解放你的大脑
    Metro Style App :推送概述(二)
    Metro Style App :Framwork与WinRT(二)
  • 原文地址:https://www.cnblogs.com/gaoSJ/p/12877521.html
Copyright © 2020-2023  润新知