樂字節-Java8新特性之Base64和重複註解與類型註解

上一篇小樂給你們說了《樂字節-Java8新特性之Date API》,接下來小樂繼續給你們說一說Java8新特性之Base64和重複註解與類型註解。java

1、Base64

在Java 8中,內置了Base64編解碼相關的特性。Java 8中使用三種類型的Base64編解碼:segmentfault

  • 簡易模式:輸出是徹底按照A-Za-z0-9+/字符集映射的。編碼不會本身增長輸出行,解碼器也不會接受任何超出A-Za-z0-9+/範圍的內容。
  • URL模式:輸出基於A-Za-z0-9+/的映射,但對於URL和文件名是安全的。
  • MIME模式:輸出對於MIME類型的內容是友好的。若是超過76個字符,則會換行輸出。,而且換行符n以後會自動添加一個r。若是某行沒有r則說明輸出的內容已經結束。

一、Base64 內部類與方法

Base64相關的內部類:安全

  • Base64.Encoder:這是一個靜態類。實現了Base64的編碼功能,格式遵循了RFC 4648和RFC 2045標準。
  • Base64.Decoder:也是一個靜態類。實現了Base64的解碼功能。

相關的方法:app

  • getEncoder():該方法返回一個使用基本Base64編碼格式的Encoder對象。相反的解碼方法是getDecoder()。
  • getUrlEncoder():該方法返回一個使用URL類型的Base64編碼格式的Encoder對象。相反的解碼方法是getUrlDecoder()。
  • getMimeEncoder():該方法返回一個使用MIME類型的Base64編碼格式的Encoder對象。相反的解碼方法是getMimeDecoder()。

二、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);
    }

2、重複註解與類型註解

Java5引入了註解特性,使得開發更加的靈活,特別是如今不少的應用都是基於註解零配置開發,都是創建在Annotation基礎之上,同時使得開發變得簡單,Java 8對註解處理提供了兩點改進:可重複的註解及可用於類型的註解。 一般用於框架底層代碼開發dom

一、可重複註解定義與使用

/**
 * 定義可重複註解
 */
@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());
    }
}

二、用於類型的註解

@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());
    }
}
相關文章
相關標籤/搜索