zoukankan      html  css  js  c++  java
  • java动态代理

     在目前的Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。

    其实现主要通过是java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。

    Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现

    业务接口

    package com.itmyhome.manager;
    
    public interface UserManager {
    	public void addUser();   //增加用户
    	public boolean delUser(int id); //删除用户
    }
    


    业务接口实现

    package com.itmyhome.manager;
    
    //UserManager接口的实现类
    public class UserManagerImpl implements UserManager {
    
    	@Override
    	public void addUser() {
    		// TODO Auto-generated method stub
    		System.out.println("--addUser()--");
    	}
    
    	@Override
    	public boolean delUser(int id) {
    		// TODO Auto-generated method stub
    		System.out.println("--delUser()--");
    		return true;
    	}
    
    }
    


    InvocationHandler实现 测试在调用接口方法前输出一行代码

    package com.itmyhome.manager;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class ProxyHandler implements InvocationHandler {
    	private Object obj;   //要代理的对象
    	public Object createProxy(Object obj){   //创建代理 
    		this.obj = obj;
    		return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
    				               obj.getClass().getInterfaces(),
    				               this);
    	}
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] args)
    			throws Throwable {   //具体的处理策略 根据方法名判断
    		// TODO Auto-generated method stub
    		check();
    		Object temp = method.invoke(this.obj, args);
    		return temp;
    	}
    	public void check(){
    		System.out.println("---check()---");
    	}
    
    }
    


    测试代码

    package com.itmyhome.manager;
    
    public class Client {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		ProxyHandler handler = new ProxyHandler();
    		UserManager userManager = (UserManager)handler.createProxy(new UserManagerImpl());
    		userManager.addUser();
    		userManager.delUser(1);
    	}
    
    }
    


     

     

     

     

     

     

     

  • 相关阅读:
    【转】 IntelliJ IDEA 详细图解最常用的配置 ,适合刚刚用的新人
    安装IntelliJ IDEA默认C盘文件过大怎么办
    [linux]netstat命令详解-显示linux中各种网络相关信息
    [linux]free命令详解-显示内存的使用情况
    用什么工具能找出性能瓶颈?
    [linux]iostat命令详解-监视系统输入输出设备和CPU的使用情况
    [linux]vmstat命令详解-显示虚拟内存状态
    好文章列表
    BigDecimal.setScale 处理java小数点
    Mybatis通用分页
  • 原文地址:https://www.cnblogs.com/itmyhome/p/4131557.html
Copyright © 2011-2022 走看看