java中常用用具类介绍

news/2024/11/20 9:30:45/

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

java中常用用具类介绍

  • spring工具类
    • 文件操作
      • 加载资源文件
      • 操作文件
    • web工具类
    • 路径匹配
    • 占位符解析
    • 获取方法参数名字
    • UUID 生成器
    • 反射工具类
    • 序列化工具类
    • StringUtils
      • 操作文件方法
      • 其余操作
    • 断言工具类
  • apache工具类
    • lang3
      • EnumUtils
      • RandomUtils、RandomStringUtils
      • StringUtils重要工具类
      • 日期操作
      • Collections4
      • ToStringBuilder
      • HashCodeBuilder
      • EqualsBuilder
      • CompareToBuilder
    • beanutils
    • codec
    • Email
    • 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

  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);//返回一个枚举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
}

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"));// 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规则引擎


http://www.ppmy.cn/news/286548.html

相关文章

大学生开学必备物品清单,男生超喜欢的数码好物

已经九月了&#xff0c;有些还没开学的准大一新生都准备好迎接美好大学生活了吗&#xff1f;最为重要的是你准备好开学用品了没&#xff0c;那么进入大学&#xff0c;很多同学会将手机和电脑作为标配&#xff0c;当然除了这两款数码产品之外&#xff0c;其实还有很多智能装备值…

acwing野餐规划

搜索与回溯算法 #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #include<map> map<string,int>ggbond; struct node { int a,b,c; }ai[2000000]; int f[20…

真人CS、趣味拓展、空中断桥、越野车、露营 2天亲子活动方案

真人CS、趣味拓展、空中断桥、越野车、露营 2天亲子活动方案 时间安排 项目安排 第一天 08:00-09:30 集合&#xff0c;清点人数&#xff0c;乘车前往指定拓展基地 09:30-12:00 团队熔炼&#xff1a;破冰分组、团队建设、团队展示 挑战项目&#xff1a;亲子CS 12:00-13…

Matlab中pickic_中英双语小猪佩奇学英语Picnic野餐

Picnic 野餐 It is a lovely bright sunny day. 今天的天气阳光明媚。 Peppa and her family are going for a picnic. 佩奇和她的家人准备去野餐。 Daddy Pig is bringing the picnic basket. 猪爸爸拿着野餐篮子。 Picnic basket, bread, cheese, tomatoes and lemonade. 里面…

希尔顿旗下酒店于不同城市推出餐饮外卖、连住套餐、星厨上门、户外野餐等无忧安心产品...

上海2022年3月18日 /美通社/ -- 在暂时去不了远方的这个春天&#xff0c;希尔顿集团旗下酒店以诠释待客之道的热诚和酒店人的细心周到&#xff0c;及时调整业务&#xff0c;于不同城市推出一系列无忧安心的新产品、新体验&#xff0c;包括餐饮外卖、连住套餐、星厨上门、户外野…

Matlab中pickic_高颜值甜品DIY |春季甜品Picnic野餐系列,一起过个惬意慵懒的午后时光❗️...

前言 春季宅在家玩什么&#xff1f;把自家后院草坪利用起来&#xff0c;来一个慵懒又惬意的下午茶&#xff0c;吃着自己做的美味甜品和水果&#xff0c;喝着果香汽水&#xff0c;看着孩子们在院子里嬉闹玩耍的画面&#xff0c;原来幸福可以这么简单。 删除注释 图片来自布拉格之…

拍摄的风景视频中,如何快速有效地去除视频中的杂物?

我们在外游玩拍摄的短视频&#xff0c;视频中出现的不必要杂物&#xff0c;比如垃圾、广告或其他不相关的人&#xff0c;会影响视频内容的传达&#xff0c;会降低视频的观感质量。 因此&#xff0c;需要去除这些杂物&#xff0c;使得视频更加干净、整洁。让观众更容易理解视频的…

TikTok选品有什么技巧?

一、多平台选品逻辑 首先要知道一点&#xff0c;在独立站热卖的产品也会在亚马逊热卖&#xff0c;而Tiktok已经成为一个最初的舆情传播口&#xff0c;那么选品逻辑是&#xff1a; 1. 脸书爆款帖子产品 2. 速卖通本周本月趋势产品 3. 亚马逊24小时热销 4. 谷歌趋势对应产品…