创建动态代理服务

Java 提供了强大的动态能力,在客户端可以只知道接口来调用本地或者远程的服务。

在客户端只关心接口是什么:
/** */ /**
 *DynamicProxyClient.java
 *2007-4-13
 
*/

package  com.kompakar.tut.proxy.dynamic;

/** */ /**
 * <p>Project: proxyExample</p>
 * <p>Title:  DynamicProxyClient</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright   2007.All rights reserved.</p>
 * 
@author <a href="mailto:benewu(at)gmail.com">Wu Xuefeng</a>
 * 
@version 1.0
 * 
@see 
 
*/


public   class  DynamicProxyClient  ... {

    
/** *//**
     * 
@param args
     
*/

    
public static void main(String[] args) ...{
         
        MyBusiness server 
= BusinessServiceFactory.getDynamicBusinessProxy(MyBusiness.class);
        System.out.println(server.echo(
"Alan!"));

    }


}


 


服务工厂返回一个服务:
/** */ /**
 *BusinessFactory.java
 *2007-4-13
 
*/

package  com.kompakar.tut.proxy.dynamic;

import  java.lang.reflect.InvocationHandler;
import  java.lang.reflect.Proxy;
 
/** */ /**
 * <p>Project: proxyExample</p>
 * <p>Title:  BusinessFactory</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright   2007.All rights reserved.</p>
 * 
@author <a href="mailto:benewu(at)gmail.com">Wu Xuefeng</a>
 * 
@version 1.0
 * 
@see 
 
*/


public   class  BusinessServiceFactory  ... {

      
/** *//**
       * Gets proxy to depending upon debug status in Log4J.
       * 
       * 
@return The proxy to the implementation.
       
*/

      
public static final <T> T  getDynamicBusinessProxy(Class<T>   serviceClass) ...{
          InvocationHandler handler 
= new DynamicBusinessServiceHandler(serviceClass);
        Class[] interfaces 
= new Class[] ...{ serviceClass };
        ClassLoader loader 
= BusinessServiceFactory.class.getClassLoader();
        
return (T) Proxy.newProxyInstance(loader, interfaces, handler);
      }

}


 

DynamicBusinessServiceHandler 是代理的关键,他可以拦截服务调用的方法,并且完成需要做的任务。
/** */ /**
 *DynamicBusinessHandler.java
 *2007-4-13
 
*/

package  com.kompakar.tut.proxy.dynamic;

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

/** */ /**
 * <p>Project: proxyExample</p>
 * <p>Title:  DynamicBusinessHandler</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright   2007.All rights reserved.</p>
 * 
@author <a href="mailto:benewu(at)gmail.com">Wu Xuefeng</a>
 * 
@version 1.0
 * 
@see 
 
*/


public   class  DynamicBusinessServiceHandler  implements  InvocationHandler  ... {
    
     
private Class className;
     
      
public DynamicBusinessServiceHandler(Class name) ...{
          
this.className = name;
    }

      
      
/** *//**
       * You can invoke any service as you wish,for exmaple: local object or a remote service by interface name;
       
*/

    
public Object invoke(Object proxy, Method meth, Object[] args) throws Throwable ...{
         
        
try ...{
            Object impl 
= null;
            impl 
= getServiceByInterfaceName(className);
            Object result 
= meth.invoke(impl, args);
            
return result;
          }
 catch (final InvocationTargetException ex) ...{
            
throw ex.getTargetException();
          }
 
    }


    
/** *//**
     * 
@param interfaceName
     * 
@return
     * 
@throws ClassNotFoundException
     * 
@throws InstantiationException
     * 
@throws IllegalAccessException
     
*/

    
private Object getServiceByInterfaceName(Class interfaceName) throws ClassNotFoundException, InstantiationException, IllegalAccessException ...{
        String interfaceString 
= interfaceName.getName();
        String className 
= interfaceString + "Impl";
        ClassLoader loader 
= DynamicBusinessServiceHandler.class.getClassLoader();
        Class serviceClass 
= Class.forName(className, false, loader);
        
return serviceClass.newInstance();
    }


}


 


当然自定义的接口和实现不可少
/** */ /**
 *IMyBusiness.java
 *2007-4-13
 
*/

package  com.kompakar.tut.proxy.dynamic;

/** */ /**
 * <p>Project: proxyExample</p>
 * <p>Title:  IMyBusiness</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright   2007.All rights reserved.</p>
 * 
@author <a href="mailto:benewu(at)gmail.com">Wu Xuefeng</a>
 * 
@version 1.0
 * 
@see 
 
*/


public   interface  MyBusiness  ... {
    
    
public abstract String echo(String name);
}


 

/** */ /**
 *MyBusinessImple.java
 *2007-4-13
 
*/

package  com.kompakar.tut.proxy.dynamic;

/** */ /**
 * <p>Project: proxyExample</p>
 * <p>Title:  MyBusinessImple</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright   2007.All rights reserved.</p>
 * 
@author <a href="mailto:benewu(at)gmail.com">Wu Xuefeng</a>
 * 
@version 1.0
 * 
@see 
 
*/


public   class  MyBusinessImpl  implements  MyBusiness ... {

    
public String echo(String name) ...{
         
        
return "hello, " + name ;
    }


}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获取动态代理对象可以使用Java中的Proxy类和InvocationHandler接口,具体步骤如下: 1. 定义接口 首先需要定义一个接口,该接口是被代理类和代理类共用的接口。 2. 实现InvocationHandler接口 创建一个实现InvocationHandler接口的类,该类中需要重写invoke()方法,该方法中定义了代理对象的具体行为。 3. 获取代理对象 使用Proxy类的静态方法newProxyInstance()获取代理对象,该方法需要传入三个参数:ClassLoader对象、Class[]对象和InvocationHandler对象,其中ClassLoader对象用来加载代理类,Class[]对象用来获取代理类所实现的接口列表,InvocationHandler对象用来实现代理类的行为。 举个例子: ``` public interface IUserService { void login(String username, String password); } public class UserService implements IUserService { @Override public void login(String username, String password) { System.out.println("登录成功:" + username + " " + password); } } public class UserServiceProxy implements InvocationHandler { private Object target; public UserServiceProxy(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("代理开始"); Object result = method.invoke(target, args); System.out.println("代理结束"); return result; } } public class Test { public static void main(String[] args) { IUserService userService = new UserService(); UserServiceProxy userServiceProxy = new UserServiceProxy(userService); ClassLoader classLoader = userService.getClass().getClassLoader(); Class[] interfaces = userService.getClass().getInterfaces(); IUserService proxy = (IUserService) Proxy.newProxyInstance(classLoader, interfaces, userServiceProxy); proxy.login("admin", "123456"); } } ``` 以上代码中,UserServiceProxy类是代理类,实现了InvocationHandler接口,并在invoke()方法中定义了代理对象的行为。Test类中获取代理对象的步骤如下: 1. 创建被代理类对象userService。 2. 创建代理类对象userServiceProxy,并将被代理类对象userService作为参数传入。 3. 获取被代理类userService的ClassLoader对象和接口列表,并将其作为参数传入Proxy.newProxyInstance()方法。 4. 获取代理对象proxy,将其转换为被代理类接口类型IUserService。 5. 通过代理对象proxy调用login()方法,在控制台输出代理开始、登录成功和代理结束三个信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值