动态代理

动态代理

  • 目的:完成代码的增强
  • 个人理解:代理类在程序运行时创建的代理方式被成为动态代理。 我们上面静态代理的例子中,代理类(studentProxy)是自己定义好的,在程序运行之前就已经编译完成。然而动态代理,代理类并不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的。相比于静态代理, 动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法。
  • 接口类
package com.gaoji.member;
//接口类
public interface Person {
   
	void showName();
	void showAge();
	void showSex();
}

  • 实现类
package com.gaoji.member;
//实现类
public class PersonImpl implements Person{
   
    @Override
    public void showName() {
   
            // TODO Auto-generated method stub
            System.out.println("我叫张三");
    }
    @Override
    public void showAge() {
   
            // TODO Auto-generated method stub
            System.out.println("今年十八岁");
    }
    @Override
    public void showSex() {
   
            // TODO Auto-generated method stub
            System.out.println("我是男孩子");
    }
}

  • 代理类
package com.gaoji.member;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;
//代理类
public class InvocationHandlerImpl implements InvocationHandler{
   
    // 目标对象 
private Object target;  

/** * 构造方法 * @param target 目标对象 */  
public InvocationHandlerImpl(Object target) {
     
  super();  
  this.target = target;  
}  
/** * 获取目标对象的代理对象 * @return 代理对象 */  
public Object getProxy() {
     
  return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),   
          target.getClass().getInterfaces(), this);  
}


  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   
             // 在目标对象的方法执行之前简单的打印一下 proxy:类加载器、method:接口
  System.out.println(method.getName()+"开始"+new Date());  
    
  
  // 执行目标对象的方法 
  Object result = method.invoke(target, args);  
    
  // 在目标对象的方法执行之后简单的打印一下 
  System.out.println(method.getName()+"结束了"+new Date());  
    
  return result;
  }  
}

  • 驱动类
package com.gaoji.member;
/*驱动类 * 高内聚,低耦合 1.非业务逻辑代码冗余 2.维护困难 */
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//动态代理
// 项目测试时,需要日写志
public class MainTest {
   
	public static void main(String[] args) {
   
		/*Person p=new PersonImpl(); p.showName(); p.showAge();*/
		Person p=new PersonImpl();
		InvocationHandlerImpl handler =new InvocationHandlerImpl(p);
		Person p1=(Person) handler.getProxy();//代理类
		p1.showAge();
		p1.showName();
		p1.showSex();
	}
}

  • 结果
showAge开始Fri May 10 21:04:34 GMT+08:00 2019
今年十八岁
showAge结束了Fri May 10 21:04:34 GMT+08:00 2019
showName开始Fri May 10 21:04:34 GMT+08:00 2019
我叫张三
showName结束了Fri May 10 21:04:34 GMT+08:00 2019
showSex开始Fri May 10 21:04:34 GMT+08:00 2019
我是男孩子
showSex结束了Fri May 10 21:04:34 GMT+08:00 2019

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106725.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JsonPath使用

    JsonPath使用JSONPath-是xpath在json的应用。xml最大的优点就有大量的工具可以分析,转换,和选择性的提取文档中的数据。XPath是这些最强大的工具之一。如果可以使用xpath来解析json,以下的问题可以被解决: 1,数据不使用特殊的脚本,可以在客户端交互的发现并取并获取。2,客户机请求的JSON数据可以减少到服务器上的相关部分,这样可以最大限度地减少服务器响应的带宽使用…

    2022年6月18日
    30
  • Jmeter安装及入门教程(超详细)[通俗易懂]

    Jmeter安装及入门教程(超详细)[通俗易懂]一、Jmeter安装教程1、首先进入官网:Jmeter官网下载正版的Jemeter2、安装和本地JDK对应的JMeter版本我安装的是Jemeter5官方提示对应的是8以上的jdk,所以需要找到对应的JDK8对应的Jemeter4版本(注意版本一定要按官方提示的对应,否则后期会受影响)。附上官网上提供的全部版本的链接,大家按需下载安装包。3、点击下载,并解压。比如我解压到D盘目录下(这个随意,但最好不要在系统盘).个人认为要注意3点:1)解压之后压缩包叫apache-jmeter-

    2022年6月5日
    44
  • pytest运行_ios12清除缓存

    pytest运行_ios12清除缓存前言pytest运行完用例之后会生成一个.pytest_cache的缓存文件夹,用于记录用例的ids和上一次失败的用例。方便我们在运行用例的时候加上–lf和–ff参数,快速运行上一

    2022年7月31日
    5
  • DNS服务器fe80_无法访问dns域名服务器

    DNS服务器fe80_无法访问dns域名服务器服务器dns地址fec0内容精选换一换Atlas200DK开发者板支持通过USB端口或者网线与Ubuntu服务器进行连接,连接示例图如图1所示。Atlas200DK连接Ubuntu服务器有以下场景:使用USB连接线通过USB端口与Ubuntu服务器直连,请参考通过USB端口直连Ubuntu服务器。此种场景下,Atlas200DK不方便接入网络,仅适用于与Ubunt创建子网。您可以在A…

    2022年8月11日
    19
  • 软件详细设计模板

    产品名称Productname密级Confidentialitylevel  产品版本ProductversionTotal8pages共8页V1.01 XXX软件详细设计说明书   Preparedby拟制

    2022年4月7日
    52
  • BN层原理解析_视频解析接口原理

    BN层原理解析_视频解析接口原理前几天看了BN的那篇经典论文《《BatchNormalization_AcceleratingDeepNetworkTrainingbyReducingInternalCovariateShift》,心中留有很多疑惑,今天大概弄明白了,这里记录一下。1训练数据为什么要和测试数据同分布?看看下图,如果我们的网络在左上角的数据训练的,已经找到了两者的分隔面w,如果测试数据是右下角…

    2022年10月15日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号