JavaSe-注解及动态代理小结



掌握目标

    能够使用Junit进行单元测试

    能够说出注解的作用

子主题 1在Java技术里注解的典型应用是:可以通过反射技术去得到类里面的注解,以决定怎么去运行类。

    能够使用JDK提供的3个注解

        @override

        @SurpressWramings

        @Deprecated

    能够根据基本语法编写自定义注解实现类

    能够了解自定义注解解析

    能够了解元注解使用

    能够编写模拟@Test案例

    能够理解动态代理原理

    能够使用动态代理Proxy编写代理类

Annotation

    是什么?

        Annotation 其实就是代码里的特殊标记, 有了注解技术后,开发人员可以通过注解告诉类如何运行

    有什么用?

        在Java技术里注解的典型应用是:可以通过反射技术去得到类里面的注解,以决定怎么去运行类。

注解分类

    按照运行机制划分:

        源码注解

        编译时注解

        运行时注解

    按照来源分:

        来自JDK的注解

        来自第三方的注解

自定义的注解

元注解:用在注解里的注解

自定义注解:

    定义格式:

        @Target(ElementType.METHOD)
        @Retention(RetentionPolicy.RUMTIME)
        public @Interface 注解名{
            String name();
            int age default 18;
        }

    说明:

        注解使用@Interface定义

        @Target标识自定义的注解使用在哪里,类?方法?构造方法?等

        @Retention标识自定义的注解的运行机制,源码注解?编译时注解?运行时注解?

        @Inherited
        @Documented

    注意:

        1 注解可以没有属性,称为标识注解

        2 注解里的属性必须带小括号

        3 注解里只有一个属性值时,建议定义成value,这样在使用时可以省略value=

        4 属性的类型包括八种基本数据类型和String,Class,Enum,Annotation共十二种

    使用:

        在符合定义注解的范围内使用即可

    代码演示:

1.    // 自定义一个类, 使用自定义注解
2.    class Student {
3.        // 格式: @注解名(成员1=值1,成员2=值2...)
4.        @Description(desc="学霸兼学渣", author="Jack", age=30)
5.        public void introduce() {
6.            System.out.println("大家好, 我是学生.");
7.        }
8.    }

解析:

    说明:就是反射获取类的注解

    API

        接口 AnnotatedElement

    所有已知实现类:
        AccessibleObject, Class, Constructor, Field, Method, Package

          getAnnotation(Class annotationClass)
                  如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。

         Annotation[] getAnnotations()
                  返回此元素上存在的所有注释。

         Annotation[] getDeclaredAnnotations()
                  返回直接存在于此元素上的所有注释。

        boolean isAnnotationPresent(Class annotationClass)
                  如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。
    
代码演示:

// 1. 获取 AnnotationClass 类的字节码对象
8.            Class cls = AnnotationClass.class;
9.            
10.            // 2. 获取类上的注解
11.            if (cls.isAnnotationPresent(MyAnnotation.class)) {
12.                MyAnnotation anno = cls.getAnnotation(MyAnnotation.class);
13.                String value = anno.value();
14.                System.out.println("类上的注解信息为 : " + value);
15.            }

动态代理

    代理 : 对被代理对象的拦截和控制.只要是代理一定会涉及到接口

    理解:租房: 房东(被代理类) 中介(代理类)

    编程思路:

        1 定义接口,给出抽象方法

        2 定义被代理类,实现1中接口,并重写接口中的抽象方法

        3 创建动态代理类的对象proxy,指定被代理类的加载器,指定1中的接口,给出拦截被代理对象方法的处理机制

InvocationHandler

        4 通过代理类对象调用接口中的方法执行

    核心代理类:

SuperStar proxy = (SuperStar) Proxy.newProxyInstance(loader, interfaces, new InvocationHandler() {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //对被代理类的方法进行处理
    }


});

    注意:

        1 invoke()方法在每一次代理类调用接口中的方法时会自动执行

        2 invoke()方法中的第一个参数一般很少用,最好不要用它调用方法,会造成递归,是程序崩溃


你可能感兴趣的:(JavaSe)