乐趣区

乐字节-Java8新特性之Base64和重复注解与类型注解

上一篇小乐给大家说了《乐字节 -Java8 新特性之 Date API》,接下来小乐继续给大家说一说 Java8 新特性之 Base64 和重复注解与类型注解。
一、Base64
在 Java 8 中,内置了 Base64 编解码相关的特性。Java 8 中使用三种类型的 Base64 编解码:

简易模式:输出是完全按照 A -Za-z0-9+/ 字符集映射的。编码不会自己增加输出行,解码器也不会接受任何超出 A -Za-z0-9+/ 范围的内容。
URL 模式:输出基于 A -Za-z0-9+/ 的映射,但对于 URL 和文件名是安全的。
MIME 模式:输出对于 MIME 类型的内容是友好的。如果超过 76 个字符,则会换行输出。,并且换行符 n 之后会自动添加一个 r。如果某行没有 r 则说明输出的内容已经结束。

1、Base64 内部类与方法
Base64 相关的内部类:

Base64.Encoder:这是一个静态类。实现了 Base64 的编码功能,格式遵循了 RFC 4648 和 RFC 2045 标准。
Base64.Decoder:也是一个静态类。实现了 Base64 的解码功能。

相关的方法:

getEncoder():该方法返回一个使用基本 Base64 编码格式的 Encoder 对象。相反的解码方法是 getDecoder()。
getUrlEncoder():该方法返回一个使用 URL 类型的 Base64 编码格式的 Encoder 对象。相反的解码方法是 getUrlDecoder()。
getMimeEncoder():该方法返回一个使用 MIME 类型的 Base64 编码格式的 Encoder 对象。相反的解码方法是 getMimeDecoder()。

2、Base64 使用
对于 Base64 应用场景 无论是传统软件还是互联网项目开发都是比较常见的,比如传统的邮件,Http Url 地址通常都会应用 Base64 来对协议内容或 Url 地址信息进行编解码操作。

public static void main(String[] args) throws Exception {
// 使用基本的 Base64 编码
String base64encodedString = Base64.getEncoder()
.encodeToString(“java8 is so Easy!!!”.getBytes(“utf-8”));
System.out.println(“Basic base64 encoding:” + base64encodedString);
// 解码并输出结果
byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString);
System.out.println(“Original content: ” + new String(base64decodedBytes, “utf-8”));
// 使用 URL 类型的 Base64 编码
base64encodedString = Base64.getUrlEncoder().encodeToString(“https://www.sina.com”.getBytes(“utf-8”));
System.out.println(“URL base64 encoding:” + base64encodedString);
// MIME 类型的 Base64 编码
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 10; ++i) {
stringBuilder.append(UUID.randomUUID().toString());
}
byte[] mimeBytes = stringBuilder.toString().getBytes(“utf-8”);
String mimeEncodedString = Base64.getMimeEncoder().encodeToString(mimeBytes);
System.out.println(“MIME base64 encoding:” + mimeEncodedString);
}

二、重复注解与类型注解
Java5 引入了注解特性,使得开发更加的灵活,特别是现在很多的应用都是基于注解零配置开发,都是建立在 Annotation 基础之上,同时使得开发变得简单,Java 8 对注解处理提供了两点改进:可重复的注解及可用于类型的注解。通常用于框架底层代码开发
1、可重复注解定义与使用
/**
* 定义可重复注解
*/
@Repeatable(MyParams.class)
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyParam {
String value() default “”;
}

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyParams {
MyParam[] value();
}

// 使用注解 方法上标注重复注解
@MyParam(“hello”)
@MyParam(“java8”)
public void testAnnotation(){
System.out.println(“ 可重复注解测试 …”);
}

/**
查找指定方法级别注解 遍历输出注解 value 值
*/
public static void main(String[] args) throws Exception{
Class<TestAnnotation> clazz = TestAnnotation.class;
Method method = clazz.getMethod(“testAnnotation”);
MyParam[] params = method.getAnnotationsByType(MyParam.class);
for (MyParam param : params) {
System.out.println(param.value());
}
}

2、用于类型的注解
@Repeatable(MyParams.class)
@Target({ElementType.FIELD, ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyParam {
String value() default “”;
}
// 使用
public class TestAnnotation {
private MyParam param;// 定义成员变量 param 类型为 MyParam 注解类型
public static void main(String[] args) throws Exception{
// 获取成员变量 并输出变量类型
Field field= clazz.getDeclaredField(“param”);
System.out.println(field);
System.out.println(field.getType());
}
}

退出移动版