欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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
【代理操作】关闭连接通道.