`
suifongqi
  • 浏览: 55559 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

JFX 学习笔记 八 反射

    博客分类:
  • JAVA
阅读更多
反射关键字class
System.out.println(1.class.Name) // prints "Number"
System.out.println("Hello".class.Name); // prints "String"

class X {
attribute a: Number;
}
var x = new X();
System.out.println(x.class.Name); // prints "X"
System.out.println(sizeof x.class.Attributes); // prints 1
System.out.println(x.class.Attributes[0].Name); // prints "a"
——————————————————————————————————
class X {
attribute a: Number;
}
var x = new X();
x.a = 2;
System.out.println(x[x.class.Attributes[Name == 'a']]); // prints 2
————————————————————————————————————
在JavaFX中,类的成员函数和操作本身被模式化作为在目标类中的类,而形参和返回值被表示为属性。代表目标对象的属性名是“this”。代表返回值的属性名为“return”。代表形参的属性具有和形参相同的属性名。

译者注:这里的目标类是指使用成员函数和操作的类。而目标对象则指使用成员函数和操作的对象。

从上例中可以发现,你也可以从Class对象中获取相同的、被反射的操作。

被反射的操作能够像函数那样通过将目标对象作为第一个参数、其它参数作为后面的参数的方式被调用:

import java.lang.System;

class X {
operation foo(n: Number): Number;
}

var x = new X();
var op = x.class.Operations[Name == 'foo'];
System.out.println(op(x, 100));

// the above code is equivalent to the following non-reflective code:
System.out.println(x.foo(100));

bean属性和Java类的公共字段被反射为JavaFX属性。但是,Java方法不能被反射为JavaFX操作。如果你想调用某个Java方法,那么你可以通过简单地使用Java API来实现。

注意:与Java不同的:在JavaFX中class操作符被用于表达式,而不是用于类型名(type name)。因此作为补充,JavaFX支持从类型名中获取反射类对象的语法:

:TypeName

For example:

import java.lang.System;
System.out.println(:System.Name); // prints "java.lang.System"
System.out.println(:System.class.Name); // prints "Class"

广度(Extents)和枚举
类的“广度”,即此类的所有实例的集合,能够通过以下语法获得:

*:ClassName

例如,下面的代码打印出String类的所有实例:

import java.lang.System;

for (i in *:String) {
System.out.println(i);
}

注意:这是可选特性,默认情况下是失效的。

JavaFX也提供了声明类的命名实例的能力:
objectName:ClassName

例如:

import java.lang.System;

myString:String = "This is a string";

System.out.println(myString:String);

这样的命名实例是全局可访问的,但通常必须使用类名进行限制。然而,在属性初始化程序和赋值的上下文中,表达式类型的命名实例被引入到了词法作用域(lexical scope)(可见性弱于变量和属性),并可以通过使用它们的无限定名(unqualified names)引用这些命名实例:

Button {
mnemonic: P
text: "Press Me"
}
在上面实例中,由于Button的mnemonic属性是KeyStroke类型的,因此我能够通过使用它的无限定名访问其命名值P,而在别处我将不得不使用P:KeyStroke来引用它。

JavaFX使用与Java1.5同样的语法来访问枚举类型值:

import java.lang.management.MemoryType;

var heap = HEAP:MemoryType;
var nonHeap = NON_HEAP:MemoryType;

————————————————————————————————
JFX中使用例子与部分文字说明来自于:openjfx社区,感谢他们翻译了这么多东西

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

Global site tag (gtag.js) - Google Analytics