动态代理(一个小程序)

本文介绍了一个具体的Java动态代理实现案例,展示了如何通过InvocationHandler接口和Proxy类创建动态代理对象,并以UserManager接口及其实现类为例,说明了如何利用动态代理进行方法调用前后的日志记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态代理类(以下简称为代理类)是一个实现在创建类时在运行时指定的接口列表的类,该类具有下面描述的行为。 代理接口 是代理类实现的一个接口。代理实例 是代理类的一个实例。 每个代理实例都有一个关联的调用处理程序 对象,它可以实现接口 InvocationHandler。通过其中一个代理接口的代理实例上的方法调用将被指派到实例的调用处理程序的 Invoke 方法,并传递代理实例、识别调用方法的 java.lang.reflect.Method 对象以及包含参数的 Object 类型的数组。调用处理程序以适当的方式处理编码的方法调用,并且它返回的结果将作为代理实例上方法调用的结果返回。

UserManager
public interface UserManager { 
public void addUser(String userId, String userName);
public void delUser(String userId);
public void modifyUser(String userId, String userName);
public String findUser(String userId);
}



UserManagerImpl

public class UserManagerImpl implements UserManager {  
   public void addUser(String userId, String userName) {    
 try{
System.out.println("UserManagerImpl-->>addUser userId="+userId);     }catch(Exception e){        
  throw new RuntimeException();  
   }  
   }     
public void delUser(String userId) {       
   System.out.println("UserManagerImpl-->>delUser userId="+userId);     }    
public String findUser(String userId) {         System.out.println("UserManagerImpl-->>findUser userId="+userId);       
  return "张三";    
 }     
public void modifyUser(String userId, String userName) {      System.out.println("UserManagerImpl-->>modifyUser userId="+userId); }     }


LogHandlerimport
java.lang.reflect.InvocationHandler; 
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class LogHandler implements InvocationHandler {   
  private Object targetObject;    
public Object newProxyInstance(Object targetObject){         this.targetObject = targetObject;    
     return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);     }   
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {      
   System.out.println("start-->"+ method.getName());         for(int i=0; i>" + method.getName());   
  }catch(Exception e){      
    e.printStackTrace();   
  System.out.println("error-->>" + method.getName());    
     }     return ret;     }     }

Clientpublic class Client {
/** * @param args */public static void main(String[] args) {     LogHandler logHandler = new LogHandler();   
  UserManager userManager = (UserManager)logHandler.newProxyInstance(new UserManagerImpl());    
 //userManager.addUser("0001", "张三");  
   String name = userManager.findUser("0001");     System.out.println("name==" + name);   
  }     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值