博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
修炼内功--动态代理
阅读量:5226 次
发布时间:2019-06-14

本文共 2139 字,大约阅读时间需要 7 分钟。

动态代理只能代理接口,不能代理某一个类。

动态代理包含面向切面编程,即在不操作原有代码的基础上可以操作原有代码。

动态代理实现步骤:创建代理类实现java.lang.reflect.InvocationHandler接口;创建目标对象,即需要代理的对象;完成Proxy.newProxyInstance()方法,传入的三个参数是难点我认为,第一个是目标对象的装载器(接口的装载器),第二个参数类,第三个参数为InvocationHandler对象。

写代理类有两种方法,但思想是一致的,先写一种。

public interface HelloWorld{
  String say(); } public class HelloWorldImpl{  public String say(){    System.out.println("hello world in proxyhelloworldimpl!");    return "hello world!";  }}/***代理类*/public class DynamicProxy implements InvocationHandler {
  private Object target;   public Object newInstance(Object target){    this.target = target;    //这里的this代表的是invocationhandler对象,也就是DynamicProxy类    return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getClassInterfaces(),this);  }  public Object invoke(Object proxy,Method method,Object[] args)throws Throwable{    System.out.println("before proxy");    //target:目标对象 args:传入的参数,比如调目标对象的那个方法    method.invoke(target,args);    System.out.println("before proxy");    return null;  }}

 

 

写一个main类

public ProxyMain{  public static void main(String[] args){    DynamicProxy dp = new DynamicProxy();    HelloWorld hw = new HelloWorldImpl()'    HelloWorld hwp =(HelloWorld)dp.newInstance(hw);    hwp.say();  }}

 

//执行结果

before proxy!

hello world in proxyhelloworldimpl!

after proxy!

 

还有一种写DynamicProxy类的形式是:

 
public DynamicProxy{  private Object target;  public DynamicProxy(Object target){    this.target = target;  }  public Object invoke(Object proxy,Method method,Object[] args){    System.out.println("before proxy");     method.invoke(target,args);     System.out.println("after proxy");   } } /** *都是利用Proxy.newProxyInstance方法完成代理对象 */ public ProxyMain{   public void static main(String[] args){     HelloWorld hw = new HelloWorldImpl();     InvocationHandler dp = new DynamicProxy(hw);     HelloWorld hwi = (HelloWorld)Proxy.newProxyInstance(HelloWorld.class.getClassLoader,new Class
[]{HelloWorld.class},dp);     hwi.say();   } }
执行结果是和上一个代理类一样的结果。 动态代理的优点就是利用InvocationHandler实现类可以代理接口,不用重写代理类,节省了代码量,达到复用的目的。 //外面的东西容易忘记,内功才是入骨的东西。

转载于:https://www.cnblogs.com/bamaofan/p/5336221.html

你可能感兴趣的文章
C++ FFLIB 之FFDB: 使用 Mysql&Sqlite 实现CRUD
查看>>
Spring-hibernate整合
查看>>
c++ map
查看>>
exit和return的区别
查看>>
js += 含义(小知识)
查看>>
B2321 [BeiJing2011集训]星器 数学&&物理
查看>>
201571030319 四则运算
查看>>
RestTemplate 调用本地服务 connection refused
查看>>
.NET方向高级开发人员面试时应该事先考虑的问题
查看>>
台达PLC modbus 不支持04功能码
查看>>
发布一个JavaScript工具类库jutil,欢迎使用,欢迎补充,欢迎挑错!
查看>>
discuz 常用脚本格式化数据
查看>>
MS CRM 2011 创建基于Fetch的报表 -- 进阶版
查看>>
洛谷P2777
查看>>
PHPStorm2017设置字体与设置浏览器访问
查看>>
SQL查询总结 - wanglei
查看>>
安装cocoa pods时出现Operation not permitted - /usr/bin/xcodeproj的问题
查看>>
makefile中使用变量
查看>>
GIT笔记:将项目发布到码云
查看>>
JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别
查看>>