Adobe ColdFusion基于Java构建。 CFML / CFSCRIPT中的几乎所有简单变量都是java.lang.String
,直到操作需要它为某种类型。
我一直想在startsWith()
中使用String
而不是更庞大的CFML变体。
left(str,4) EQ "test"
但是,在ColdFusion中使用底层Java方法的一般共识是什么?
对于javacast()
var,这会更安全吗?
javacast("String",x).startsWith("test");
如果CF引擎不是基于Java构建的,该怎么办?
由于
答案 0 :(得分:6)
是的,您可以使用Adobe ColdFusion和基于Java构建的其他CFML引擎来完成此操作。它实际上比你想象的要简单。
<cfset str = "hello what's up" />
#str.startsWith("hello")# <!--- returns "YES" --->
<cfif str.startsWith("h")>
This text will be output
</cfif>
#str.startsWith("goodbye")# <!--- returns "NO" --->
<cfif str.startsWith("g")>
This text will NOT be output
</cfif>
这是可能的,因为ColdFusion中的CFML字符串与Java字符串相同。您可以在CFML字符串上使用任何本机字符串方法(Java.lang.String)。
如果你还没有猜到,这也适用于CFML数组(某种列表,可能是java.util.Vector)和结构(可能是java.util.Map)。试验数据类型和cfdump标签,你会发现很多秘密。
一句警告,这是不标准CFML,因此如果您的基础引擎发生变化,包括仅升级到新版本,则无法保证它仍然有效。
也就是说,string.startsWith()是Java和.NET的原生,所以如果您的CFML引擎是BlueDragon.NET,这也可以。它不能使用的唯一CFML引擎是ColdFusion 5和之前的版本。
使用安全吗?我会说是的。只要CFML引擎在Java或.NET上运行,它就非常安全。它没有文档记录,但很容易理解,所以我想自由地使用它。
答案 1 :(得分:2)
我发现在大多数情况下使用内置的cf函数比利用它们的java函数更快,主要是因为它在cf包装java方法时花费了很多。
如果您正在使用.startsWith(),请记住它区分大小写,而cf的eq则不是。 大多数其他java String方法也是如此 - .endsWith(),. encins()等。
除非您可以将大量功能捆绑为自己的java util类,否则混合cf和java调用似乎很慢。如果你在一些java代码中,并且你有一个字符串,并且你调用它的startsWith()方法,它就会执行。完成。在cf代码中,你必须使用javaCast或盲目地希望变量是正确的数据类型,这对于完全数字字符串这样的事情是有风险的,当你调用.startsWith()时,有一堆cf代码在之前运行它甚至可以降到java级别,这是缓慢生活的地方。例如。 Cf的动态参数意味着它必须检查所提供的对象上是否存在具有那么多args以及这些数据类型(或兼容类型)的方法。只有一大堆代码不可避免地运行,桥接两种语言。
但是不要相信我们的经验,为自己制定基准。例如
<cfscript>
var sys = createObject( 'java', 'java.lang.System' );
var timer = sys.nanoTime();
// run some code here
timer = sys.nanoTime() - timer;
writeDump( var: timer );
</cfscript>
如果您使用的是Adobe cf引擎,请注意完全数字字符串,它们会在java双打和字符串之间反弹,并且不会让我开始使用serializeJSON()......