zoukankan      html  css  js  c++  java
  • JDK动态代理简单小程序

    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测试的结果为:
    拦截的功能
    添加啦=======
    拦截的功能
    删除操作==
    
    
    
    
    我们可以看到  我们在每一个调用的方法钱都加上了想要添加的方法


  • 相关阅读:
    Network Flows(借助ortools)
    【转】一张图看懂IaaS, PaaS和SaaS的区别
    论文中的一些符号 O(big-Oh) Ω(big-omega) Θ(big-theta)
    最大流问题
    4 Mininet测量路径的损耗率
    3 Mininet命令延伸实验拓展
    2 Mininet可视化应用
    快速定位问题
    软中断与软中断的排查
    系统出现大量不可中断进程与僵尸进程
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3147028.html
Copyright © 2011-2022 走看看