分享

各大框架都在使用注解,浅谈注解的使用及原理以及类加载器

 quasiceo 2018-08-07

一、类加载器

1.什么是类加载器,作用是什么?

类加载器就加载字节码文件(.class)

2.类加载器的种类

类加载器有三种,不同类加载器加载不同的

1)BootStrap:引导类加载器:加载都是最基础的文件

2)ExtClassLoader:扩展类加载器:加载都是基础的文件

3)AppClassLoader:应用类加载器:三方jar包和自己编写java文件

 

怎么获得类加载器?(重点)

ClassLoader 字节码对象.getClassLoader();

复制代码
package cn.qlq;


public class Demo {

    public static void main(String[] args) {
        
        //获得Demo字节码文件的类加载器
        Class clazz = Demo.class;//获得Demo的字节码对象
        ClassLoader classLoader = clazz.getClassLoader();//获得类加载器
        //getResource的参数路径相对classes(src)
        //获得classes(src)下的任何的资源
        String path = classLoader.getResource("cn/qlq/jdbc.properties").getPath();
        //classLoader.getResourceAsStream("");
        System.out.println(path);
        
    }
    
}
复制代码

 

 

 

二、注解 @xxx

注解在目前而言最主流的应用:代替配置文件

关于配置文件与注解开发的优缺点:

注解优点:开发效率高 成本低 

注解缺点:耦合性大 并且不利于后期维护

1.jdk5提供的注解

@Override:告知编译器此方法是覆盖父类的

@Deprecated:标注过时

@SuppressWarnings:压制警告

 

发现的问题:

不同的注解只能在不同的位置使用(方法上、字段上、类上)

 

 

2.自定义注解:

1.注解是给机器看的,注释是给程序员看的,这是两者的区别。现在各大框架都在使用注解,而我们程序员需要做的就是知道如何使用注解,而对其底层原理却不清楚,今天看了一段视频,现在浅谈一下注解的使用。

2.注解的使用:

  大体分为三部分: 定义注解、使用注解、解析注解。在框架中定义与解析框架都已经为我们做好了。

(1)定义注解:定义一个简单的注解:

 

复制代码
 1 import java.lang.annotation.ElementType;
 2 import java.lang.annotation.Retention;
 3 import java.lang.annotation.RetentionPolicy;
 4 import java.lang.annotation.Target;
 5 
 6 
 7 @Target(ElementType.METHOD)
 8 @Retention(RetentionPolicy.RUNTIME)
 9 public @interface MyAnnotation {
10     //定义注解的属性,这不是方法
11     String name();//必选注解
12     int value() default 20;//有属性就是可选属性
13 }
复制代码

做一个解释吧:定义前面的@Target,与@Retention又称为元注解,限制定义的注解的特性:

@Target定义注解使用的位置,值有:看名字一般就很明显了吧

                                 

    @Retention:限定注解的可见范围:值有

                         

    一个图解释上面的可见范围:

            

(2)注解的使用:

复制代码
 1 package annotation;
 2 
 3 public class UseMyAnnotion {
 4 
 5 //    这里只用一个属性,另一个value属性有默认值不用设置
 6     @MyAnnotation(name = "QizoZhi")
 7     public void show(String str){
 8         System.out.println(str);
 9     }
10 }
复制代码

 

 

 (3)解析注解:这里使用了底层的映射原理

 

 

复制代码
 1 package annotation;
 2 
 3 import java.lang.reflect.InvocationTargetException;
 4 import java.lang.reflect.Method;
 5 
 6 public class MyAnnotationParser {
 7 
 8     public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
 9 //        获取字节码对象
10         Class clazz = UseMyAnnotion.class;
11         Method method = clazz.getMethod("show", String.class);
12 //        获取方法上面的注解
13         MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
14 //        获取注解属性值
15         System.out.println(annotation.name()+"\t"+annotation.value());
16         
17 //        取到值就可以根据业务处理数据
18         
19         //激活方法,也就是让方法执行
20         method.invoke(new UseMyAnnotion(), "HH");
21     }
22 }
复制代码

 

 

 

到这里注解基本上就完了,我们需要了解底层实现原理,真正开发的时候定义注解以及解析注解一般不用我们写,我们只需要学会使用框架提供的注解,但是使用注解的开发也有缺点。对后期的维护增加了困难。

 

 

Java注解之Retention、Documented、Target介绍参考:https://www.cnblogs.com/qlqwjy/p/8516551.html

 

【小主,觉得有用的话点击右边的打赏打赏点哦!多多少少没关系,一分也是对我的支持和鼓励。谢谢!】

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多