接口代理对象

为什么要接口代理?
在不改变原来代码,对已有方法增强

1 创建一个卖电脑接口

public interface SaleComputer {

    public String sale(double money);

    public void show();
}

2 创建一个类,实现接口

public class Lenovo implements SaleComputer {
    @Override
    public String sale(double money) {

        System.out.println("花了"+money+"元买了一台联想电脑...");
        return "联想电脑";
    }

    @Override
    public void show() {
        System.out.println("展示电脑....");
    }
}

3 创建接口的代理对象

public class ProxyTest {

    public static void main(String[] args) {
        //1.创建真实对象
        Lenovo lenovo = new Lenovo();

        //2.动态代理增强lenovo对象
        /*
            三个参数:
                1. 类加载器:真实对象.getClass().getClassLoader()
                2. 接口数组:真实对象.getClass().getInterfaces()
                3. 处理器:new InvocationHandler()
         */
        SaleComputer proxy_lenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() {

            /*
                代理逻辑编写的方法:代理对象调用的所有方法都会触发该方法执行
                    参数:
                        1. proxy:代理对象
                        2. method:代理对象调用的方法,被封装为的对象
                        3. args:代理对象调用的方法时,传递的实际参数
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                //判断是否是sale方法
                if(method.getName().equals("sale")){
                    //1.增强参数
                    double money = (double) args[0];
                    money = money * 0.85;
                    System.out.println("专车接你....");
                    //使用真实对象调用该方法
                    String obj = (String) method.invoke(lenovo, money);
                    System.out.println("免费送货...");
                    //2.增强返回值
                    return obj+"_鼠标垫";
                }else{
                    Object obj = method.invoke(lenovo, args);
                    return obj;
                }

            }
        });

        //3.调用方法

        String computer = proxy_lenovo.sale(8000);
        System.out.println(computer);

        proxy_lenovo.show();
    }
}

原文地址:https://www.cnblogs.com/hellosiyu/p/12515905.html

时间: 2024-08-29 21:20:46

接口代理对象的相关文章

Mybatis 映射器接口代理对象的方式 运行过程debug分析

查询一张表的所有数据. 环境: 使用工具IntelliJ IDEA 2018.2版本. 创建Maven工程不用骨架 1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

Mybatis 接口代理的实现

相信在开发中,尤其是mybatis 配置操作中,我们只需要提供一个mapper 接口,然后注入到service 中,就可以进行调用. 按我们的一般逻辑来说,我们并没有进行接口的实现,应该会报空指针异常,那么Mybatis 是如何进行操作的呢? 这主要是得于Spring 强大的扩展机制,进入正题: 1. Spring 提供了 BeanDefinitionRegistryPostProcessor 接口,通过这个接口的实现,可以自定义一些我们bean ,让Spring 在初始化的时候进行bean 的

动态代理 -- 不用手动编写一个代理对象,不需要编写与目标对象相同的方法,在运行时内存中动态生成代理对象。

动态代理创建的核心代码: TargetInterface objProxy = (TargetInterface) Proxy.newProxyInstance( Target.class.getClassLoader(),//与目标对象相同的类加载器 new Class[]{TargetInterface.class}, new InvocationHandler() { @Override //proxy 即该代理对象 //method 代理对象的方法,里面封装这接口中的所有方法 //arg

Java重要技术(27)动态代理之查看代理对象的类型信息

1.1. 查看动态代理类的各种信息 通过反射机制可以获取Proxy创建的动态代理类的各种信息,包括实现的接口,构造函数,方法等.查看到这些信息后,可以更好的理解为什么动态代理这么使用. /** * @Title: ProxyTest.java * @Package com.test.javatechnology.proxy * @Description: * @author http://www.cnblogs.com/coe2coe/ * @date 2017年3月26日 下午5:36:28

在spring中获取代理对象代理的目标对象工具类

问题描述:: 我现在遇到个棘手的问题,要通过spring托管的service类保存对象,这个类是通过反射拿到的,经过实验发现这个类只能反射取得sservice实现了接口的方法,而extends类的方法一律不出现,debug后发现这个servie实例被spring替换成jdkdynmicproxy类,而不是原始对象了,,它里面只有service继承的接口方法,而没有extends 过的super class方法,怎么调用原生对象的方法!!!!! 用托管的spring service类调用getCl

Android Binder进程间通信---ServiceManager代理对象的获取过程

本文参考<Android系统源代码情景分析>,作者罗升阳. 一.测试代码: -/Android/external/binder/server ----FregServer.cpp ~/Android/external/binder/common ----IFregService.cpp ----IFregService.h ~/Android/external/binder/client ----FregClient.cpp Binder库(libbinder)代码: ~/Android/fr

深入理解Spring AOP之二代理对象生成

深入理解Spring AOP之二代理对象生成 spring代理对象 上一篇博客中讲到了Spring的一些基本概念和初步讲了实现方法,当中提到了动态代理技术,包含JDK动态代理技术和Cglib动态代理 动态代理这部分我有过一篇博客介绍:动态代理,想深入了解的朋友能够看一看,再回想一下,Spring中怎样区分採用JDK动态代理和CGlib动态代理: 假设目标对象的实现类实现了接口.Spring AOP 将会採用 JDK 动态代理来生成 AOP 代理类: 假设目标对象的实现类没有实现接口,Spring

dubbo源码分析三:consumer注册及生成代理对象

本章我们将分析一下consumer向注册中心注册,并获取服务端相应的信息,根据这些信息生产代理对象的过程和源码. 1.类图 上图展示了部分消费者注册及生成代理对象过程中需要使用到的类和接口,其中: spring适配涉及到的类:DubboNamespaceHandler.DubboBeanDefinitionParser.ReferenceBean; 配置信息存储:ReferenceConfig.RegistryConfig.MonitorConfig.ProtocolConfig.Consume

重温Spring之旅5——AOP代理对象、JDK动态代理、使用cglib生产代理

AOP--代理对象 代理模式:代理模式的英文叫做Proxy或Surrogate,中文都可译为"代理",所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 抽象主题角色:声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以是使用代理主题. 代理主题(Proxy)角色:代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象: