懒惰是程序员的第一生产力
再写一篇鸡肋文作为今年的第一篇博文…
BANNER

去年写了一个简陋版的打印Banner的方法 链接 需要先在网页上获取Banner保存在项目中,使用起来还是有些麻烦,于是做了些改进:
- 利用
@Banner注解给方法添加Banner (Banner在本地自动生成) - 添加
@Cache注解保存本地生成的Banner,提高效率 - 提供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;
}
本文介绍了一种利用注解简化Banner打印的方法,通过@Banner和@Cache注解,实现了Banner的自动生成和缓存,提高了代码的效率和可读性。

2492

被折叠的 条评论
为什么被折叠?



