首页 > 其他分享 >代理实现的几种方式

代理实现的几种方式

时间:2023-11-30 20:23:03浏览次数:25  
标签:target 方式 Object 代理 ProjectC 几种 println public

代理实现的几种方式

代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.

静态代理

在使用静态代理时,需要定义一个接口或父类,被代理对象和代理对象一起实现或继承相同的接口或父类。在程序启动之前,代理类的.class文件已经存在。代理类可以是程序员直接创建的.java文件,也可以是通过某些工具生成的.java文件。

//接口
interface Project{
    void println(String s);
}
//实现类
class ProjectC implements Project{
    @Override
    public void println(String s){
        System.out.println("this is  message :"+s);
    }
}
//静态代理
class ProjectP1 implements Project{
    private ProjectC projectC;

    public ProjectP1(ProjectC projectC){
        this.projectC = projectC;
    }
    @Override
    public void println(String s) {
        System.out.println("this is proxy message");
        System.out.println("---------------------");
        projectC.println(s);
    }
    
}
//测试
public class test11_30 {
    public static void main(String[] args) {
        //无代理
        ProjectC projectC = new ProjectC();
        projectC.println("ok ok");
        System.out.println("");
        //静态代理
        ProjectP1 projectP1 = new ProjectP1(new ProjectC());
        projectP1.println("ok ok");
    }
}

动态代理

jdk代理

jdk可以使用java.lang.reflect.Proxy来生成代理对象。然后通过实现InvocationHandler接口在 invoke 方法中调用具体的方法。
Proxy.newProxyInstance 方法来实例化动态生成的代理类,而这个方法中的参数分别代表的含义是:
ClassLoader loader: 被代理类的类加载器
Class<?>[] interfaces: 被代理类实现的接口
InvocationHandler h: 实现指定接口InvocationHandler的实现类

//jdk代理
class ProjectInvocation implements InvocationHandler{

    Object target;
    public ProjectInvocation(Object target){
        super();
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("动态代理:jdk");
        Object invoke = method.invoke(target);;
        System.out.println("代理结束");
        return invoke;
    }
    
}
//工厂方法
class ProjectP2{
    private InvocationHandler  iHandler;
    private Object target;
    public ProjectP2(Object target ){
        this.target = target;
        this.iHandler = new ProjectInvocation(target);
    }

    public Object getProxy(){
        Object newProxyInstance = Proxy.newProxyInstance(
                    target.getClass().getClassLoader(),
                    target.getClass().getInterfaces(),
                    iHandler);
        return newProxyInstance;
    }
}

cglib代理

创建Enhancer对象,并设置被代理类的类对象(即Class对象)为其父类。
实现MethodInterceptor接口,编写自定义的拦截器,用于处理方法调用。
将自定义的拦截器对象设置为Enhancer对象的回调对象。
调用Enhancer对象的create()方法创建代理对象。
客户端调用代理对象的方法时,代理对象会调用拦截器的intercept()方法,并将被代理方法的相关信息传递给该方法。
在intercept()方法中,可以编写自定义的逻辑来处理方法调用,比如记录日志、检查权限等。

//cglib动态代理
class DynamicProxy implements MethodInterceptor  {
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("动态代理:cglib");
        Object result = proxy.invokeSuper(obj, args);
        System.out.println("代理结束");
        return result;
    }
}
public class test11_30 {
    public static void main(String[] args) {
        //无代理
        ProjectC projectC = new ProjectC();
        projectC.println("ok ok");
        System.out.println("");
        //cglib
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(ProjectC.class);
        //代理类
        enhancer.setCallback(new DynamicProxy());

        ProjectC proxySubject = (ProjectC) enhancer.create();

        proxySubject.println("ok ok");
    }
}

标签:target,方式,Object,代理,ProjectC,几种,println,public
From: https://www.cnblogs.com/kckte66/p/17868161.html

相关文章

  • Hadoop API 通过租户代理访问 Kerberos 安全 Hadoop 集群
    概述访问HDFS其实很简单这里记录一些方法,具备下面的特征:通过租户代理访问Kerberos认证的HADOOP资源获取FileSystem对象的技巧:FileSystem.get(URI,configuration)通用doAs模板通用hdfsCommand模板,使用try-with-resources。截取hdfs://namenode/user/...,使得nam......
  • 当多个使用弹窗类组件,可使用这种方式封装组件。(以下使用antd-vue、vue3)
    1.代码点击查看代码<template><slot:openDialog="openDialog":closDialog="modalCancel"></slot><a-modalv-model:open="open"title="BasicModal"@cancel="modalCancel"><templat......
  • clickhuose toStartOfInterval聚合的几种方式
    1.秒、分钟、小时、天以上这种sql可以用于上面几种类型的聚合。请注意时间SELECTtoStartOfInterval(timestamp,INTERVAL1minute)asstart_of_minute,count(*)ascountFROMtable_nameWHERE timestampBETWEEN'2023-10-3011:11:11'and'2023-11-3011:11......
  • 程序开发中常用的10种算法,你用过几种?
    当编写程序时,了解和使用不同的算法对解决问题至关重要。以下是C#中常用的10种算法,每个算法都伴随着示例代码和详细说明。1.冒泡排序(BubbleSort):冒泡排序是一种简单的比较排序算法,它多次遍历数组,将较大的元素逐渐浮动到数组的末尾。publicstaticvoidBubbleSort(int[]ar......
  • NOT IN 替换方式
    1.第一条SQLnotin的写法,不推荐,(有坑)如果notin里面SELECTB.RELEVANT_IDFROMT_COMPANY_DECIDEBwhereB.PROCESS_STATUS='newly'andB.IS_DEL='0'RELEVANT_ID存在空的情况,查询记录会空  ......
  • 从物理机到K8S:应用系统部署方式的演进及其影响
    公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。概述随着科技的进步,软件系统的部署架构也在不断演进,从以前传统的物理机到虚拟机、Docker和Kubernetes,我们经历了一系列变化。这些技术的引入给我们带来了更高的资源利用率、更快的部署速度和更......
  • 阿里云崩溃了,为什么你没有收到补偿?【补偿领取方式放文末】
    事情经过北京时间11月27日,阿里云部分地域云数据库控制台访问出现异常。据悉,从当日09:16起,阿里云监控发现北京、上海、杭州、深圳、青岛、香港以及美东、美西地域的数据库产品(RDS、PolarDB、Redis等)的控制台和OpenAPI访问出现异常,实例运行不受影响。经过工程师紧急处理,访问异常问......
  • 阿里云崩溃了,为什么你没有收到补偿?【补偿领取方式放文末】
    事情经过北京时间11月27日,阿里云部分地域云数据库控制台访问出现异常。据悉,从当日09:16起,阿里云监控发现北京、上海、杭州、深圳、青岛、香港以及美东、美西地域的数据库产品(RDS、PolarDB、Redis等)的控制台和OpenAPI访问出现异常,实例运行不受影响。经过工程师紧急处理,访问异常问......
  • MAC电脑无法启动深信服代理软件,提示“初始化失败,请尝试重新安装”
    1、launchctlprint-disabledsystemgrepsangfor  查看是否被禁用,如果是true就是被禁用2、sudolaunchctlenablesystem/com.sangfor.EasyMonitor启用命令3、sudolaunchctlload/Library/LaunchDaemons/com.sangfor.EasyMonitorplist 使生效 ......
  • Map的常见使用及循环的五中方式
    Map循环遍历的五种方法方法一:Setset=map.keySet();for(Objecto:set){System.out.println(o+""+map.get(o));} 通过key的set集合进行遍历,然后通过key来取map的value,此方法用的比较多。方法二:Setset=map.keySet();Iteratoriterator=set.iterator();whil......