乐字节-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());
}
}
乐字节-Java8新特性之Base64和重复注解与类型注解的更多相关文章
- 乐字节-Java8新特性-接口默认方法
总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...
- 乐字节-Java8新特性-接口默认方法之Stream流(下)
接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 ...
- 乐字节-Java8新特性之Date API
上一篇文章,小乐给大家带来了Java8新特性之Optional,接下来本文将会给大家介绍Java8新特性之Date API 前言: Java 8通过发布新的Date-Time API来进一步加强对日期 ...
- 乐字节-Java8新特性之方法引用
上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...
- 乐字节-Java8新特性之函数式接口
上一篇小乐带大家学过 Java8新特性-Lambda表达式,那什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口 ...
- 乐字节-Java8新特性之Optional
上一篇小乐带大家了解了Java新特性之Stream,接下来将会继续述说Java新特性之Optional Optional<T>类(java.util.Optional)是一个容器类,代表一 ...
- 乐字节-Java8新特性之Stream流(上)
上一篇文章,小乐给大家介绍了<Java8新特性之方法引用>,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分. 1.什么是流? Java Se中对于 ...
- 乐字节-Java8新特性-Lambda表达式
上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...
- 乐字节-Java8核心特性实战之Lambda表达式
大家好,小乐又来给大家分享Java8核心特性了,上一篇文章是<乐字节|Java8核心实战-接口默认方法>,这次就来讲Java8核心特征之Lambda表达式. Java8 引入Lambda表 ...
随机推荐
- python函数(一)
python函数(一) 1.函数的定义: def test(): print('test is running...') return 定义一个函数,有3个部分需要注意: 函数名称.函数的命名规范与变 ...
- uasrt配置
Universal Synchronous/Asynchronous Receiver/Transmitter 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式.同步要有一个 ...
- salt 配置管理
索引 saltstack入门 salt state sls 描述文件 saltstack配置管理高级功能 saltstack入门 192.168.86.3 salt 修改 [root@Zabbix-s ...
- cobbler学习
note.youdao.com/share/?id=2f8383d6e9824929012b041f069da26e&type=note#/ IPADDR=192.168.86.4 TYPE= ...
- js-运动函数(盒子运动)
注意move的js包在另一篇文章 <!DOCTYPE html><html> <head> <meta charset="UTF-8"&g ...
- MyBatis 源码分析 - 配置文件解析过程
* 本文速览 由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括.本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于settings,typeAl ...
- Python脱产8期 Day014 2019/4/28
一 带参装饰器 1.通常,装饰器为被装饰的函数添加新功能,需要外界的参数 # -- outer参数固定一个,就是func # -- inner参数固定同被装饰的函数,也不能添加新参数 # -- 可以借 ...
- 读入挂(IO)
快如闪电,清华杜瑜皓的读入挂,一模一样代码,加了这个之后... 细思极恐,and 整整行!!! namespace IO{ #define BUF_SIZE 100000 #define OUT_SI ...
- Java的接口、继承与多态
接口 java只支持单继承,即一个类只能有一个父类,因此需要接口来实现多重继承. 接口的定义 类和接口的区别:一个类通过继承接口的方式,从而来继承接口的抽象方法.类描述对象的属性和方法,接口则包含类要 ...
- [原]Windows Azure开发之Linux虚拟机
Windows Azure是微软的云服务集合,用来提供云在线服务所需要的操作系统与基础存储与管理的平台,是微软的云计算的核心组成组件之一.其中windows azure提供的最重要的一项服务就是虚 ...