Java自定义生成Banner你们不喜欢吗?(注解版)

本文介绍了一种利用注解简化Banner打印的方法,通过@Banner和@Cache注解,实现了Banner的自动生成和缓存,提高了代码的效率和可读性。

懒惰是程序员的第一生产力

再写一篇鸡肋文作为今年的第一篇博文…

BANNER

在这里插入图片描述
去年写了一个简陋版的打印Banner的方法 链接 需要先在网页上获取Banner保存在项目中,使用起来还是有些麻烦,于是做了些改进:

  1. 利用@Banner注解给方法添加Banner (Banner在本地自动生成)
  2. 添加@Cache注解保存本地生成的Banner,提高效率
  3. 提供5种Banner字体和5种输出颜色

基本使用方法:

一. @Banner注解

1.添加jar依赖

banner01.jar 点击下载 free

2.在方法上添加@Banner注解,设置打印内容(name),打印字体(type),打印颜色(color)

public class Obj{
	@Banner(name="Crawford",type= BannerType.Crawford2,color = BannerColor.Red)
	public void Crawford2(){}
}

3.使用BannerMan类代理Obj后执行添加@Banner注解的方法

public class BannerTest {
    @Test
    public void test() {
        Obj proxy = (Obj) new BannerMan(new Obj()).create();  
        proxy.Crawford2();
    
    }
}

@@@ 感觉还是有点繁琐,挠挠头
打印效果图
在这里插入图片描述

二.@Cache注解

因为banner是根据@Banner注解的name属性值从本地库中遍历拼接出的所以会有一定时耗,而Banner name固定后一般不会改变,所以启用@Cache将上次运行时生成的banner保存在本地,下次运行就无需再次生成了

使用方式:
直接添加在方法上即可

public class Obj{
	@Cache
	@Banner(name="Ansi",type= BannerType.Ansi,color = BannerColor.Bule)
	public void Ansi(){}
}
public class BannerTest {
    @Test
    public void test() {
        Obj proxy = (Obj) new BannerMan(new Obj()).create();  
        proxy.Ansi();
    }
}

打印效果图
在这里插入图片描述

三. 字体及颜色

五种字体:
position是本地字库中25个英文字母的起止位置坐标

package com.cooooode;

public enum BannerType {

    Ansi("Ansi", 6,217,new int[]{0,8,16,24,32,40,48,57,65,68,76,84,92,103,113,123,130,139,147,155,164,173,182,192,200,209,217}),
    Doom("Doom", 6,184,new int[]{0,7,14,21,28,35,42,49,56,63,70,77,84,92,99,106,113,120,127,134,141,148,155,163,170,177,184}),
    Crawford2("Crawford2", 7, 187, new int[]{0, 7, 14, 21, 28, 35, 42, 49, 56, 62, 69, 76, 83, 92, 99, 106, 113, 120, 127, 134, 142, 149, 156, 166, 173, 180, 187}),
    Modular("Modular",7,231,new int[]{0,9,18,27,36,45,54,63,72,77,86,95,104,113,122,131,140,149,159,168,177,186,195,204,213,222,231}),
    Graffiti("Graffiti",6,273,new int[]{0,11,22,33,44,55,66,77,88,93,103,113,123,134,145,156,167,178,189,200,211,221,232,244,253,263,273});

    private final String name;
    private final int row;
    private final int col;

    private final int[] position;

    private BannerType(String name, int row, int col, int[] position) {
        this.name = name;
        this.row = row;
        this.col = col;
        this.position = position;
    }

    public String getName() {
        return this.name;
    }

    public int getRow() {
        return this.row;
    }

    public int getCol() {
        return this.col;
    }

    public int[] getPosition() {
        return this.position;
    }
}

五种颜色:
当然你也可以添加

package com.cooooode;

public enum BannerColor {
    /*
    控制台打印颜色
     */
    Red("\033[31;0m","\033[0m"),
    Green("\033[32;0m","\033[0m"),
    Yellow("\033[33;0m","\033[0m"),
    Blue("\033[34;0m","\033[0m"),
    Purple("\033[35;0m","\033[0m");

    private String prefix;
    private String suffix;
    private BannerColor(String prefix  ,String suffix){
        this.prefix=prefix;
        this.suffix=suffix;
    }

    public String getPrefix() {
        return prefix;
    }

    public String getSuffix() {
        return suffix;
    }
}


核心是使用了cglib代理
如果没有添加@Cache注解,添加了@Banner注解则先生成banner在打印(BannerLocalTool.printAfterGet(banner, false),false表示不保存).如果添加@Cache注解和@Banner注解则判断是否有本地文件(BannerLocalTool.exist(banner)) 如果有则直接打印banner (BannerLocalTool.print(banner)),如果没有则先生成banner在打印(BannerLocalTool.printAfterGet(banner, true),true表示保存),并且保存.

    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        Cache cache = method.getAnnotation(Cache.class);
        Banner banner = method.getAnnotation(Banner.class);
        if (cache != null) {
            if (banner != null) {
                if (BannerLocalTool.exist(banner)) {
                    System.out.println("@Cache");
                    BannerLocalTool.print(banner);
                } else {
                    BannerLocalTool.printAfterGet(banner, true);
                }
            }
        } else {
            if (banner != null)
                BannerLocalTool.printAfterGet(banner, false);
        }


        Object invoke = method.invoke(target, objects);
        return invoke;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值