Json 在ColdFusion中的另一个cfc上下文中执行函数,同时遵守导入语句 背景

Json 在ColdFusion中的另一个cfc上下文中执行函数,同时遵守导入语句 背景,json,coldfusion,cfimport,Json,Coldfusion,Cfimport,我正在尝试创建一个函数componentFromJson,它可以从JSON重构组件图。我采用了一种简单的方法,使用getMetaData查找组件属性以实例化正确的类型 该函数的用法如下:comp=componentFromJson(json,'RootComponentType') 问题 问题是属性的类型不一定是完全限定的,因为名称空间可能已经被导入,如下面所示 <cfimport path="some.namespace.Test"> <cfcomponent>

我正在尝试创建一个函数
componentFromJson
,它可以从JSON重构组件图。我采用了一种简单的方法,使用
getMetaData
查找组件属性以实例化正确的类型

该函数的用法如下:
comp=componentFromJson(json,'RootComponentType')

问题 问题是属性的类型不一定是完全限定的,因为名称空间可能已经被导入,如下面所示

<cfimport path="some.namespace.Test">

<cfcomponent>
    <cfproperty name="test" type="Test">
</cfcomponent>
可怕的解决办法 我现在能想到的解决这个问题的唯一方法是解析CFC的ColdFusion代码并提取导入语句,但我认为这对于实现这个目的来说太慢了。不仅如此,这还不能涵盖所有边缘情况

思想?
我想知道是否有人有更好的办法来解决这个问题?我可以采取完全不同的方法吗?使用ColdFusion运行时类可能有一种方法可以做到这一点,但我还没有弄清楚。

好吧,事实证明,当您了解ColdFusion运行时的基本机制时(最初我很难找到),这并不难

我最终发现一个ColdFusion组件(表示为
ColdFusion.runtime.TemplateProxy
封装了一个
ColdFusion.runtime.CFPage
实例,该实例又有一个
createObject
方法

因此,下面是我使用Java反射提出的解决方案:

<cfset host = new SomeComponent()>
<cfset pageField = createObject('java', 'coldfusion.runtime.TemplateProxy').getClass().getDeclaredField('page')>
<cfset pageField.setAccessible(true)>
<cfset page = pageField.get(host)>
<cfset test = page.createObject('Test')>

很有趣,你能解释一下每一行的作用吗?@Henry
pageField.get(host)
将深入到
host
组件实例(一个coldfusion.runtime.TemplateProxy java类)的内部,以检索它的
page
属性。从那里,我可以要求页面通过调用
createObject
来创建组件。
<cfset host = new SomeComponent()>
<cfset pageField = createObject('java', 'coldfusion.runtime.TemplateProxy').getClass().getDeclaredField('page')>
<cfset pageField.setAccessible(true)>
<cfset page = pageField.get(host)>
<cfset test = page.createObject('Test')>