前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java动态创建代理对象

java动态创建代理对象

作者头像
多凡
发布2019-11-01 09:40:58
1.5K0
发布2019-11-01 09:40:58
举报
文章被收录于专栏:sringbootsringboot

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_44580977/article/details/95996872

代理模式在开发过程中有着众多好处,现在我先给大家首先介绍什么是代理模式,以及java的中代理模式的使用,最后再看代理模式的概念作用等自然就会明白了

1.动态创建代理对象

》》》》》》代理模式的字面意思,就是代理一个类,即被代理对象,让代理对象可 以有代理对象的功能或同时能够加强这个功能的,当然他还有其他作用

代码语言:javascript
复制
package ceom.proxy.test;

//Proxy,相当于工具类,帮助我们创建代理对象
import java.lang.reflect.Proxy;

//下面三个分别是  Proxy.newProxyInstance的三个参数
//person 实现接口,即马上要被代理的对象
import com.proxy.demo1.Person;

//work 接口内 有两个方法  go  和 have 方法
import com.proxy.demo1.Work;

//PersonPorxy实现处理类invocationhandler
import com.proxy.demo1.PersonPorxy;

public class test {
    public static void main(String[] args) {
        Person person = new Person();
        person.go();
        person.have();

        System.out.println("===========================");

         Work proxyperson= (Work)Proxy.newProxyInstance(Work.class.getClassLoader(),new Class[]{Work.class},new PersonPorxy());

        proxyperson.go();
        proxyperson.have();
    }
}
  • newProxyInstance的参数说明 第一个参数:要被代理对象的加载器 第二个参数:被代理对象实现的接口的.class,必须是数组结构(原因是一个被代理对象即类 可以实现多个接口类) 第三个参数:实现InvocationHandler接口的一个类(这是干嘛的呢?可能很多人不理解,可是你想想,Proxy.newProxyInstance 返回的就是一个 代理对象 ,他实现了被代理对象person的work接口 ,同时加强了person类的方法,那么如何加强person方法的方法呢?请看下面的PersonPorxy类吧)
代码语言:javascript
复制
package com.proxy.demo1;

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

public class PersonPorxy implements InvocationHandler{
    Person person=new Person();




	 /**
     * Proxy.newProxyInstance创造出的代理对象
     * 执行接口里的方法都会执行invoke,
     * @param proxy		这个参数是代理对象方法,暂放有时间再研究,
     * 					不过这不需要里用不到
     * @param method	被代理对象的方法,照着this理解,被代理对象
     * 					使用哪个方法,method就是谁
     * @param args		被代理对象方法的参数
     * @return			返回被代理对象的方法执行后的返回值
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

//        //1.获取方法名
//        String methodName = method.getName();
//        //2.获取方法所在的类的名称
//        String className = method.getDeclaringClass().getName();
//        //3.组合key
//        String key=className+"."+methodName;
        //4.diao
        System.out.println("                                    ");
        
        System.out.println("方法名字:"+method.getName()+";\n"+"class全限定类名:"+method.getDeclaringClass().getName());

		Object obj=null;
		
		//从这你应该可以知道 
		//可以通过method.getName获取的方法名的不同
		//来有针对性的来强化代理方法,
        if (method.getName()=="go"){
            System.out.println("这是高级的人");
             obj= method.invoke(person, args);
            System.out.println("开车上班");

            return obj ;
        }
        //返回的method.invoke就是 test类里的method方法 go() 和have()
        obj = method.invoke(person, args);
        System.out.println("                                    ");
        return obj;
    }
}

输出结果

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

下面贴出用到的Person和work类

Person类

代码语言:javascript
复制
package com.proxy.demo1;

public class Person implements Work {


    public void go() {
        System.out.println("走路上班");
    }

    public void have() {
        System.out.println("吃米饭");
    }
}

Work

代码语言:javascript
复制
package com.proxy.demo1;

public interface Work {
    public void go();
    public void have();
}

下面是硬概念,再看一下吧

代理模式:

作用:

为其他对象提供一种代理以控制对这个对象的访问。

在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介作用。

其特征是代理与委托类有同样的接口。

代理模式是常用的设计模式。

功能:

代理类不仅仅是一个隔离客户端和委托类的中介。

我们还可以借助代理类再次增加一些功能,而不需要修改原有代码。符合开闭原则。

代理类主要为委托类处理消息、过滤消息、把消息转发给委托类、以及事后处理工作。

代理类与委托类之间会存在关联关系,一个代理类的对象与一个委托类的对相关联。

代理类的对象本身并不实现服务,而是通过委托类的对象的方法来提供特定的服务。

其实:就是真正的业务功能还是由委托类来实现,但是在实现业务之前的一些公共服务,例如在项目开发中忘记了加入缓冲、日志等的功能。后期想加入,就可以使用代理来实现而没有必要打开已经封装好的委托类。

分类:

代理可以分为两种:静态代理、动态代理。(我上面的是动态创建)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.动态创建代理对象
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档