java中常用用具类介绍

记录下java中常用得工具类,以便开发使用方便快捷。

java中常用用具类介绍

spring工具类

文件操作

加载资源文件

 @Test
public void test() throws IOException {
    //----------------- FileSourceExample ----------------------------
    String filePath = String.format("D:\\temp\\%s","java_demo.txt");
    //使用系统文件路径方式加载文件,获取resource对象
    Resource resource = new FileSystemResource(filePath);
    //可以利用resource获取输入流
    InputStream inputStream = resource.getInputStream();
    System.out.println(resource.getFilename());
    //使用类路径方式加载文件,获取resource对象
    Resource res = new ClassPathResource("application.properties");
    System.out.println(res.getFilename());

    //----------------------ResourceUtilsExample
    //不显式使用 Resource 实现类
    //提供了一个 ResourceUtils 工具类,它支持“classpath:”和“file:”的地址前缀,它能够从指定的地址加载文件资源
    File clsFile = ResourceUtils.getFile("classpath:application.properties");
    System.out.println(clsFile.getName());
    File file = ResourceUtils.getFile("fire:" + filePath);
    System.out.println(file.getName());
}

结果

java_demo.txt
application.properties
application.properties
java_demo.txt

操作文件

@Test
public void test1() throws IOException {
    Resource resource = new ClassPathResource("application.properties");
    //1  将文件内容拷贝到一个 字节数组 byte[] 中
    byte[] byteArray = FileCopyUtils.copyToByteArray(resource.getFile());
    System.out.println(new String(byteArray, Charset.forName("utf8")));
    // 将文件内容拷贝到一个 String 中
    String s = FileCopyUtils.copyToString(new FileReader(resource.getFile()));
    System.out.println(s);
    // 将文件内容拷贝到另一个目标文件
    String s1 = resource.getFile().getParent() + "\\application2.properties";
    File file = new File(s1);
    FileCopyUtils.copy(resource.getFile(), file);

    // 将文件内容拷贝到一个输出流中,字节数组输出流
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    FileCopyUtils.copy(resource.getInputStream(),byteArrayOutputStream);

    // new ByteArrayInputStream("".getBytes());

    //加载资源文件
    Properties props = PropertiesLoaderUtils.loadAllProperties("application.properties");
    System.out.println(props.getProperty("username"));

    //防止乱码
    EncodedResource encodedResource = new EncodedResource(resource,"UTF-8");
    String content  = FileCopyUtils.copyToString(encodedResource.getReader());
}

web工具类

@Test
public void test2(HttpServletRequest request) throws IOException {
    //根据request 获取 cookie 值
    Cookie name = WebUtils.getCookie(request, "name");
    //根据request 获取 session 值
    Object name1 = WebUtils.getSessionAttribute(request, "name");
}

路径匹配

  • ?匹配一个字符
  • *匹配0个或多个字符
  • **匹配0个或多个目录

AntPathMatcher默认路径分隔符为“/”,而在匹配文件路径时,需要注意Windows下路径分隔符为“\”,Linux下为“/”,写法即为

AntPathMatcher matcher = new AntPathMatcher(File.separator);
AntPathMatcher matcher = new AntPathMatcher(System.getProperty("file.separator"));
AntPathMatcher matcher = new AntPathMatcher();
@Test
 public void test3() throws IOException {
     AntPathMatcher matcher = new AntPathMatcher();
     matcher.match("/a/b/?", "/a/b/c"); // true
     matcher.match("/a/b/*", "/a/b/abc"); // true
     matcher.match("/a/b/**", "/a/b/cde/abc"); // true
 }

占位符解析

 @Test
public void tes(){
    //设置前置与后置
    PropertyPlaceholderHelper helper = new PropertyPlaceholderHelper("${", "}");
    String text = "name: ${name},age: ${age}";
    Properties props = new Properties();
    props.setProperty("name", "张三");
    props.setProperty("age", "22");
    String s = helper.replacePlaceholders(text, props);
    System.out.println(s); // name: 张三,age: 22

    //递归替换属性
    props.setProperty("username","${name} ${age}");
    String username = "real name ${username}";
    String s1 = helper.replacePlaceholders(username, props);
    System.out.println(s1); // real name 张三 22
}

获取方法参数名字

@Test
public void test4() throws NoSuchMethodException {
    Class<? extends Demo> aClass = this.getClass();
    Method method = aClass.getDeclaredMethod("method",String.class, String.class);
    ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();
    String[] parameterNames = parameterNameDiscoverer.getParameterNames(method);
    for (String parameterName : parameterNames) {
        System.out.println(parameterName); // a b
    }
}

UUID 生成器

代替 jdk 的 UUID 生成器,效率更高

@Test
public void test4() {
    AlternativeJdkIdGenerator alternativeJdkIdGenerator = new AlternativeJdkIdGenerator();
    System.out.println(alternativeJdkIdGenerator.generateId());
}

反射工具类

 @Test
public void test4() throws InvocationTargetException, IllegalAccessException {
   //访问属性
   Person person = new Person("张三", 18);
   Field field = ReflectionUtils.findField(Person.class, "name");
   //强制访问
   field.setAccessible(true);
   System.out.println(ReflectionUtils.getField(field, person)); //张三
   ReflectionUtils.setField(field,person,"李四");
   System.out.println(person); // Person{name='李四', age=18}

   //访问方法
   Method getName = ReflectionUtils.findMethod(Person.class, "getName");
   System.out.println(getName.invoke(person)); //李四

   //获取类的所有方法
   Method[] allDeclaredMethods = ReflectionUtils.getAllDeclaredMethods(Person.class);
   //只会保留一个同名的方法(保留子类的)
   Method[] uniqueDeclaredMethods = ReflectionUtils.getUniqueDeclaredMethods(Person.class);

}

class Person{

   private String name;
   private int age;

   public Person(String name, int age) {
       this.name = name;
       this.age = age;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       this.age = age;
   }

   @Override
   public String toString() {
       return "Person{" +
               "name='" + name + '\'' +
               ", age=" + age +
               '}';
   }
}

序列化工具类

对象与二进制的相互转化。(基于JDK的序列化方式)

public static byte[] serialize(@Nullable Object object);
public static Object deserialize(@Nullable byte[] bytes);

StringUtils

建议使用apache的工具类,主要较少几个比较常用的工具类。

操作文件方法

 //获取文件后缀,以点分割
StringUtils.unqualify("Hello.java"); // java
//获取以指定分隔符最后一个字符
StringUtils.unqualify("com/cn/Hello.java", File.separatorChar); // Hello.java
//首字母大写
StringUtils.capitalize("zhangsan"); // Zhangsan
//首字母小写
StringUtils.uncapitalize("Java"); // java
//获取文件名
StringUtils.getFilename("/a/b.txt"); // b.txt
//获取后缀
StringUtils.getFilenameExtension("/a/b.txt"); // txt
//截取掉文件路径后缀
StringUtils.stripFilenameExtension("/a/b.txt"); // /a/b
//找到给定的文件,和另一个相对路径的文件,返回第二个文件的全路径,不支持 ../
StringUtils.applyRelativePath("d:/a/b/c.java", "d/e.java"); //d:/a/b/d/e.java
//清理文件路径,这个方法配合applyRelativePath就可以计算一些简单的相对路径了
StringUtils.cleanPath("d:/a/b/../c/d.java");  // d:/a/c/d.java
StringUtils.cleanPath("d:/a/b\\c/d.java"); // d:/a/b/c/d.java  \\ ----> /
// 组合使用,处理简单路径
String s1 = StringUtils.cleanPath(StringUtils.applyRelativePath("d:/a/b/c.java", "../../d/e.java")); // d:/d/e.java
System.out.println(s1);

其余操作

 @Test
public void test6(){
    //判断从指定索引开始,是否匹配子字符串
    StringUtils.substringMatch("abcdefg", 0, "a"); // true
    //判断子字符串在字符串中出现的次数
    StringUtils.countOccurrencesOf("ababaabab", "ab"); // 4
    //在字符串中使用子字符串替换
    StringUtils.replace("cdcdcdcd", "cd", "ee"); // eeeeeeee
    //删除所有匹配的子字符串.
    StringUtils.delete("cdcdcdcd", "c"); // dddd
    //删除子字符串中任意出现的字符
    StringUtils.deleteAny("cdcdcdcd", "card"); // ""
    //在字符串前后增加单引号
    StringUtils.quote("hello"); // 'hello'

    //只会分割第一次
    String[] split = StringUtils.split("zhangsan.cn.ag", ".");  // [zhangsan , cn.ag]
    String[] strings = StringUtils.delimitedListToStringArray("zhangsan.cn.ag", ".");// [zhangsan , cn , ag]
    System.out.println();
}

断言工具类

apache工具类

lang3

EnumUtils

  1. getEnum(Class enumClass, String enumName) 通过类返回一个枚举
  2. getEnumList(Class enumClass) 返回一个枚举集合
  3. getEnumMap(Class enumClass) 返回一个枚举map
  4. isValidEnum(Class enumClass, String enumName) 验证enumName是否在枚举中,boolean
@Test
public void test7() {
    // 通过类返回一个枚举,可能返回空
    Student xiaoxuesheng = EnumUtils.getEnum(Student.class, "XIAOXUESHENG");
    System.out.println(xiaoxuesheng.type); // 1
    // 通过类返回一个枚举集合
    List<Student> enumList = EnumUtils.getEnumList(Student.class);
    //返回一个枚举map
    Map<String, Student> enumMap = EnumUtils.getEnumMap(Student.class);
    boolean xiaoxuesheng1 = EnumUtils.isValidEnum(Student.class, "XIAOXUESHENG");
}

enum  Student{
    XIAOXUESHENG(1),GAOZHOGNSHENG(2),DAXUESHEGN(3);
    int type;
    Student(int type){
        this.type = type;
    }
}

RandomUtils、RandomStringUtils

@Test
public void test7() {

    // RandomStringUtils   string类型工具类
    //在指定范围内随机,随机1个
    String random = RandomStringUtils.random(1,'a','b','c','d','e');
    //生成指定长度随机数字字符串
    //String randomNumeric = RandomStringUtils.randomNumeric(5);
    //随机一个 5 - 10 之间的数字
    String randomNumeric = RandomStringUtils.randomNumeric(5,10);
    //生成指定长度的随机大小写字母组合的字符串
    System.out.println(RandomStringUtils.randomAlphabetic(5));
    //生成指定长度的字母数字组合的字符串
    System.out.println(RandomStringUtils.randomAlphanumeric(5));

    //生成指定范围内的随机 int 数 含头不含尾
    System.out.println(RandomUtils.nextInt(1, 100));
    //生成指定范围的随机 double 数 含头不含尾
    System.out.println(RandomUtils.nextDouble(1, 100));
}

StringUtils重要工具类

@Test
public void test7() {
    // null和空串返回true,注意 “     ”返回false
    StringUtils.isEmpty("");
    // 任意一个参数为null、""的话,返回true
    StringUtils.isAnyEmpty("","");
    // null和空串和“     ”返回true
    StringUtils.isBlank("");
    // 任意一个参数为null和空串和“     ”的话,返回true
    StringUtils.isAnyBlank("","");
    //移除字符串两端的空字符串
    StringUtils.trim("");
    //正向 字符串在另外一个字符串里,出现第 n 次的位置 没有返回-1
    StringUtils.ordinalIndexOf("abcdefgabcdefgabcdefgabcdefg", "g", 4); // 27
    //逆向 字符串在另外一个字符串里,出现第 n 次的位置 没有返回-1
    StringUtils.lastOrdinalIndexOf("abcdefgabcdefgabcdefgabcdefg", "g", 4); // 6
    //字符换截取
    StringUtils.substring("abcdefgabcdefgabcdefgabcdefg", 21); // abcdefg
    //从左边开始截取指定个数
    StringUtils.left("abcdefgabcdefgabcdefgabcdefg", 7);  // abcdefg
    StringUtils.right("abcdefgabcdefgabcdefgabcdefg", 2);  // fg
    StringUtils.mid("abcdefgabcdefgabcdefgabcdefg", 2,3);  // cde
    //数组拼接字符串
    StringUtils.join(new String[]{"a", "b", "c"}, ","); // a,b,c
    //删除所有空格
    StringUtils.deleteWhitespace("   a       b c      "); // abc
    //删除以特定字符串开头的字符串,如果没有的话,就不删除。
    StringUtils.removeStart("abcde", "abc"); // de
    //为了保证长度统一,可以右边自动用指定的字符补全至指定长度
    StringUtils.rightPad("abc", 10, "*"); //abc*******
    //左侧填充
    StringUtils.leftPad("abc", 10, "*"); // *******abc
    //两侧填充
    StringUtils.center("abc", 11, "*"); //  ****abc****
    //首字母大、小写
    StringUtils.capitalize("abc");
    StringUtils.uncapitalize("abc");
    //取反
    StringUtils.swapCase("abc");
    //判断字符串是否全由字母组成 (只要存在汉字、中文、数字都为false)
    StringUtils.isAlpha("abc");
    //字符串翻转
    StringUtils.reverse("abc");
    // 缩略字符串,省略号要占三位  表示最大长度是4,就是说后3位就是 ...
    // 如果字符串小于 maxWidth ,返回原字符串
    StringUtils.abbreviate("abcdefg", 4); // a...
    StringUtils.abbreviate("abcdefg", 12); // abcdefg
    // 如果大于maxWidth, 则 字符串 + 省略号 == 6
    System.out.println(StringUtils.abbreviate("abcdefg", 6)); //abc...
}

日期操作

@Test
public void test() throws ParseException {
    String date = "2021-2-28 10:13:555";
    String dateStr = "yyyy-MM-dd HH:mm:SSS";
    //字符串转date类型
    Date now = DateUtils.parseDate(date, dateStr); //Sun Feb 28 10:13:00 CST 2021
    //date 转 字符串
    String format = DateFormatUtils.format(now, dateStr); //2021-02-28 10:13:555
    long time = now.getTime();
    //毫秒转字符串
    String format1 = DateFormatUtils.format(time, dateStr); // 2021-02-28 10:13:555

    //天数加减
    DateUtils.addDays(now,1);
    //小时加减
    DateUtils.addHours(now,1);
    //分钟加减
    DateUtils.addMinutes(now,1);
    //月
    DateUtils.addMonths(now,1);
    //年
    DateUtils.addYears(now,1);

    //当月过去多少天了
    long fragmentInDays = DateUtils.getFragmentInDays(now, Calendar.MONTH); //28
    //今年过去多少天了
    long fragmentIn = DateUtils.getFragmentInDays(now, Calendar.YEAR); //28
    //一次类推 小时 毫秒等
    // DateUtils.getFragmentInHours()

    //是否是同一天
    DateUtils.isSameDay(now,now);
    //判断两个时间是否为同一毫秒
    DateUtils.isSameInstant(now,now);

    //给定日期 设置年份
    DateUtils.setYears(now, 3000); // 3000-02-28 10:13:555
    DateUtils.setHours(now,1); // 设置小时

    //给定日期四舍五入
    DateUtils.round(now, Calendar.YEAR); // 2021-01-01 00:00:000
    DateUtils.round(now, Calendar.MONTH); // 2021-03-01 00:00:000
    DateUtils.round(now, Calendar.HOUR_OF_DAY);// 2021-02-28 10:00:000
    DateUtils.round(now, Calendar.DAY_OF_MONTH);// 2021-02-28 00:00:000
    DateUtils.round(now, Calendar.HOUR);// 2021-02-28 10:00:000

    //日期截取,跟四舍五入不同,这个不会四舍五入 这个是截取
    DateUtils.truncate(now, Calendar.YEAR); // 截取到年 2021-01-01 00:00:000
    DateUtils.truncate(now, Calendar.MONTH); // 截取到月 2021-02-01 00:00:000
    DateUtils.truncate(now, Calendar.DAY_OF_MONTH);//截取到天 2021-02-28 00:00:000
    DateUtils.truncate(now, Calendar.HOUR_OF_DAY); //截取到小时 2021-02-28 10:00:000
    DateUtils.truncate(now, Calendar.HOUR); //截取到小时 2021-02-28 10:00:000
    DateUtils.truncate(now, Calendar.MINUTE); //截取到分钟 2021-02-28 10:13:000
    //截取到天
    DateUtils.truncate(now, Calendar.DATE);//截取到天 2021-02-28 00:00:000

    //语法糖
    //获取月初
    //先获取下个月
    Date next = DateUtils.addMonths(now, 1);
    // 下个月的1月1日
    Date setDays = DateUtils.setDays(next, 1);
    // 再减一天
    Date date1 = DateUtils.addDays(setDays, -1); // 2021-02-28 10:13:555
    //处理最晚时间
    Date date2 = DateUtils.setHours(date1, 23);
    Date date3 = DateUtils.setMinutes(date2, 59);
    Date date4 = DateUtils.setSeconds(date3, 59); // 2021-02-28 23:59:555
    
}

Collections4

主要是集合判空,新集合类型不讲了,建议用前面讲的guava集合类型

@Test
public void test2() throws ParseException {
    List<Object> objects = new ArrayList<>();
    boolean empty = CollectionUtils.isEmpty(objects);
    Map<Object, Object> objectObjectHashMap = new HashMap<>();
    MapUtils.isEmpty(objectObjectHashMap);
}

beanutils

@Test
public void test2() throws InvocationTargetException, IllegalAccessException, NoSuchMethodException, InstantiationException {
    Student student = new Student();
    student.setAge("14");
    student.setName("张三");
    //给属性赋值
    BeanUtils.setProperty(student,"name","李四"); // Student{name='李四', age='14'}
    BeanUtils.getProperty(student, "name"); // 李四

    // map 属性 转 对象
    Map<String,String> map = new HashMap<>();
    map.put("name","王五");
    BeanUtils.populate(student,map); // Student{name='王五', age='14'}

    Student o = (Student) BeanUtils.cloneBean(student); //浅copy
    Student student1 = new Student();
    BeanUtils.copyProperties(student,student1); //浅copy
}

codec

@Test
public void test3() throws IOException, DecoderException {
   // Base64编码
   Base64 base64 = new Base64();
   String s = base64.encodeToString("我们都是神枪手".getBytes()); // 5oiR5Lus6YO95piv56We5p6q5omL
   new String(base64.decode(s));// 我们都是神枪手

   // MD5摘要运算
   DigestUtils.md5Hex("我们都是神枪手"); // c97b0a7d06adc58425945ba37415cb4d
   DigestUtils.md5Hex(new ByteArrayInputStream("我们都是神枪手".getBytes())); // c97b0a7d06adc58425945ba37415cb4d

   // sh1 sh1
   DigestUtils.sha1("我们都是神枪手"); //[B@727803de
   DigestUtils.sha256("我们都是神枪手"); // [B@727803de

   // hmac sha1 加密算法
   // scrypt bcrypt和scrypt
   //用户密码
   String password = "我们都是神枪手";
   //密码加密
   BCryptPasswordEncoder passwordEncoder=new BCryptPasswordEncoder();
   //加密
   String newPassword = passwordEncoder.encode(password);
   System.out.println("加密密码为:"+newPassword);
   //对比这两个密码是否是同一个密码
   boolean matches = passwordEncoder.matches(password, newPassword);
   System.out.println("两个密码一致:"+matches);
   //URLCodec
   URLCodec codec = new URLCodec();
   String sa = codec.encode("api/v2/get", "utf-8"); // api%2Fv2%2Fget
   String s1 = codec.decode(sa, "utf-8"); // api/v2/get
}

Email

发送邮件工具类

Commons-io

@Test
public void test5() throws IOException {
    String fire1 = "D:\\temp\\java_demo.txt";
    String fire2 = "D:\\temp\\java_demo2.txt";
    // 拷贝文件 源文件  目标文件
    FileUtils.copyFile(new File(fire1),new File(fire2));
    // 拷贝文件 源文件  目标目录
    FileUtils.copyFileToDirectory(new File(fire1),new File("D:\\temp\\two"));

    //拷贝文件到输出流中
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    FileUtils.copyFile(new File(fire1),byteArrayOutputStream);
    System.out.println(new String(byteArrayOutputStream.toByteArray()));

    //输入流到 文件
    FileUtils.copyInputStreamToFile(new ByteArrayInputStream("aaa".getBytes()),new File(fire2));

    //移动文件  需要移动的文件  移动到的目录
    //FileUtils.moveToDirectory(new File(fire1),new File("D:\\temp\\two2"),true);

    //读取文件内容 到字符串
    FileUtils.readFileToString(new File(fire1), Charset.forName("utf-8"));

    //对目标文件写入内容
    FileUtils.writeStringToFile(new File(fire2),"aaa",Charset.forName("utf-8"),true);

    //递归删除一个目录(包括内容)。
    FileUtils.deleteDirectory(new File(fire2));

    //清理内容而不删除它。
    FileUtils.cleanDirectory(new File(fire2));

    //删除一个文件,不会抛出异常。如果文件是一个目录,删除它和所有子目录。
    FileUtils.deleteQuietly(new File(fire2));

    //删除文件 非递归删除  文件正在被占用、:没有close输入输出流是无法删除的 会抛出异常
    FileUtils.forceDelete(new File(fire2));

    //一次可以创建单级或者多级目录
    FileUtils.forceMkdir(new File("d:/Users/wuguibin/Downloads/folder"));
}

Commons Chain

责任链模式工具

guava集合操作工具类

见前面博客

其他

字符串模板替换

Velocity 字符串替换

支持 对象.属性的写法

// 初始化并取得Velocity引擎
VelocityEngine engine = new VelocityEngine();
// 字符串模版
String template = "${user.name}:您的年龄 ${user.age}";
VelocityContext context = new VelocityContext();
Map<Object, Object> objectObjectHashMap = new HashMap<>();
// 把数据填入上下文
objectObjectHashMap.put("name", "张三");
objectObjectHashMap.put("age", 22);
context.put("user", objectObjectHashMap);
StringWriter writer = new StringWriter();
engine.evaluate(context, writer, "", template);
System.out.println(writer.toString());

apache common 字符串替换

Map<String, String> valuesMap = new HashMap<String, String>();
valuesMap.put("name", "张三");
valuesMap.put("age", "15");
String templateString = "The ${name} age is ${age}.";
StrSubstitutor sub = new StrSubstitutor(valuesMap);
String resolvedString = sub.replace(templateString);
System.out.println(resolvedString);

jdk自带

@Test
public void test7(){
    //name 张三 age 22
    String name = String.format("name %s age %d", "张三", 22);
    //name 张三 age 22
    String name2 = MessageFormat.format("name {0} age {1}", "张三", 22);
}

上面spring的占位符解析

Aviator语法糖衣也可以解析字符串模板

Aviator表达式求值引擎

主要是处理java代码字符串解析逻辑

@Test
public void test7(){
   //求数学表达式
   //不需要传递map
   Object execute = AviatorEvaluator.execute("3+6+6"); //15
   //传递map 将参数传递
   Map<String, Object> map = new HashMap<String, Object>();
   map.put("age", 18);
   Object execute1 = AviatorEvaluator.execute(" '年龄乘以年龄等于:'  + age*age",map); // 324
   System.out.println(execute1);

   //自定义函数
   AviatorEvaluator.addFunction(new AbstractFunction() {
       @Override
       public String getName() {
           return "chengfa";
       }

       @Override
       public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2) {
           double num1 = FunctionUtils.getNumberValue(arg1, env).doubleValue();
           double num2 = FunctionUtils.getNumberValue(arg2, env).doubleValue();
           return new AviatorDouble(num1 * num2);

       }
   });
   Object execute2 = AviatorEvaluator.execute("chengfa(5, 8)"); // 40.0

   // 自带函数
   Object execute3 = AviatorEvaluator.execute("'日期 :' + sysdate() + '。毫秒 :' + now()");
   // string.length(s) 求字符串长度,返回Long
   // string.startsWith(s1,s2)
   // math.abs(d)  求d的绝对值
   // math.sqrt(d) 求d的平方根
   // math.pow(d1,d2) 求d1的d2次方
   // 。。。。。。。。。。。。。。。。。
   System.out.println(execute3);

   // 访问数组和集合
   Map<String, Object> env = new HashMap<>();
   env.put("list", new ArrayList<>());
   env.put("array", new String[2]);
   //Map<String, Object> map = new HashMap<String, Object>();
   //map.put("age", 18);
   env.put("map", map);
   //可以调用 对象.属性  
   Object execute4 = AviatorEvaluator.execute("list[0]+':'+array[0]+':'+'age is '+map.age", env);
   //age is 18
}
上一篇:java.security.InvalidKeyException: Illegal key size or default parameters


下一篇:闲来看看View.java的Developer Guides