InvocationHandler+工厂设计模式 实现动态代理
2014-01-16 11:33
453 查看
工厂类
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");
}
}
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");
}
}
相关文章推荐
- 设计模式之动态代理 jdk实现
- 设计模式学习之代理模式(二)--CGLIB实现对Class动态代理
- 系统架构设计——设计模式之代理模式(二)CGLIB动态代理实现
- 设计模式学习——动态代理实现C#动态调用WebService(附源码)
- 设计模式之 动态代理 - ThreadLocal实现事务管理
- GOF23设计模式之动态代理模式实现之经典
- 设计模式之动态代理(Java的JDK动态代理实现)
- 设计模式--CGLib动态代理的实现与解析
- 动态代理技术实现设计模式-代理模式
- 设计模式:用Java动态代理实现AOP
- Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理
- Java设计模式之代理模式2-动态代理(jdk实现)
- 设计模式--JDK动态代理的实现与原理解析(1)
- 设计模式--JDK动态代理的实现与原理解析(2)
- 设计模式-java实现动态代理
- 设计模式之动态代理的代码实现(Java)
- Android设计模式之动态代理,实现方法拦截功能
- 设计模式的应用-动态代理实现事务控制
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- 设计模式之 动态代理模式