© 版权声明:本文为博主原创文章,转载请注明出处

JDK动态代理:

  JDK动态代理就是在程序运行期间,根据java的反射机制自动的帮我们生成相应的代理类

优势:

  - 1. 业务类只需要关注业务逻辑本身,保证了业务类的重用性

  - 2. 只需一个动态代理类就可以代理很多接口,大大减少了代理类的规模,便于维护

  - 3. 接口变了,动态代理类也不需要任何改动

劣势:

  - 1. 只能代理有接口的类,不能代理一个没有任何接口的类

实例:

1.项目结构

2.pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.proxy</groupId>
<artifactId>DynamicProxy-JDK</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies> </project>

3.Hello.java

package org.proxy.DynamicProxy_JDK;

/**
* 接口-抽象角色
*
*/
public interface Hello { void say(String name); }

4.HelloImpl.java

package org.proxy.DynamicProxy_JDK;

/**
* 接口实现类-真实角色
*
*/
public class HelloImpl implements Hello { public void say(String name) { System.out.println("Hello!" + name); } }

5.DynamicProxy.java

package org.proxy.DynamicProxy_JDK;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; /**
* 代理角色-动态代理类
*
*/
public class DynamicProxy implements InvocationHandler { private Object target; public DynamicProxy(Object target) { this.target = target; } @SuppressWarnings("unchecked")
public <T> T getProxy() { return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { before();
Object result = method.invoke(target, args);
after();
return result; } private void before() { System.out.println("Before"); } private void after() { System.out.println("After"); } }

6.TestJDKDynamicProxy.java

package org.proxy.test;

import org.junit.Test;
import org.proxy.DynamicProxy_JDK.DynamicProxy;
import org.proxy.DynamicProxy_JDK.Hello;
import org.proxy.DynamicProxy_JDK.HelloImpl; public class TestJDKDynamicProxy { @Test
public void testHello() { Hello hello = new HelloImpl(); DynamicProxy dynamicProxy = new DynamicProxy(hello); Hello helloProxy = dynamicProxy.getProxy(); helloProxy.say("Jack"); } }

7.效果预览

参考:《架构探险-从零开始写Java Web框架》(黄勇著)

最新文章

  1. Android接入支付宝和银联
  2. PHP 用QueryList抓取网页内容
  3. c# 取得ip地址和网关
  4. abap中的弹出窗体函数
  5. css3幻灯片换位效果
  6. perl 安装Net::ZooKeeper
  7. &lt;摘录&gt;详谈高性能TCP服务器的开发
  8. android apk反编译
  9. Django ORM模型的一点体会
  10. html行内元素,块元素,空元素
  11. 输入一个数字n 如果n为偶数则除以2,若为奇数则加1或者减1,直到n为1,求最少次数 写出一个函数
  12. C语言之循环结构
  13. linux各文件夹含义和作用
  14. 一个不错的多叉树, stl风格
  15. source tree图谱
  16. JSON笔记整理
  17. 阿里P9架构师讲解从单机至亿级流量大型网站系统架构的演进过程
  18. MyBatis自动生成Java/C#的Bean(Entity)的等价MYSQL实现函数
  19. vue 中使用keepAlive状态保持
  20. Java序列化接口Serializable接口的作用总结

热门文章

  1. 洛谷——P1706 全排列问题
  2. 洛谷——P1614 爱与愁的心痛
  3. POJ 2987 Firing(最大权闭合图)
  4. [POI2008]Mirror Trap
  5. 当ASP.NET Forms验证方式遭遇苹果IOS
  6. 能上架App的GooglePlay开发者账号获取流程
  7. apache 限制某些目录不能访问通过rewrite实现
  8. Spring随笔之ApplicationContext
  9. 让Mac支持lrzsz
  10. jmap -histo pid 输出的[C [B [I [S methodKlass的含义