Java8 新特性——其它

Base64编码解码 

Java提供了一个Base64类来处理加密。您可以使用提供的方法对数据进行加密和解密。您需要在源文件中导入java.util.Base64才能使用其方法。 

 此类提供了三种不同的编码器和解码器,用于在每个级别上加密信息。您可以在以下级别使用这些方法。

Base64工具类提供了一套静态方法获取下面三种BASE64编解码器:

  • 基本:输出被映射到一组字符A-Za-z0-9+/,编码不添加任何行标,输出的解码仅支持A-Za-z0-9+/。
  • URL:输出映射到一组字符A-Za-z0-9+_,输出是URL和文件。
  • MIME:输出隐射到MIME友好格式。输出每行不超过76字符,并且使用'\r'并跟随'\n'作为分割。编码输出最后没有行分割。

Base64的内部类

内嵌类 描述
static class Base64.Decoder

该类实现一个解码器用于,使用 Base64 编码来解码字节数据。

static class Base64.Encoder

该类实现一个编码器,使用 Base64 编码来编码字节数据。

Base64的方法 

方法描述
public static Base64.Decoder getDecoder()返回一个Base64.Decoder,它使用Basic类型的base64编码方案进行解码。
public static Base64.Encoder getEncoder()返回一个Base64.Encoder,它使用Basic类型的base64编码方案进行编码。
public static Base64.Decoder getUrlDecoder()返回一个Base64.Decoder,该URL使用URL和Filename安全类型base64编码方案进行解码。
public static Base64.Decoder getMimeDecoder()返回一个使用MIME类型base64解码方案进行解码的Base64.Decoder。
public static Base64.Encoder getMimeEncoder()返回一个使用MIME类型base64编码方案进行编码的Base64.Encoder。
public static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator)返回一个Base64.Encoder,它使用具有指定行长和行分隔符的MIME类型base64编码方案进行编码。
public static Base64.Encoder getUrlEncoder()返回一个Base64.Encoder,它使用URL和Filename安全类型base64编码方案进行编码。

 Base64.Decoder的方法

方法描述
public byte[] decode(byte[] src)使用Base64编码方案解码输入字节数组中的所有字节,并将结果写入新分配的输出字节数组中。返回的字节数组具有所得字节的长度。
public byte[] decode(String src)使用Base64编码方案将Base64编码的String解码为新分配的字节数组。
public int decode(byte[] src, byte[] dst)使用Base64编码方案对输入字节数组中的所有字节进行解码,并将结果从偏移量0开始写入给定的输出字节数组。
public ByteBuffer decode(ByteBuffer buffer)使用Base64编码方案对输入字节缓冲区中的所有字节进行解码,并将结果写入新分配的ByteBuffer中。
public InputStream wrap(InputStream is)返回用于解码Base64编码的字节流的输入流。

 Base64.Encoder的方法

方法描述
public byte[] encode(byte[] src)使用Base64编码方案将指定字节数组中的所有字节编码为新分配的字节数组。返回的字节数组具有所得字节的长度。
public int encode(byte[] src, byte[] dst)使用Base64编码方案对指定字节数组中的所有字节进行编码,并将结果字节从偏移量0开始写入给定的输出字节数组。
public String encodeToString(byte[] src)使用Base64编码方案将指定的字节数组编码为String。
public ByteBuffer encode(ByteBuffer buffer)使用Base64编码方案将指定字节缓冲区中的所有剩余字节编码为新分配的ByteBuffer。返回时,源缓冲区的位置将更新到其极限;其限制将不会更改。返回的输出缓冲区的位置将为零,其限制将为生成的编码字节数。
public OutputStream wrap(OutputStream os)包装输出流,以使用Base64编码方案对字节数据进行编码。
public Base64.Encoder withoutPadding()返回一个编码器实例,该实例与该实例等效,但在编码的字节数据的末尾不添加任何填充字符。

 Base64案例:基本编码和解码

import java.util.Base64;  
publicclass Base64BasicEncryptionExample {  
    publicstaticvoid main(String[] args) {  
        // Getting encoder  
        Base64.Encoder encoder = Base64.getEncoder();  
        // Creating byte array  
        bytebyteArr[] = {1,2};  
        // encoding byte array  
        bytebyteArr2[] = encoder.encode(byteArr);  
        System.out.println("Encoded byte array: "+byteArr2);  
        bytebyteArr3[] = newbyte[5];                // Make sure it has enough size to store copied bytes  
        intx = encoder.encode(byteArr,byteArr3);    // Returns number of bytes written  
        System.out.println("Encoded byte array written to another array: "+byteArr3);  
        System.out.println("Number of bytes written: "+x);  
      
        // Encoding string  
        String str = encoder.encodeToString("Yiidian".getBytes());  
        System.out.println("Encoded string: "+str);  
        // Getting decoder  
        Base64.Decoder decoder = Base64.getDecoder();  
        // Decoding string  
        String dStr = new String(decoder.decode(str));  
        System.out.println("Decoded string: "+dStr);  
    }  
}  

 Base64案例:URL编码和解码

import java.util.Base64;  
publicclass Base64BasicEncryptionExample {  
    publicstaticvoid main(String[] args) {  
        // Getting encoder  
        Base64.Encoder encoder = Base64.getUrlEncoder();  
        // Encoding URL  
        String eStr = encoder.encodeToString("http://www.yiidian.com/java/".getBytes());  
        System.out.println("Encoded URL: "+eStr);  
        // Getting decoder  
        Base64.Decoder decoder = Base64.getUrlDecoder();  
        // Decoding URl  
        String dStr = new String(decoder.decode(eStr));  
        System.out.println("Decoded URL: "+dStr);  
    }  
}  

 Base64案例:MIME编码和解码

import java.util.Base64;  
publicclass Base64BasicEncryptionExample {  
    publicstaticvoid main(String[] args) {  
        // Getting MIME encoder  
        Base64.Encoder encoder = Base64.getMimeEncoder();  
        String message = "Hello, \nYou are informed regarding your inconsistency of work";  
        String eStr = encoder.encodeToString(message.getBytes());  
        System.out.println("Encoded MIME message: "+eStr);  
          
        // Getting MIME decoder  
        Base64.Decoder decoder = Base64.getMimeDecoder();  
        // Decoding MIME encoded message  
        String dStr = new String(decoder.decode(eStr));  
        System.out.println("Decoded message: "+dStr);   
    }  
}  

方法参数反射

Java提供了一项新功能,您可以在其中获得任何方法或构造函数的形式参数的名称。java.lang.reflect包包含所有必需的类,例如Method和Parameter,可用于参数反射。

Method类

Method类提供有关类或接口上的单个方法的信息。反射的方法可以是类方法或实例方法。 

Method类的方法 

方法描述
public boolean equals(Object obj)将此Method与指定对象进行比较。如果对象相同,则返回true。如果两个方法由相同的类声明且具有相同的名称,形式参数类型和返回类型,则它们是相同的。
public AnnotatedType getAnnotatedReturnType()返回一个AnnotatedType对象,该对象表示使用一种类型来指定方法/构造函数的返回类型。
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)如果存在这样的注释,它将为指定的类型返回该元素的注释,否则返回null。NullPointerException-如果给定的注释类为null
public Annotation[] getDeclaredAnnotations()返回直接存在于此元素上的注释。此方法将忽略继承的注释。如果此元素上没有直接存在的注释,则返回值为长度为0的数组。此方法的调用者可以随意修改返回的数组。它对返回给其他调用方的数组没有影响。
public Class<?> getDeclaringClass()返回表示该类或接口的Class对象,该类或接口声明此对象表示的可执行文件。
public Object getDefaultValue()返回此Method实例表示的注释成员的默认值。
public Class<?>[] getExceptionTypes()返回一个Class对象数组,这些对象表示声明为由此对象表示的基础可执行文件引发的异常的类型。
public Type[] getGenericExceptionTypes()返回一个Type对象数组,这些对象表示声明为此可执行对象引发的异常。如果基础可执行文件在throws子句中未声明任何异常,则它将返回长度为0的数组。它引发以下异常: GenericSignatureFormatError-如果通用方法签名不符合Java虚拟机规范中指定的格式。 TypeNotPresentException-如果基础可执行文件的throws子句引用了不存在的类型声明。 MalformedParameterizedTypeException-如果基础可执行文件的throws子句引用了由于某种原因而无法实例化的参数化类型。
public Type[] getGenericParameterTypes()返回代表形式参数类型的Type对象数组。它引发以下异常: GenericSignatureFormatError-如果通用方法签名不符合Java虚拟机规范中指定的格式。 TypeNotPresentException-如果基础可执行文件的任何参数类型引用了不存在的类型声明。 MalformedParameterizedTypeException-如果任何基础可执行文件的参数类型引用由于某种原因而无法实例化的参数化类型。
public int getModifiers()返回此对象表示的可执行文件的Java语言修饰符。
public String getName()以String形式返回此Method对象表示的方法的名称。
public Annotation[][] getParameterAnnotations()返回一个数组数组,这些数组按声明顺序表示此对象表示的可执行文件的形式参数和隐式参数上的注释。
public int getParameterCount()返回此对象表示的可执行文件的形式参数数量。
public Class<?>[] getParameterTypes()返回代表形式参数类型的Class对象数组。按照此对象表示的可执行文件的声明顺序。如果基础可执行文件不接受任何参数,它将返回长度为0的数组。
public Class<?> getReturnType()返回一个Class对象,该对象表示此Method对象表示的方法的形式返回类型。
public TypeVariable<Method>[] getTypeParameters()以声明顺序返回TypeVariable对象数组,这些对象代表此GenericDeclaration对象表示的泛型声明所声明的类型变量。如果此通用声明的通用签名不符合《 Java虚拟机规范》中指定的格式,则会引发GenericSignatureFormatError。
public int hashCode()为此方法返回一个哈希码。哈希码被计算为基础方法的声明类名和方法名的哈希码的异或。
public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException在具有指定参数的指定对象上调用此Method对象表示的基础方法。如果基础方法是静态的,则忽略指定的obj参数。它可以为空。如果基础方法所需的形式参数数量为0,则提供的args数组的长度可以为0或为null。如果基础方法是实例方法,则使用《 Java语言规范》中所述的动态方法查找来调用它。如果基础方法是静态的,则声明该方法的类(如果尚未初始化)将被初始化。如果该方法正常完成,则它将返回的值返回给invoke的调用者。
public boolean isBridge()如果此方法是桥接方法,则返回true。否则返回false。
public boolean isDefault()如果此方法是默认方法,则返回true,否则返回false。默认方法是公共的非抽象实例方法,即以接口类型声明的带有主体的非静态方法。
public boolean isSynthetic()如果此可执行文件是合成构造,则返回true;否则,返回true。否则返回false。
public boolean isVarArgs()如果声明该可执行文件采用可变数量的参数,则返回true;否则,返回true。否则返回false。
public String toGenericString()返回描述此Method的字符串,包括类型参数。
public String toString()返回一个字符串。

Parameter类

Parameter类提供有关方法参数的信息,包括其名称和修饰符。它还提供了获取参数属性的替代方法。

Parameter类的方法

方法描述
public boolean equals(Object obj)根据可执行文件和索引进行比较。
public AnnotatedType getAnnotatedType()返回一个AnnotatedType对象,该对象表示使用一种类型来指定此Parameter表示的形式参数的类型。
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)如果存在这样的注释,它将为指定的类型返回此元素的注释,否则为null。如果给定的注释类为null,则抛出NullPointerException。
public Annotation[] getAnnotations()返回此元素上存在的注释。如果此元素上没有注释,则返回值为长度为0的数组。
public <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass)返回与此元素关联的注释。如果没有与此元素相关联的注释,则返回值为长度为0的数组。此方法与AnnotatedElement.getAnnotation(Class)之间的区别在于,此方法检测其参数是否为可重复的注释类型(JLS 9.6),如果是这样,则尝试通过“浏览”容器注释来查找该类型的一个或多个注释。如果给定的注释类为null,则抛出NullPointerException。
public <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass)如果直接存在此元素的注释,则它会返回指定类型的注释,否则返回null。此方法将忽略继承的注释。如果给定的注释类为null,则抛出NullPointerException。
public Annotation[] getDeclaredAnnotations()返回直接存在于此元素上的注释。此方法将忽略继承的注释。如果此元素上没有直接存在的注释,则返回值为长度为0的数组。
public <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass)如果直接存在或间接存在,则它将为指定类型返回此元素的注释。此方法将忽略继承的注释。如果此元素上没有直接或间接存在的指定注释,则返回值为长度为0的数组。此方法与AnnotatedElement.getDeclaredAnnotation(Class)之间的区别是该方法检测其参数是否为可重复的注释类型( JLS 9.6),如果是这样,则尝试通过“浏览”容器注释(如果存在)来查找该类型的一个或多个注释。该方法的调用者可以随意修改返回的数组;它对返回给其他调用方的数组没有影响。如果给定的注释类为null,则抛出NullPointerException
public Executable getDeclaringExecutable()返回声明此参数的Executable。
public int getModifiers()返回此Parameter对象表示的参数的修饰符标志。
public String getName()返回参数的名称。如果存在参数的名称,则此方法返回由类文件提供的名称。否则,此方法将合成形式为argN的名称,其中N是声明该参数的方法的描述符中参数的索引。
public Type getParameterizedType()返回一个Type对象,该对象标识此Parameter对象表示的参数的参数化类型。
public Class<?> getType()返回一个Class对象,该对象标识此Parameter对象表示的参数的声明类型。
public int hashCode()mul int arg0 int arg1 add int arg0 int arg1基于可执行文件的哈希码和索引返回哈希码。
public boolean isImplicit()如果此参数在源代码中隐式声明,则返回true。否则,返回false。
public boolean isNamePresent()如果参数具有根据类文件的名称,则返回true,否则返回false。
public boolean isSynthetic()如果在源代码中既未隐式也未显式声明此参数,则返回true。否则返回false。
public boolean isVarArgs()如果此参数表示变量参数列表,则返回true;否则,返回true。否则返回false。
public String toString()返回一个描述此参数的字符串。格式是参数的修饰符(如果有的话),按照Java语言规范。

Nashorn, JavaScript引擎

Nashorn是JavaScript引擎。它用于在JVM(Java虚拟机)上动态执行JavaScript代码。Java提供了用于执行JavaScript代码的命令行工具jjs。

Nashorn JavaScript Engine 在 Java 15 已经不可用了。 

jjs 

jjs是个基于Nashorn引擎的命令行工具。它接受一些JavaScript源代码为参数,并且执行这些源代码。 

# 创建一个具有如下内容的sample.js文件:
print('Hello World!');

#打开控制台,输入以下命令:
$ jjs sample.js

jjs 交互式编程

打开控制台,输入以下命令:

$ jjs
jjs> print("Hello, World!")
Hello, World!
jjs> quit()

传递参数

打开控制台,输入以下命令:

$ jjs -- a b c
jjs> print('字母: ' +arguments.join(", "))
字母: a, b, c
jjs> 

 Java 中调用 JavaScript

 使用 ScriptEngineManager, JavaScript 代码可以在 Java 中执行

import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
 
public class Java8Tester {
   public static void main(String args[]){
   
      ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
      ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn");
        
      String name = "Runoob";
      Integer result = null;
      
      try {
         nashorn.eval("print('" + name + "')");
         result = (Integer) nashorn.eval("10 + 2");
         
      }catch(ScriptException e){
         System.out.println("执行脚本错误: "+ e.getMessage());
      }
      
      System.out.println(result.toString());
   }
}

 JavaScript 中调用 Java

var BigDecimal = Java.type('java.math.BigDecimal');

function calculate(amount, percentage) {

   var result = new BigDecimal(amount).multiply(
   new BigDecimal(percentage)).divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_EVEN);
   
   return result.toPlainString();
}

var result = calculate(568000000000000000023,13.9);
print(result);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值