java中的动态代理

来源:互联网 发布:office软件图标 编辑:程序博客网 时间:2024/06/04 17:55
java JDK中的动态代理:

代理模式是Java 设计模式中很常用的一种设计模式,它的特点是代理类和被代理类具有相同的接口,这样代理类才能代理被代理类。当我们执行被代理类的某些方法的时候,委托给代理类,代理类可以在被代理类方法的执行前后多做一些事情。类似于Spring中的AOP
代理类可分为两种形似。一种为静态代理类,由程序开发人员自己编写代理类;另外一种为动态代理类,在程序运行时,运用反射机制动态生成。动态代理类不需要程序开发人员编写源代码。运用Java的反射机制生成,扩展容易。

java.lang.reflect 包中的Proxy类和InvocationHandler接口提供了生成动态代理类的功能。

Proxy类通过静态方法创建代理类和代理类的实例

下面通过一个简单的实例讲解如何使用动态代理

首先创建一个简单的接口IHello,其中只有一个方法sayHello,无论是常规类,还是代理类都需要实现此接口。

 

代码:创建接口

//接口的定义
public interface UserService {
 
 public void addUser();
 
 public void updateUser();
 
 public void deleteUser();

}

 

实现接口类

//接口的实现
public class IUserService implements UserService{

 @Override
 public void addUser() {
  System.out.println("this is a add user");
  
 }

 @Override
 public void deleteUser() {
  System.out.println("this is a delete user");
  
 }

 @Override
 public void updateUser() {
  System.out.println("this is a update user");
  
 }

}
创建动态代理:

在这里你要添加业务方法的时候就不需要在接口里面进行改动也不需要进行里面的源代码,这样让你的程序更简单更具有可读性

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//进行权限的判断
public class AdminClass implements InvocationHandler {
 
 //创建一个目标
 Object target;
 //进行动态的代理机制
 public Object createProxyAdmin(Object target){
  this.target = target;
  //这里有三个参数  1.动态代理目标的classloader   2.动态代理目标的interface   3.目标 这里是当前的  可以用this
  return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
 }

 @Override
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  //进行权限的判断   这里和拦截器差不多的原理
  adminTest();
  Object o = method.invoke(target, args);   //这里返回一个object对象
  return o;
 }
 //进行权限的业务方法
 private void adminTest(){
  System.out.println("this is a admin test");
 }

}

测试单元的代码:

public class Clien {

 /**
  * 客户端的代码
  */
 public static void main(String[] args) {
  AdminClass ac = new AdminClass();
  UserService us = (UserService) ac.createProxyAdmin(new IUserService());    //这里是面向一个接口
        us.addUser();
 }

}

 

 

原创粉丝点击