Java 注解

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;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值