首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在执行导入语句时,在ColdFusion中的另一个cfc上下文中执行函数

在执行导入语句时,在ColdFusion中的另一个cfc上下文中执行函数
EN

Stack Overflow用户
提问于 2016-08-24 18:15:15
回答 1查看 191关注 0票数 4

背景

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

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

问题

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

代码语言:javascript
复制
<cfimport path="some.namespace.Test">

<cfcomponent>
    <cfproperty name="test" type="Test">
</cfcomponent>

当我试图从createObject('Test')函数上下文执行componentFromJson时,它显然失败了,因为调用上下文没有导入。

我尝试过许多不同的方法来解决这个问题,包括动态地在父组件上定义组件工厂函数,以及使用invoke在父CFC上下文中调用工厂函数,但是它不起作用。

例如。

代码语言:javascript
复制
<cfscript>
    parentCmp = createObject('SomeCmp');
    parentCmp.createComponent = function (type) {
        return createObject(type);
    };
    childCmp = invoke(parentCmp, 'createComponent', { type = 'Test' });
</cfscript>

可怕的解决方案

我现在能想到的解决这个问题的唯一方法是解析CFC的ColdFusion代码并提取导入语句,但我认为这样做太慢了。不仅如此,这并不能涵盖所有边缘案件。

想法?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-24 22:28:56

实际上,当您了解ColdFusion运行时的基本机制(我很难找到它)时,这并不难。

最后,我发现一个ColdFusion组件(它被表示为一个coldfusion.runtime.TemplateProxy )封装了一个coldfusion.runtime.CFPage实例,而这个实例又有一个createObject方法。

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

代码语言:javascript
复制
<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')>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39130369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档