当前位置: 首页 > news >正文

自定义解的使用,反射,代理模式

文章目录

      • 自定义注解
      • 反射
      • 代理模式、
        • 静态代理
        • 动态代理

自定义注解

springboot 框架中定义了大量的注解,为什么加上注解之后就能实现配置了。比如@Autowired, 将 IOC 中的对象拿出来使用。

创建自定义的注解

@Target(ElementType.METHOD) //作用的目标
@Retention(RetentionPolicy.RUNTIME) //作用的时间
public @interface  LogAnnotation {
    public String  methodName() default "";
}

在方法上面使用注解

@LogAnnotation(methodName = "print")
public  void  print(){
     System.out.println("Hello World");
}

使用反射机制来处理注解。反射可以扫描所有的类。在这个里面可以做一些详细得到操作,比如获取方法的一些参数等


public class AnnotationProcessor {

    public void process() throws NoSuchMethodException {
        Method method = test.class.getMethod("print");
        if (method.isAnnotationPresent(LogAnnotation.class)) {
            LogAnnotation annotation = method.getAnnotation(LogAnnotation.class);
            String methodName = annotation.methodName();
            System.out.println(methodName);
        }
    }
    public static void main(String[] args) {
        AnnotationProcessor annotationProcessor = new AnnotationProcessor();
        try {
            annotationProcessor.process();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

反射

反射是 Java 框架的灵魂,通过反射可以获取任意一个类所有属性和方法,还可以调用这些属性和方法。

spring、mybatis 这些底层都是用了大量的反射机制。

想要通过反射获取到动态的信息 需要获取到 class 对象

package com.cl.jvppeteerdemo.util;

import lombok.SneakyThrows;

import java.lang.reflect.Method;

public class ReflectDemo {

   public String  name;
    public static void sayHello(){
        System.out.println("Hello World");
    }
    @SneakyThrows
    public static void main(String[] args) {
        Class<ReflectDemo> reflectDemoClass = ReflectDemo.class;
        reflectDemoClass.getDeclaredMethod("sayHello").invoke(null);
    }

}

代理模式、

静态代理

普通的静态代理对象

public interface SmsSerivce {
    public void send();
}
public class SmsSerivceImpl implements SmsSerivce{
    @Override
    public void send() {
        System.out.println("aaa");
    }
}

Proxy 代理类

public class SMSProxy implements SmsSerivce{

    private SmsSerivce smsSerivce;
    public SMSProxy(SmsSerivce smsSerivce) {
        this.smsSerivce = smsSerivce;
    }
    @Override
    public void send() {
        System.out.println("代理之前设置");
        smsSerivce.send();
        System.out.println("Proxy: SMS sent");
    }
    public static void main(String[] args) {
        SmsSerivce smsSerivce1=new SmsSerivceImpl();
        SMSProxy proxy=new SMSProxy(smsSerivce1);
        proxy.send();
    }
}
动态代理

package com.cl.jvppeteerdemo.静态代理;

import java.lang.reflect.Proxy;

public class JDKProxyFactory {

    public  static  Object test(Object target){
        return Proxy.newProxyInstance(
            // target通带代理类
            target.getClass().getClassLoader(),
            //被代理类实现的接口,可以有很多
            target.getClass().getInterfaces(),
            //实现invovationHandler的对象
            new DebugInvocationHandler(target)
        );
    }

    public static void main(String[] args) {
        SmsSerivce smsSerivce  = (SmsSerivce) JDKProxyFactory.test(new SmsSerivceImpl());
        smsSerivce.send();
    }
}

动态代理存在的问题

只能代理实现接口的类, 如果这个类没有实现接口那么就不能实现代理。

http://www.dtcms.com/a/17511.html

相关文章:

  • 国自然地区基金|影像组学联合病理组学预测进展期胃癌术后预后的研究|基金申请·25-02-13
  • 网络编程(tcp线程池)
  • Springboot集成Milvus和Embedding服务,实现向量化检索
  • 3天功能开发→3小时:通义灵码2.0+DEEPSEEK实测报告,单元测试生成准确率92%的秘密
  • DeepSeek+kimi自动生成ppt
  • Pythong 解决Pycharm 运行太慢
  • Docker容器基本操作
  • maven web项目如何定义filter
  • Unity嵌入到Winform
  • 【AI论文】10亿参数大语言模型能超越405亿参数大语言模型吗?重新思考测试时计算最优缩放
  • 使用Python爬虫实时监控行业新闻案例
  • 基于 STM32 的智能电动车防盗与管理系统
  • C++ 设计模式-适配器模式
  • RSS远小于容器内存限制,却收到了内存告警
  • 20250213 随笔 PV(Page View) 和 UV(Unique Visitor)
  • Hutool - BloomFilter:便捷的布隆过滤器实现
  • 2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(六级)
  • 讲解ES6中的变量和对象的解构赋值
  • 创建维基百科和百度百科哪个更容易?
  • 两步在 Vite 中配置 Tailwindcss
  • 【面试】网络安全常问150道面试题
  • JAVA-Lambda表达式(高质量)
  • MySQL-mysql zip安装包配置教程
  • 开发去中心化应用(DApp)的完整路径:从0到1的实践指南
  • DeepSeek如何重塑我的编程学习:计算机新生的AI实践
  • LSTM 学习笔记 之pytorch调包每个参数的解释
  • python自动化测试之统一请求封装及通过文件实现接口关联
  • 传感器篇(一)——深度相机
  • 第一章嵌入式系统概论考点10互联网
  • 基于Spring Security 6的OAuth2 系列之十五 - 高级特性--客户端认证方式