2007-03-18

Onde está a função?



Mais uma que compartilho com vocês.
As funções nativas não serão encontradas nos escopos, e sim, em uma classe entre muitas que são executadas durante uma requisição.

<cfscript>
  class = variables.getClass();
  class = class.forName('coldfusion.runtime.CFPage');
  methods = class.getMethods();
  i=1;
  while(methods[i].getName() neq 'FindNoCase'){
    i=i+1;
  }
  arg = arraynew(1);
  arg[1] = 'd' ;
  arg[2] = 'Pedro';
  num = methods[i].invoke(JavaCast('string','FindNoCase'),arg);
  WriteOutput(num);
</cfscript>

Uma observação, o índice de cada item do array não muda nunca, exceto quando a versão do servidor for alterada, devido ao acréscimo de novos métodos, então se você sabe qual é o índice de uma função o loop é dispensável.

E para os curiosos, também existem as funções não documentadas _invoke e _invokeUDF, teste que o erro vai apontar para a falta de parâmetros ( <cfoutput>#_invoke()#</cfoutput>, <cfoutput>#_invokeUDF()#</cfoutput> ).

2 comentários:

Pedro Claudio disse...

<cfscript>
/* Author:Pedro Claudio (pcsilva<>gmail.com)
* Date Creation:03/19/2006
*
* @param1 (required): sub string that will be searched
* @param2 (required): string that it can contain sub string that be searched
* @param3 (required): position start of search
* @param4 (required): information of type search (true for REFindNoCase | false for FindNoCase)
* @param5 (optional): if version 8, true is accepted for modify type of return, or false
*
* @return type: number (return first position found, or -1 for server not supported)
*
*/
function AdvancedFind(substringORregex,string,start,IsRegex){
var methods = variables.getClass().forName('coldfusion.runtime.CFPage').getMethods();
var version = (ListGetAt(Server.ColdFusion.ProductVersion,1)-7)*20;
var i = 269+version;
var arg = ArrayNew(1);
if(version lt 0) return -1;
if(IsRegex IS "true") i = 301+version;
if(version eq 20){
if(IsRegex eq "true"){
arg[1] = JavaCast('string',substringORregex);
arg[2] = JavaCast('string',string);
arg[3] = JavaCast('int',start);
if(ArrayLen(arguments) gt 4) arg[4] = JavaCast('boolean',arguments[4]);
else arg[4] = JavaCast('boolean',false);
}else{
arg[1] = JavaCast('string',substringORregex);
arg[2] = JavaCast('string',string);
}
}else{
arg[1] = JavaCast('string',substringORregex);
arg[2] = JavaCast('string',string);
arg[3] = JavaCast('int',start);
}
return methods[i].invoke(JavaCast('string',methods[i].getName()),arg);
}
</cfscript>

<cfscript>
writeoutput("FindNoCase = "&AdvancedFind('d','Pedro Claudio',0,false));
writeoutput("<hr>");
writeoutput("ReFindNoCase = "&AdvancedFind('C|dr','Pedro Claudio',0,true));
writeoutput("<hr>");
</cfscript>
<cfdump var="#AdvancedFind('K|io','Pedro Claudio',0,true,true)#">

Pedro Claudio disse...

<cfscript>
pageContext=GetPageContext();
Object=pageContext.getClass().forName('coldfusion.runtime.TemplateProxyFactory');
Object=Object.newInstance().resolveName('POIUtility', pageContext);
page = pageContext.getPage();
arg = ArrayNew(1);
Invoke = page._invoke(Object,JavaCast('string','GetNewSheetStruct'),arg);
</cfscript>