java 中动态代理详解及实例

 更新时间:2017年06月05日 09:05:57   投稿:lqh  
这篇文章主要介绍了java 中动态代理详解及实例的相关资料,需要的朋友可以参考下

Java动态代理相关

先来看静态代理模式代码:

package test; 
 
public interface Subject 
{ 
 public void doSomething(); 
} 

package test; 
public class RealSubject implements Subject{ 
 public void doSomething() { 
 System.out.println( "call doSomething()" ); 
 } 
} 

package test; 
public class SubjectProxy implements Subject { 
 Subject subimpl = new RealSubject(); 
 public void doSomething() { 
 subimpl.doSomething(); 
 } 
} 
package test; 
public class TestProxy { 
 public static void main(String args[]) { 
 Subject sub = new SubjectProxy();  
 sub.doSomething(); 
 } 
} 

刚开始我会觉得SubjectProxy定义出来纯属多余,直接实例化实现类完成操作不就结了吗?后来随着业务庞大,你就会知道,实现proxy类对真实类的封装对于粒度的控制有着重要的意义。但是静态代理这个模式本身有个大问题,如果类方法数量越来越多的时候,代理类的代码量是十分庞大的。所以引入动态代理来解决此类问题。

先看代码:

package test; 
 
public interface Subject 
{ 
 public void doSomething(); 
} 
package test; 
public class RealSubject implements Subject { 
 public void doSomething() { 
 System.out.println( "call doSomething()" ); 
 } 
} 
package test; 
import java.lang.reflect.InvocationHandler; 
import java.lang.reflect.Method; 
import java.lang.reflect.Proxy; 
public class ProxyHandler implements InvocationHandler { 
 private Object tar; //绑定委托对象,并返回代理类 
 public Object bind(Object tar) { 
 this.tar = tar; //绑定该类实现的所有接口,取得代理类 
 return Proxy.newProxyInstance(tar.getClass().getClassLoader(), tar.getClass().getInterfaces(), this); 
 } 
 public Object invoke(Object proxy , Method method , Object[] args)throws Throwable { 
 Object result = null; 
 //这里就可以进行所谓的AOP编程了 
 //在调用具体函数方法前,执行功能处理 
 result = method.invoke(tar,args); 
 //在调用具体函数方法后,执行功能处理 
 return result; 
 } 
} 
public class TestProxy { 
public static void main(String args[]) { 
 ProxyHandler proxy = new ProxyHandler(); //绑定该类实现的所有接口 
 Subject sub = (Subject) proxy.bind(new RealSubject()); 
 sub.doSomething(); 
 } 
} 

看完代码,现在我来回答,动态代理的作用是什么:

Proxy类的代码量被固定下来,不会因为业务的逐渐庞大而庞大;

可以实现AOP编程,实际上静态代理也可以实现,总的来说,AOP可以算作是代理模式的一个典型应用;

解耦,通过参数就可以判断真实类,不需要事先实例化,更加灵活多变。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • 关于Idea中的.properties文件显示问题

    关于Idea中的.properties文件显示问题

    这篇文章主要介绍了关于Idea中的.properties文件显示问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • idea 模板编程知识小结

    idea 模板编程知识小结

    这篇文章主要介绍了idea 模板编程的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java数据结构最清晰图解二叉树前 中 后序遍历

    Java数据结构最清晰图解二叉树前 中 后序遍历

    树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形象表示
    2022-01-01
  • 通过Maven进行jedis连接redis的实现

    通过Maven进行jedis连接redis的实现

    这篇文章主要介绍了通过Maven进行jedis连接redis的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • 使用SpringMVC返回json字符串的实例讲解

    使用SpringMVC返回json字符串的实例讲解

    下面小编就为大家分享一篇使用SpringMVC返回json字符串的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • spring-boot-maven-plugin未指定版本导致的编译错误问题

    spring-boot-maven-plugin未指定版本导致的编译错误问题

    这篇文章主要介绍了spring-boot-maven-plugin未指定版本导致的编译错误问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Java分布式学习之Kafka消息队列

    Java分布式学习之Kafka消息队列

    Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据
    2022-07-07
  • SpringBoot通过Filter实现整个项目接口的SQL注入拦截详解

    SpringBoot通过Filter实现整个项目接口的SQL注入拦截详解

    这篇文章主要介绍了SpringBoot通过Filter实现整个项目接口的SQL注入拦截详解,SQL注入是比较常见的网络攻击方式之一,在客户端在向服务器发送请求的时候,sql命令通过表单提交或者url字符串拼接传递到后台持久层,最终达到欺骗服务器执行恶意的SQL命令,需要的朋友可以参考下
    2023-12-12
  • 浅谈spring和spring MVC的区别与关系

    浅谈spring和spring MVC的区别与关系

    下面小编就为大家带来一篇浅谈spring和spring MVC的区别与关系。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • SpringBoot中的事务全方位详解

    SpringBoot中的事务全方位详解

    这篇文章主要介绍了SpringBoot中的事务全方位详解,在Spring中,事务有两种实现方式,分别是编程式事务管理和声明式事务管理两种方式,文中举例详细说明了这两种事务,需要的朋友可以参考下
    2023-08-08

最新评论