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


  • 相关阅读:
    iOS中Zbar二维码扫描的使用
    SOJ 1135. 飞跃原野
    SOJ 1048.Inverso
    SOJ 1219. 新红黑树
    SOJ 1171. The Game of Efil
    SOJ 1180. Pasting Strings
    1215. 脱离地牢
    1317. Sudoku
    SOJ 1119. Factstone Benchmark
    soj 1099. Packing Passengers
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3147028.html
Copyright © 2011-2022 走看看