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

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

程序员文章站 2022-03-30 22:18:12
上一篇小乐给大家说了《乐字节-Java8新特性之Date API》,接下来小乐继续给大家说一说Java8新特性之Base64和重复注解与类型注解。 一、Base64 在Java 8中,内置了Base64编解码相关的特性。Java 8中使用三种类型的Base64编解码: 简易模式:输出是完全按照A-Z ......

上一篇小乐给大家说了《乐字节-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());
        }
    }