上一篇:反射取得Annotation信息 | 带你学《Java语言高级特性》之九十七
【本节目标】
本节介绍了工厂设计模式与Annotation整合的案例应用。
整合工厂设计模式与Annotation
现在已经清楚了Annotation的整体作用,但是Annotation到底在开发中能做哪些事情呢?为了进一步理解Annotation的处理目的,下面将结合工厂设计模式来应用Annotation操作。
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
//IMessage msg = Factory.getInstance(MessageImpl.class);
//msg.send("www.mldn.cn")
MessageService messageService=new MessageService();
messageService.send("www.mldn.cn");
}
}
@Retention(RetentionPolicy.RUNTIME)
@interface UserMessage{
public Class <?> clazz();
}
@UserMessage(clazz =MessageImpl.class ) //利用Annotation实现了类的使用
class MessageService{
private IMessage message;
public MessageService(){
UserMessage use=MessageService.class.getAnnotation(UserMessage.class);
this.message = (IMessage)Factory.getInstance(use.clazz()); //直接通过Annotation获取
}
public void send(String msg){
this.msg.send(msg);
}
}
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;
}
}
}
interface IMessage {
public void send(String msg);
}
class MessageImpl implements IMessage {
@Override
public void send(String msg) {
System.out.println("【消息发送】"+msg);
}
}
class NetMessageImpl implements IMessage {
@Override
public void send(String msg) {
System.out.println("【网络消息发送】"+msg);
}
}
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();
}
}
}
执行结果:
更换
@UserMessage(clazz =NetMessageImpl.class )
执行结果:
由于Annotation的存在,所以面向接口的编程处理将可以直接利用Annotation的属性完成控制,从而使得整体代码变得整洁。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学