Annotation整合工厂设计模式和代理设计模式
1 定义要被代理的接口
package Annotation整合工厂设计模式和代理设计模式;
public interface IMessage {
void send(String msg);
}
2 定义要被代理的接口的实现类
package Annotation整合工厂设计模式和代理设计模式;
public class CloundMessageImpl implements IMessage{
@Override
public void send(String msg) {
System.out.println("云发送消息:"+msg);
}
}
package Annotation整合工厂设计模式和代理设计模式;
public class NetMessageImpl implements IMessage {
@Override
public void send(String msg) {
System.out.println("网络消息发送:"+msg);
}
}
3 定义一个实现InvocationHandler的子类
package Annotation整合工厂设计模式和代理设计模式;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MessageProxy implements InvocationHandler {
private Object target;
public Object bind(Object target){
this.target=target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
public boolean connect(){
System.out.println("代理操作-->进行消息发送通道的连接");
return true;
}
public void close(){
System.out.println("代理操作-->关闭消息发送通道");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
if (this.connect()){
return method.invoke(this.target,args);
}else {
throw new Exception("[error]消息无法进行发送!");
}
} finally {
this.close();
}
}
}
4 定义工厂类 Factory
package Annotation整合工厂设计模式和代理设计模式;
import java.lang.reflect.InvocationTargetException;
public class Factory {
private Factory() {
}
public static <T> T getInstance(Class<T> clazz){
try {
return (T)new MessageProxy().bind(clazz.getDeclaredConstructor().newInstance());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
5 定义注解类UseMessage
package Annotation整合工厂设计模式和代理设计模式;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface UseMessage {
public Class<?> clazz();
}
6 定义发送消息的服务类 MessageService
package Annotation整合工厂设计模式和代理设计模式;
@UseMessage(clazz = CloundMessageImpl.class)
public class MessageService {
private IMessage iMessage;
public MessageService() {
UseMessage message = MessageService.class.getAnnotation(UseMessage.class);
iMessage =(IMessage) Factory.getInstance(message.clazz());
}
public void send(String msg){
iMessage.send(msg);
}
}
7 测试
package Annotation整合工厂设计模式和代理设计模式;
public class Test {
public static void main(String[] args) {
MessageService messageService= new MessageService();
messageService.send("学习使我快乐");
}
}
常用反射中有关注解的API
boolean isAnnotationPresent(Class annotationClass); 判断当前对象是否有指定的注解,有则返回true,否则返回false。
T getAnnotation(Class<T> annotationClass); 获得当前对象上指定的注解对象。
Annotation[] getAnnotations(); 获得当前对象及其从父类上继承的所有的注解对象。
Annotation[] getDeclaredAnnotations();获得当前对象上所有的注解对象,不包括父类的。