专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java中动态代理使用(java 动态代理使用场景)

temp10 2024-10-04 12:33:02 java教程 9 ℃ 0 评论

相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象。

代理模式

Java中动态代理使用(java 动态代理使用场景)

使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过代理类来调用目标方法,代理类会将所有的方法调用分派到目标对象上反射执行,还可以在分派过程中添加”前置通知”和后置处理(如在调用目标方法前校验权限,在调用完目标方法后打印日志等)等功能。

使用动态代理的五大步骤

  1. 通过实现InvocationHandler接口来自定义自己的InvocationHandler;
  2. 通过Proxy.getProxyClass获得动态代理类
  3. 通过反射机制获得代理类的构造方法,方法签名为getConstructor(InvocationHandler.class)
  4. 通过构造函数获得代理对象并将自定义的InvocationHandler实例对象传为参数传入
  5. 通过代理对象调用目标方法

动态代理的使用

import java.lang.reflect.Proxy;

public class MyProxy {
 public interface IHello{
 void sayHello();
 }
 static class Hello implements IHello{
 @Override
 public void sayHello() {
 System.out.println("Hello World");
 }
 }
 static class MyInvocationHandler implements InvocationHandler{
 private Object target;//目标对象
 public MyInvocationHandler(Object target){
 this.target=target;
 }
 public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
 System.out.println("before");
 Object rs=method.invoke(target,args);
 System.out.println("after");
 return rs;
 }
 }
 public static void main(String [] args){
// System.out.println("test");
 System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");
 IHello iHello=(IHello) Proxy.newProxyInstance(IHello.class.getClassLoader(),//加载接口的类加载器
 new Class[]{IHello.class},
 new MyInvocationHandler(new Hello()));
 iHello.sayHello();
 }
}

输出结果

before
Hello World
after

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表