Java 注解

来源:互联网 发布:mac不进系统打开终端 编辑:程序博客网 时间:2024/06/18 13:39

1、Java基础加强:

注解:动态代理类加载器

2、 注解:

作用:主要就是用来替代xml的配置文件,因为解析xml比较繁琐存在的位置:在对应的Java类中.使用的范围:用于修饰包,类,构造器,方法,成员变量,参数和局部变量的声明.存储形式:key\value形式不影响原本的代码执行注解与XML的区别:注解:    优点:        直观,简单.        配置方式容易.    缺点:        配置信息相对过于零散.        修改过于麻烦(重新编译) XML:     优点:        与Java类逻辑的关系低耦合.        复用性好        修改很简单(不用编译)     缺点:        编写过于复杂.        解析操作过于复杂.总结:两种混合使用比较好,注解在配置基本不会改使用,xml配置一些经常改动的配置。

3、Java中提供三个基本注解:

a.@Override:限定重写父类方法    用处:当一个类继承于另一个类,并重写其提供的方法时.    例如:
            接口                public interface Person {                    public void eat();                }            ManPerson类实现接口                public class ManPerson implements Person {                    @Override                    public void eat() {                    }                }
    在实现的接口方法和继承类重写类的方法时,默认自动加了@Override,表示这个是父类的方法    加了这个注解就不能修改方法的名字了。b.@Deprecated:标示已过时    作用:保证软件或系统版本更新,对版本的兼容性(新版本只能增加内容,不能修改及删除).    调用的时候会出现方法上有个横线。c.@SuppressWarnings:抑制编译器警告    有时候编译器会提示一些黄色的警告错误,加上了就可以去掉黄色警告    例如:        @SuppressWarnings("rawtypes")        ArrayList list  = new ArrayList<>();

4、自定义注解:

@interface这个不是接口,步骤:a.在包名上右击--New --- Other... --- 输入 anno,会自动出现 Annotation    public @interface MyAnno {    }b.我们就可以在方法上加上自己的注解了    @MyAnno    public void testMyAnno(){    }这样我们就完成了自己的注解。我们可以在注解里面加属性,例如:
        public @interface MyAnno {            //属性            int num();        }        @MyAnno(num = 0)        public void testMyAnno(){//你定义了num属性,必须给值        }
 注意:    如果自定义注解,只定义value属性(没有任何其他属性)    public @interface MyAnno {        //属性        String value();    }    使用该注解时,可以省略"value="(可以直接指定属性值,而不定义属性名)    @MyAnno("")    public void testMyAnno(){//你定义了num属性,必须给值    }现在我们还不知道为什么要定义注解,有啥用呢?往下看。

5、设定自定义注解的修饰范围:

@Target注解:用于修饰自定义注解    指定该自定义注解允许修饰Java类的哪个部分(类、成员变量、方法等)    例如:我只想要@MyAnno("")只能修饰类
            自定义注解            package com.example.zhujie;            @Target(ElementType.TYPE )//可使用的类型可以查看源码            public @interface MyAnno {                //属性                int num();            }            使用:            package com.example.zhujie;            @MyAnno(num = 0)            public class ManPerson implements Person {                @SuppressWarnings("rawtypes")                ArrayList list  = new ArrayList<>();                //@MyAnno(num = 0)  不能修饰方法了,只能修饰类                public void testMyAnno(){                }            }
@Retention注解:   用于修饰自定义注解       指定该自定义注解的生命周期.(生命周期 - SOURCE、CLASS、RUNTIME)    SOURCE:在源码中有用    CLASS:在编译为class还在    RUNTIME:一直在运行中,注解都在    例如:
            @Target(ElementType.TYPE )            @Retention(RetentionPolicy.SOURCE)            public @interface MyAnno {                //属性                int num();            }

6、通过反射读取注解:

只能读取运行时的注解;例如:
        //@Target(ElementType.TYPE )        @Retention(RetentionPolicy.RUNTIME)        public @interface MyAnno {            //属性            String name();        }        public class TestAnnotation {            public static void main(String[] args) throws Exception {                Test t = new Test();                MyAnno anno = t.getClass().getAnnotation(MyAnno.class);//获取类的注解                System.out.println(anno.name());                Method m = t.getClass().getMethod("test");                MyAnno anno1 = m.getAnnotation(MyAnno.class);//获取方法的注解                System.out.println(anno1.name());            }        }        @MyAnno(name = "类的注解")        class Test{            @MyAnno(name = "方法的注解")            public void test(){                System.out.println("test");            }        }        打印的信息:            类的注解            方法的注解

7、注解的运用:

我们可以在JDBC中使用注解配置,注解类就不写了,比较简单。
    @JDBCAnno(driverClassName = "com.mysql.driver", password = "root", url = "jdbc:mysql://localhost:3306/mydb", username = "root")    public class JDBCUtils {        public static Connection getConnection(){            Connection conn = null;            //1 读取四大参数            Class clazz = JDBCUtils.class;            JDBCAnno jdbcAnno = (JDBCAnno) clazz.getAnnotation(JDBCAnno.class);            //2 注册驱动类            try {                Class.forName(jdbcAnno.driverClassName());            } catch (ClassNotFoundException e) {                e.printStackTrace();            }            //3 DriverManager获取连接            try {                conn = DriverManager.getConnection(jdbcAnno.url(), jdbcAnno.username(), jdbcAnno.password());            } catch (SQLException e) {                e.printStackTrace();            }            return conn;        }    }