Annotation整合工厂设计模式
程序员文章站
2022-05-03 22:24:53
代码如下: 运行结果: ......
annotation 是为了提供配置处理操作的,这些配置可以通过反射实现,本课程主要讲解 annotation 与工厂设计模式的整合处理操作。
代码如下:
package com.anno.demo; import java.lang.annotation.elementtype; import java.lang.annotation.retention; import java.lang.annotation.retentionpolicy; import java.lang.annotation.target; import java.lang.reflect.invocationhandler; import java.lang.reflect.method; import java.lang.reflect.proxy; interface imessage{ //业务接口 public void send(string msg); //输出业务 } class cloudmessageimpl 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 factory{ private factory() {} public static <t> t getinstance(class<t> clazz) { //返回实例化对象 try { //利用反射获取实例化对象 return (t) new messageproxy().bind(clazz.getdeclaredconstructor().newinstance()); } catch (exception e) { return null; } } } 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(); } } } @target({elementtype.type, elementtype.method}) //只能用在类和方法上 @retention(retentionpolicy.runtime) @interface usemessage{ public class<?> clazz(); //定义要使用的类型 } @usemessage(clazz = cloudmessageimpl.class) //annotation定义使用类。红色部分可以修改为其他实现类,实现调用不同类输出。 class messageservice{ private imessage message; //定义业务处理 public messageservice() { usemessage use = messageservice.class.getannotation(usemessage.class); this.message = (imessage) factory.getinstance(use.clazz()); //通过annotation获取 } public void send(string msg) { this.message.send(msg); } } public class anno { public static void main(string[] args) { messageservice messageservice = new messageservice(); //实例化接口对象 messageservice.send("www.sina.com.cn"); //调用方法 } }
运行结果:
【代理操作】进行消息发送通道的连接. 【云消息发送】www.sina.com.cn 【代理操作】关闭连接通道.
下一篇: MongoDB的基本使用