開發者學堂課程【Java 進階程式設計:工廠設計模式與 Annotation 整合】學習筆記,與課程緊密聯系,讓使用者快速學習知識。
課程位址:
https://developer.aliyun.com/learning/course/20/detail/398工廠設計模式與 Annotation 整合
内容簡介:
1.Annotation 操作
2.Annotation 操作特征
已經清楚 Annotation 的整體作用,但是 Annotation 到底在開發之中能做哪些事情呢?為了幫助大家進一步了解 Annotation 的處理目的,下面将結合工廠設計模式來應用 Annotation 操作。
(1).程式代碼
1)
package cn. mldn. demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
IMessage msg = Factory.getInstance(MessageImpl.class);
Msg.send(“www.mldn.cn”);
}
}
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;
}
}
}
class MessageProxy implenents InvocationHandler {
private Object target ;
public Object bind(Object target) {
this.target=target ;
return Proxy . nenProxyInstance(target . getClass().getClassLoader(), target . getClass(). getInterfaces(),this); }
}
public boolean connect() {
System. out . printIn(" [代理操作]通行消息發送通道的連接配接。");
return true ;
}
public void close() {
System. out .printIn(" [代理操作]關閉連接配接通道。");
}
@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();
}
interface IMessage {
public void send(String msg) ;
}
class MessageImpl implements IMessage {
@Override
public void send(String msg) {
System. out. printIn(" [消息發送]”+ msg);
}
}
這個代碼是基礎的動态代理與 getInstance()的結合,調用了 send()方法。
代碼就完成了,程式執行結果如下:
[代理操作]進行消息發送通道的連接配接。
[消息發送] www. mldn. cn
[代理操作]關閉連接配接通道。
2)以上代碼發揮不出操作特色,更進階的代碼如下:
public class JavaAPIDemo {
public static void main(String[ ] args) throws Exception {
MessageService messageService = new MessageService() ;
messageService. send( "www. mldn.cn");
}
}
class MessageService {
private IMessage message ;
public MessageService() {
this.message = Factory . getInstance (MessageImpl.class) ;
}
public void send(String msg) {
this . message. send(msg);
}
}
執行結果如下:
[消息發送] www . mldn. cn
3)以上是一個标準的工廠與動态代理結合的形式,但也可以按下面代碼操作:
@Retention(RetentionPolicy . RUNTIME)
@interface UseMessage {
public Class<?> clazz() ;
}
@UseMessage(clazz=MessageImpl.class ) // 利用Annotation實作了類的使用
class MessageService {
private IMessage message ;
public Messageservice() {
UseMessage use = Messageservice. Class. getAnnotation(UseHessage.class) ;
}
Class<?>clazz=use.clazz();
this.message =Factory. getInstence(use.clazz()) ; //直接通過Annotation擷取
Public void send(string msg) {
This.message. send(msg);
}
}
[消息發送] Www. mldn. cn
4)如果要想更換子類,部分程式代碼如下:
class NetMessageImpl implements IMessage {
@Override
public void send(String msg) {
System. out. print1n(" [網絡消息發送]”+ msg);
}
}
此時把 Annotation 更換就完成了:
@UseMessage(clazz=NetMessageImpl.class)
// 利用 Annotation 實作了類的使用
程式執行結果如下:
[網貉消息發送] www. mldn. cn
這樣就成了網絡消息發送。
2. Annotation 操作特征
由于 Annotation 的存在,是以對于面向接口的程式設計的配置處理将可以直接利用Annotation 的屬性完成控制,進而使得整體代碼變得簡潔。