我正在尝试在Grails中动态创建域对象,并遇到这样的问题:对于引用另一个域对象的任何属性,metaproperty告诉我它的类型是"java.lang.Object"而不是期望的类型.
例如:
class PhysicalSiteAssessment {
// site info
Site site
Date sampleDate
Boolean rainLastWeek
String additionalNotes
...
Run Code Online (Sandbox Code Playgroud)
是域类的开头,它引用另一个域类"站点".
如果我尝试使用此代码(在服务中)动态查找此类的属性类型:
String entityName = "PhysicalSiteAssessment"
Class entityClass
try {
entityClass = grailsApplication.getClassForName(entityName)
} catch (Exception e) {
throw new RuntimeException("Failed to load class with name '${entityName}'", e)
}
entityClass.metaClass.getProperties().each() {
println "Property '${it.name}' is of type '${it.type}'"
}
Run Code Online (Sandbox Code Playgroud)
然后结果是它识别Java类,但不识别Grails域类.输出包含以下行:
Property 'site' is of type 'class java.lang.Object'
Property 'siteId' is of type 'class java.lang.Object'
Property 'sampleDate' is of type 'class java.util.Date'
Property 'rainLastWeek' …Run Code Online (Sandbox Code Playgroud) 当出现问题时我会尝试记录日志,所以我想编写类信息和函数名称,如下所示:
void MainWindowTest::testMethod()
{
qDebug()<<QString("ClassName is:%0,Function Name is:%1")
.arg(this->metaObject()->className()).arg("how to get method name");
}
Run Code Online (Sandbox Code Playgroud)
这该怎么做?
我是Groovy编程语言的新手,我正在努力完全理解它的动态特性和功能.我所知道的是,在Groovy中以最基本的形式创建的每个类都看起来像这样(实现GroovyObject并扩展java Object).
public class Foo implements groovy.lang.GroovyObject extends java.lang.Object { }
Run Code Online (Sandbox Code Playgroud)
Groovy对象还包含一个扩展MetaObjectProtocol的MetaClass.正是这个类层次结构提供了一些Groovy的动态功能.这包括内省自身(getProperties,getMethods)或拦截方法(invokeMethod,missingMethod)的能力.
我也了解Groovy中可用的不同类型的元编程.这些使您能够在运行时或编译时添加或覆盖功能.
现在我们可以解决这个问题.当某人或某本书引用Groovy中的"Metaobject协议"时,我们会讨论特定类或事物集合.我很难把握一些没有定义或一成不变的东西.我的一本书将其定义为
协议是规则和格式的集合.元对象协议(MOP)是Groovy运行时系统如何处理方法调用请求以及如何控制中间层的规则的集合.协议的"格式"由各自的API定义,
我还有Venkat的Programming Groovy 2书,其中有一个定义了这个方法查找过程的图表.所以我猜这是我们如何请求方法的规则(至少是POGO,我理解POJO是不同的).

无论如何我认为我走的是正确的道路,但我觉得我仍然缺少那个"啊哈哈"的时刻.任何人都可以填写我所缺少的内容吗?或者至少告诉我这里的ramblings有点意义:)谢谢!!
我正在寻找这样的东西:
MyClass::metaObject()->className()
这不起作用,因为在执行此代码时,不存在MyClass的实例化.
如果这在某种程度上是可能的,有没有办法获得从MyClass派生的所有类的名称?
请原谅我的无知,但什么是Metaobject协议,Ruby有一个吗?如果没有,是否可以为Ruby实现一个?如果Ruby有一个,Metaobject协议可能具有哪些功能呢?
我有一个继承自QObject并具有Q_OBJECT宏的类:
class SomeClass: public QObject
{
Q_OBJECT
public:
SomeClass(QObject *parent = 0);
void method1();
void method2();
...
};
Run Code Online (Sandbox Code Playgroud)
在同一个头中的另一个类中,我创建了该类的实例,然后我尝试从'SomeClass'获取所有方法并将其存储在QMap中:
this->someclass = new SomeClass(); // in constructor.
Run Code Online (Sandbox Code Playgroud)
...
cout<<"init some class methods"<<endl;
const QMetaObject *metaobj = dynamic_cast<QObject*>(this->someclass)->metaObject();
cout<<"offset "<<metaobj->methodOffset()<<endl;
for(int i = metaobj->methodOffset();i < metaobj->methodCount();i++){
QMetaMethod metamethod = metaobj->method(i);
//if(metamethod.methodType() == QMetaMethod::Method){
QString methodname = QString(metamethod.signature());
methodname = methodname.replace(QRegExp("\\(.*\\)"),"");
controlmethods.insert(methodname,metamethod);
cout<<"added method: "<<metamethod.signature()<<" as "<<methodname.toAscii().data()<<endl;
//}
}
Run Code Online (Sandbox Code Playgroud)
但这并没有向我展示任何添加的方法,因为方法偏移量等于方法计数,为什么可以呢?我没理由,谢谢你的帮助.
我正在为我的应用程序编写单元测试,现在我偶然发现了一个我应该测试私有方法的类.这可能是特定班级设计不佳的结果,但我必须这样做.有没有办法在Qt中调用私有方法,可能使用QMetaObject或类似的东西?
对于单元测试,我使用的是QTestLib框架.
为什么Qt会dynamic_cast在QObject层次结构QEvent等中重新实现自定义RTTI系统和自己的系统?