ColdFusionメソッドの動的な実行。
先日のエントリのコードをもうちょっといじってみました。
<?xml version="1.0" encoding="utf8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <cfoutput> <head> <meta http-equiv="Content-Style-Type" content="text/css"/> <title>GetMetaData</title> </head> <body> <cfset VARIABLES.obj=CreateObject("component", "examples.metadata1.TestModule1") /> <cfset VARIABLES.ret=VARIABLES.obj.add(1, 2) /> Answer-1:[#VARIABLES.ret#] <hr /> <cfset VARIABLES.methodList=StructKeyList(VARIABLES.obj) /> <cfloop index="VARIABLES.idx" list="#VARIABLES.methodList#"> <cfset VARIABLES.method=VARIABLES.obj[VARIABLES.idx] /> <cfset VARIABLES.ret=VARIABLES.method(2,3) /> Answer-2:[#VARIABLES.ret#] </cfloop> <hr /> <cfset VARIABLES.in=ArrayNew(1) /> <cfset ArrayAppend(VARIABLES.in, 3) /> <cfset ArrayAppend(VARIABLES.in, 4) /> <cfset VARIABLES.ret=invokeMethod("examples.metadata1.TestModule1", "add", VARIABLES.in) /> Answer-3:[#VARIABLES.ret#] </body> </cfoutput> </html> <cffunction name="invokeMethod" access="private" output="false" returntype="numeric"> <cfargument name="componentName" type="string" required="true" /> <cfargument name="methodName" type="string" required="true" /> <cfargument name="param" type="array" required="true" /> <cfset var obj=CreateObject("component", ARGUMENTS.componentName) /> <cfset var method=obj[ARGUMENTS.methodName] /> <cfset var ret=0 /> <cfset var idx="" /> <cfinvoke component="#ARGUMENTS.componentName#" method="#ARGUMENTS.methodName#" returnvariable="ret"> <cfloop index="idx" from="1" to="#ArrayLen(method.metadata.parameters)#"> <cfinvokeargument name="#method.metadata.parameters[idx].name#" value="#ARGUMENTS.param[idx]#" /> </cfloop> </cfinvoke> <cfreturn ret /> </cffunction>
結果は
Answer-1:[3]
Answer-2:[5]
Answer-3:[7]
おおー動いた!
ColdFusionもなかなかやるもんですね!