记录下java中常用得工具类,以便开发使用方便快捷。
java中常用用具类介绍
- spring工具类
- 文件操作
- 加载资源文件
- 操作文件
- web工具类
- 路径匹配
- 占位符解析
- 获取方法参数名字
- UUID 生成器
- 反射工具类
- 序列化工具类
- StringUtils
- 操作文件方法
- 其余操作
- 断言工具类
- apache工具类
- lang3
- EnumUtils
- RandomUtils、RandomStringUtils
- StringUtils重要工具类
- 日期操作
- Collections4
- ToStringBuilder
- HashCodeBuilder
- EqualsBuilder
- CompareToBuilder
- beanutils
- codec
- Commons-io
- Commons Chain
- guava集合操作工具类
- 其他
- 字符串模板替换
- Velocity 字符串替换
- apache common 字符串替换
- jdk自带
- 上面spring的占位符解析
- Aviator语法糖衣也可以解析字符串模板
- Aviator表达式求值引擎
- java代码执行js,脚本引擎
- java代码执行java格式字符串
- 动态编译
- JEXL 表达式求值引擎
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");//这样可以获取jar包中的文件数据//原因是java中file对象是针对操作系统的文件系统的,而jar包的配置文件并不属于操作系统的文件系统的,在操作系统中,jar是文件系统的叶节点,要访问jar包中的文件必须以流的方式打开InputStream in = new ClassPathResource("application.properties").getInputStream();//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();
@Testpublic void test3() throws IOException {AntPathMatcher matcher = new AntPathMatcher();matcher.match("/a/b/?", "/a/b/c"); // truematcher.match("/a/b/*", "/a/b/abc"); // truematcher.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;}@Overridepublic 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
- getEnum(Class enumClass, String enumName) 通过类返回一个枚举
- getEnumList(Class enumClass) 返回一个枚举集合
- getEnumMap(Class enumClass) 返回一个枚举map
- 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);//返回一个枚举mapMap<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,注意 “ ”返回falseStringUtils.isEmpty("");// 任意一个参数为null、""的话,返回trueStringUtils.isAnyEmpty("","");// null和空串和“ ”返回trueStringUtils.isBlank("");// 任意一个参数为null和空串和“ ”的话,返回trueStringUtils.isAnyBlank("","");//移除字符串两端的空字符串StringUtils.trim("");//正向 字符串在另外一个字符串里,出现第 n 次的位置 没有返回-1StringUtils.ordinalIndexOf("abcdefgabcdefgabcdefgabcdefg", "g", 4); // 27//逆向 字符串在另外一个字符串里,出现第 n 次的位置 没有返回-1StringUtils.lastOrdinalIndexOf("abcdefgabcdefgabcdefgabcdefg", "g", 4); // 6//字符换截取StringUtils.substring("abcdefgabcdefgabcdefgabcdefg", 21); // abcdefg//从左边开始截取指定个数StringUtils.left("abcdefgabcdefgabcdefgabcdefg", 7); // abcdefgStringUtils.right("abcdefgabcdefgabcdefgabcdefg", 2); // fgStringUtils.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, 则 字符串 + 省略号 == 6System.out.println(StringUtils.abbreviate("abcdefg", 6)); //abc...// 删除以特定字符串开头的字符串StringUtils.removeStart("www.baidu.com", "www.") = "baidu.com"// 前面为空,则返回后面一个参数 StringUtils.defaultString("", "aaa") = ""}
日期操作
@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:555long 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:555DateUtils.setHours(now,1); // 设置小时//给定日期四舍五入DateUtils.round(now, Calendar.YEAR); // 2021-01-01 00:00:000DateUtils.round(now, Calendar.MONTH); // 2021-03-01 00:00:000DateUtils.round(now, Calendar.HOUR_OF_DAY);// 2021-02-28 10:00:000DateUtils.round(now, Calendar.DAY_OF_MONTH);// 2021-02-28 00:00:000DateUtils.round(now, Calendar.HOUR);// 2021-02-28 10:00:000//日期截取,跟四舍五入不同,这个不会四舍五入 这个是截取DateUtils.truncate(now, Calendar.YEAR); // 截取到年 2021-01-01 00:00:000DateUtils.truncate(now, Calendar.MONTH); // 截取到月 2021-02-01 00:00:000DateUtils.truncate(now, Calendar.DAY_OF_MONTH);//截取到天 2021-02-28 00:00:000DateUtils.truncate(now, Calendar.HOUR_OF_DAY); //截取到小时 2021-02-28 10:00:000DateUtils.truncate(now, Calendar.HOUR); //截取到小时 2021-02-28 10:00:000DateUtils.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);
}
ToStringBuilder
利用反射tostring方法,好处是增加属性后不需要修改方法
1.8后反射的性能也非常好
@Overridepublic String toString(){ //对象及其属性一行显示System.out.println(ToStringBuilder.reflectionToString(this));System.out.println(ToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE));//属性换行显示System.out.println(ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE));//不显示属性名,只显示属性值,在同一行显示System.out.println(ToStringBuilder.reflectionToString(this, ToStringStyle.NO_FIELD_NAMES_STYLE));//对象名称简写System.out.println(ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE));//只显示属性System.out.println(ToStringBuilder.reflectionToString(this, ToStringStyle.SIMPLE_STYLE)); ReflectionToStringBuilder.toString(obj);//或ReflectionToStringBuilder builder = new ReflectionToStringBuilder(this);ToStringBuilder.reflectionToStringreturn builder.toString();}
HashCodeBuilder
@Override
public int hashCode() {return HashCodeBuilder.reflectionHashCode(this);
}
EqualsBuilder
@Override
public boolean equals(Object obj) {return EqualsBuilder.reflectionEquals(this, obj);
}
CompareToBuilder
public int compareTo(Object o) { Fruit f = (Fruit) o; return new CompareToBuilder().append(this.name, f.name).append(this.colour, f.colour) .toComparison();
}
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); //浅copyStudent student1 = new Student();BeanUtils.copyProperties(student,student1); //浅copy// java对象转mapMap<String, String> describe = BeanUtils.describe(student);
}//获取对象某个字段的值
PropertyUtils.getSimpleProperty(Object, String)
//同样,此为设置值
PropertyUtils.setSimpleProperty(Object, String, Object)
codec
@Test
public void test3() throws IOException, DecoderException {// Base64编码Base64 base64 = new Base64();String s = base64.encodeToString("我们都是神枪手".getBytes()); // 5oiR5Lus6YO95piv56We5p6q5omLnew String(base64.decode(s));// 我们都是神枪手// MD5摘要运算DigestUtils.md5Hex("我们都是神枪手"); // c97b0a7d06adc58425945ba37415cb4dDigestUtils.md5Hex(new ByteArrayInputStream("我们都是神枪手".getBytes())); // c97b0a7d06adc58425945ba37415cb4d// sh1 sh1DigestUtils.sha1("我们都是神枪手"); //[B@727803deDigestUtils.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);//URLCodecURLCodec codec = new URLCodec();String sa = codec.encode("api/v2/get", "utf-8"); // api%2Fv2%2FgetString s1 = codec.decode(sa, "utf-8"); // api/v2/get
}
发送邮件工具类
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"));// IOUtilscopy(InputStream input, OutputStream output)copy(InputStream input, Writer output)copy(InputStream input, Writer output, String encoding)copy(Reader input, Writer output)copy(Reader input, OutputStream output)copy(Reader input, OutputStream output, String encoding)// IOUtils.toString(in, StandardCharsets.UTF_8)//关闭流IOUtils.closeQuietly(InputStream input);IOUtils.closeQuietly(OutputStream output);}
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 22String name = String.format("name %s age %d", "张三", 22);//name 张三 age 22String name2 = MessageFormat.format("name {0} age {1}", "张三", 22);
}
上面spring的占位符解析
Aviator语法糖衣也可以解析字符串模板
Aviator表达式求值引擎
主要是处理java代码字符串解析逻辑
@Test
public void test7(){//求数学表达式//不需要传递mapObject 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); // 324System.out.println(execute1);//自定义函数AviatorEvaluator.addFunction(new AbstractFunction() {@Overridepublic String getName() {return "chengfa";}@Overridepublic 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
}
也可以字符串替换
public class MainTest {public static void main(String[] args) {Student student = new Student();Grade grade = new Grade();grade.setAge(222);student.setName("zs");student.setGrade(grade);Object execute1 = AviatorEvaluator.exec(" '年龄乘以年龄等于:' + student.grade.age",student); // 324System.out.println(execute1);Map<String, Object> objectObjectMap = new HashMap<String, Object>();objectObjectMap.put("st",student);Object execute3 = AviatorEvaluator.execute(" '年龄乘以年龄等于:' + st.grade.age",objectObjectMap); // 324System.out.println(execute3);}
}
class Student{String name;Grade grade;public String getName() {return name;}public void setName(String name) {this.name = name;}public Grade getGrade() {return grade;}public void setGrade(Grade grade) {this.grade = grade;}
}class Grade{int age;public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
java代码执行js,脚本引擎
ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("js");engine.put("param",19);String test2 = "param >= 11 && param <= 30";Object eval = engine.eval(test2);System.out.println((Boolean) eval);
java代码执行java格式字符串
动态编译
// 动态编译
Runtime run = Runtime.getRuntime();
Process process = run.exec("javac -cp d:/xxx/ xxx.java");// 0表示编译成功,非0表示编译失败
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result = compiler.run(null, null, null,"java代码格式字符串");
编译完成后需要执行
Runtime run = Runtime.getRuntime();
Process process = run.exec("java -cp d:/xxxx xxxxx ");
等等
JEXL 表达式求值引擎
public class MainTest {public static void main(String[] args) {Student student = new Student();Grade grade = new Grade();student.setGrade(grade);grade.setAge(222);student.setName("zs");String ex1 = "student.getName().equals(name)";//表达式Map<String, Object> map = new HashMap<>();//参数map.put("name", "张三");map.put("student", student);Object o = invokeMethod(ex1, map);System.out.println(o);}private static Object invokeMethod(String ex, Map<String, Object> map) {//引擎JexlEngine jexlEngine = new Engine();
// JexlEngine jexlEngine = new JexlBuilder().create();//表达式JexlExpression e = jexlEngine.createExpression(ex);//上下文条件(参数)JexlContext jc = new MapContext();for (String key : map.keySet()) {jc.set(key, map.get(key));}Object object;if (null == (object = e.evaluate(jc))) {return "";}return object;}
}
# java规则引擎