InvocationHandler+工厂设计模式 实现动态代理

工厂类

package proxy;

import java.lang.reflect.Proxy;

/**
 * 接口工厂
 * @author lizh
 * @date  2014-1-16上午11:31:34
 * @fileName Factory.java
 * @package proxy
 * @project Test
 */
public class Factory {
 public static <T> T instance(Class<T> c){
  if(c.isInterface()){
   InterfaceAnno anno = c.getAnnotation(InterfaceAnno.class);
   if(anno == null){
    System.out.println("接口未使用InterfaceAnno标签");
   }else{
    String implClass = anno.implClass();
    try {
     Class<?> cl = Class.forName(implClass);
     return (T) Proxy.newProxyInstance(c.getClassLoader(),new Class[]{c}, new MyInvocationHandler(cl));
    } catch (ClassNotFoundException e) {
     e.printStackTrace();
    }
   }
  }else{
   return (T) Proxy.newProxyInstance(c.getClassLoader(),c.getInterfaces(), new MyInvocationHandler(c));
  }
  return null;
 }
}


 

接口实现类标签

package proxy;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface InterfaceAnno {
 String implClass();
}

handle

package proxy;

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

/**
 * handler类
 * @author lizh
 * @date  2014-1-16上午11:30:55
 * @fileName MyInvocationHandler.java
 * @package proxy
 * @project Test
 */
public class MyInvocationHandler implements InvocationHandler{
 private Class<?> service =null;
 
 public MyInvocationHandler() {
 }
 public MyInvocationHandler(Class<?> service){
  this.service = service;
 }
 @Override
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  System.out.print(method.getName()+"准备执行");
  Object a = method.invoke(service.newInstance(), args);
  return a;
 }
 public Class<?> getService() {
  return service;
 }
 public void setService(Class<?> service) {
  this.service = service;
 }

 

}

测试接口

package proxy;

@InterfaceAnno(implClass="proxy.ShoppingImpl")
public interface Shopping {
 void doSomeThing();
 void pay();
}

测试实现类

package proxy;

public class ShoppingImpl implements Shopping{

 @Override
 public void doSomeThing() {
  System.out.println("doSomeThing");
 }

 @Override
 public void pay() {
  System.out.println("pay");
 }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值