你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Java专栏
JDK动态代理简单小程序
 

[java]  Jdk动态代理 
 
1.动态代理使用的情况:需要在多个方法上加上相同的逻辑的时候,需要用到动态代理。 
  原因:在多个方法上写相同的逻辑,第一费事,第二在不用的时候维护麻烦 
 
使用动态代理需要用到两个类:分别为Proxy,InvocationHandler,用InvocationHandel来实现JDK中动态代理的接口,Proxy来生成对应的类的代理类。 
 
代码来说明 
  首先创建一个类来实现InvocationHandel 
   
package cn.csdn.service; 
 
import java.lang.reflect.InvocationHandler; 
import java.lang.reflect.Method; 
 
//动态代理实现  
public class LogInterceptor implements InvocationHandler { 
    // 被代理对象  
    private Object target; 
 
    public Object getTarget() { 
        return target; 
    } 
 
  // 通过往里面设置值来确定被代理的对象  
    public void setTarget(Object target) { 
        this.target = target; 
    } 
 
    public void beforeMethod() { 
        System.out.println("拦截的功能"); 
    } 
 
    @Override 
    public Object invoke(Object proxy, Method method, Object[] args) 
            throws Throwable { 
        beforeMethod(); 
    // 调用被代理的对象    target是传过来的那个接口     args是接口所对应的类  
        method.invoke(target, args); 
        return null; 
    } 

 
然后再创建代理类对象 
    @Test 
    public void test() { 
        //被代理对象     把这个接口对应的方法加上逻辑   是它要进行代理  
        UserDao userDao = new UserDaoImpl(); 
         
        //实现了InvocationHander的接口的类          
        LogInterceptor logInterceptor = new LogInterceptor(); 
        logInterceptor.setTarget(userDao); 
         
        //三个参数 (classLoader, 被代理对象都实现类哪些接口,进行代理的类)  
    UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),new Class[]{UserDao.class}, logInterceptor); 
        userDaoProxy.addUser(); 
        userDaoProxy.delete(); 
    } 
注:new Class[]{UserDao.class}  和 UserDao.getClass().getInterfaces()是一样的,前者是数组,肯定定义多个接口,后者是定义一个接口 
 
UserDao和UsreDaoImpl中就是放了两个方法,分别为addUser(),delete() 
 
UserDao接口 
public interface UserDao { 
    public void addUser(); 
    public void delete(); 

 
UserDaoImpl类 
public class UserDaoImpl implements UserDao { 
    @Override 
    public void addUser() { 
        // TODO Auto-generated method stub  
        System.out.println("添加啦======="); 
    } 
    @Override 
    public void delete() { 
        // TODO Auto-generated method stub  
        System.out.println("删除操作==");   
    } 

 
Junit测试的结果为: 
拦截的功能 
添加啦======= 
拦截的功能 
删除操作== 

Jdk动态代理

1.动态代理使用的情况:需要在多个方法上加上相同的逻辑的时候,需要用到动态代理。
  原因:在多个方法上写相同的逻辑,第一费事,第二在不用的时候维护麻烦

使用动态代理需要用到两个类:分别为Proxy,InvocationHandler,用InvocationHandel来实现JDK中动态代理的接口,Proxy来生成对应的类的代理类。

代码来说明
  首先创建一个类来实现InvocationHandel
  
package cn.csdn.service;

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

//动态代理实现
public class LogInterceptor implements InvocationHandler {
 // 被代理对象
 private Object target;

 public Object getTarget() {
  return target;
 }

  // 通过往里面设置值来确定被代理的对象
 public void setTarget(Object target) {
  this.target = target;
 }

 public void beforeMethod() {
  System.out.println("拦截的功能");
 }

 @Override
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  beforeMethod();
 // 调用被代理的对象    target是传过来的那个接口     args是接口所对应的类
  method.invoke(target, args);
  return null;
 }
}

然后再创建代理类对象
 @Test
 public void test() {
  //被代理对象     把这个接口对应的方法加上逻辑   是它要进行代理
  UserDao userDao = new UserDaoImpl();
  
  //实现了InvocationHander的接口的类       
  LogInterceptor logInterceptor = new LogInterceptor();
  logInterceptor.setTarget(userDao);
  
  //三个参数 (classLoader, 被代理对象都实现类哪些接口,进行代理的类)
 UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),new Class[]{UserDao.class}, logInterceptor);
  userDaoProxy.addUser();
  userDaoProxy.delete();
 }
注:new Class[]{UserDao.class}  和 UserDao.getClass().getInterfaces()是一样的,前者是数组,肯定定义多个接口,后者是定义一个接口

UserDao和UsreDaoImpl中就是放了两个方法,分别为addUser(),delete()

UserDao接口
public interface UserDao {
 public void addUser();
 public void delete();
}

UserDaoImpl类
public class UserDaoImpl implements UserDao {
 @Override
 public void addUser() {
  // TODO Auto-generated method stub
  System.out.println("添加啦=======");
 }
 @Override
 public void delete() {
  // TODO Auto-generated method stub
  System.out.println("删除操作=="); 
 }
}

Junit测试的结果为:
拦截的功能
添加啦=======
拦截的功能
删除操作==
[java]

[java]   

[java]  我们可以看到  我们在每一个调用的方法钱都加上了想要添加的方法 

我们可以看到  我们在每一个调用的方法钱都加上了想要添加的方法

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089