JavaSE基础—注解和动态代理

系列文章目录

注解和动态代理的基本内容



前言


一、注解的应用

1.注解概述

在这里插入图片描述

2.自定义注解

在这里插入图片描述
在这里插入图片描述

3.元注解

在这里插入图片描述
在这里插入图片描述

4.注解解析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package org.example.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Book {
    String value();
    double price() default 100;
    String[] author();
}

package org.example.annotation;

@Book(value = "《西游记》",price = 26.0,author = {"吴承恩"})
public class BookStore {

    @Book(value = "《红楼梦》",price = 99.0,author = {"罗贯中"})
    public void test(){}

}

package org.example.annotation;

import org.junit.Test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Arrays;

public class AnnotaionDemo {

    @Test
    public void praseClass(){
        //a.先得到类对象
        Class c = BookStore.class;
        //b.判断这个类上面是否存在这个注解
        if (c.isAnnotationPresent(Book.class)){
            //c.直接获取注解对象
            Book book = (Book) c.getDeclaredAnnotation(Book.class);
            System.out.println(book.value());
            System.out.println(book.price());
            System.out.println(Arrays.toString(book.author()));
        }
    }

    @Test
    public void praseMethod() throws Exception {
        //a.先得到类对象
        Class c = BookStore.class;
        Method m=c.getDeclaredMethod("test");
        //b.判断这个类上面是否存在这个注解
        if (m.isAnnotationPresent(Book.class)){
            //c.直接获取注解对象
            Book book = (Book) m.getDeclaredAnnotation(Book.class);
            System.out.println(book.value());
            System.out.println(book.price());
            System.out.println(Arrays.toString(book.author()));
        }
    }
}

5.注解的应用场景

在这里插入图片描述

package org.example.annotation;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class AnnotationDemo2 {
    
    public void test1(){
        System.out.println("=======test1==========");
    }
    public void test2(){
        System.out.println("=======test2==========");
    }
    @MyTest
    public void test3(){
        System.out.println("=======test3==========");
    }

    /**
     * 启动菜单:有注解的才被调用
     */
    public static void main(String[] args) throws Exception {
        AnnotationDemo2 t=new AnnotationDemo2();
        //a.获取类对象
        Class c = AnnotationDemo2.class;
        //b.获取全部方法
        Method[] m = c.getDeclaredMethods();
        //c.遍历方法,看是否有MyTest注解
        for (Method method : m) {
            if (method.isAnnotationPresent(MyTest.class)){
                //跑它
                method.invoke(t);
            }
        }
    }
}

package org.example.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
}

二、动态代理

1.动态代理概述和快速入门

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

实际用到的对象类

package org.example.proxy;

public class Star implements Skill{
    private String name;

    public Star(String name) {
        this.name = name;
    }

    @Override
    public void jump() {
        System.out.println(name+"开始跳舞,跳的很迷人~~");
    }

    @Override
    public void sing() {
        System.out.println(name+"开始唱歌,唱的很好听~~");
    }
}

要实现的接口

package org.example.proxy;

public interface Skill {
    void jump();
    void sing();
}

代理类

package org.example.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 代理类
 */
public class StarAgentProxy {
    /**
     * 设计一个方法返回一个明星对象的代理对象
     *
     */
    public static Skill getProxy(Star obj){
        //为杨超越这个对象返回一个代理对象
        return (Skill) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("收首付款。。。");
                //让真正的杨超越去唱歌和跳舞
                //method 正在调用的方法   args  代表这个方法的参数
                Object rs = method.invoke(obj, args);
                System.out.println("收尾款,把杨超越接回来");
                return rs;
            }
        });
    }
}

测试类

package org.example.proxy;

public class Test {
    public static void main(String[] args) {
        //1.创建一个对象,对象的类必须实现接口
        Star s=new Star("杨超越");
        //2.为杨超越生成一个代理对象(经纪人)
        Skill s2 = StarAgentProxy.getProxy(s);
        s2.jump();//走代理的
        s2.sing();
    }
}

在这里插入图片描述
在这里插入图片描述

2.动态代理的应用案例

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


总结

重点学习动态代理的实现方式,了解其优点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值