JavaFX教程-反射

ZDNet软件频道 时间:2008-08-02 作者: |  我要评论()
本文关键词:反射 教程 JavaFX 软件
JavaFX类、属性、操作可以通过如下方式反射:


JavaFX类、属性、操作可以通过如下方式反射

 public class Class {
  public attribute Name: String;
  public attribute Documentation:String?;
  public attribute Superclasses: Class* inverse Class.Subclasses;
  public attribute Subclasses: Class* inverse Class.Superclasses;
  public attribute Attributes: Attribute* inverse Attribute.Scope;
  public attribute Operations: Operation* inverse Operation.Target;
  public function instantiate();
 }

 public class Operation extends Class {
  public attribute Target: Class? inverse Class.Operations;
 }

 public class Attribute {
  public attribute Name: String;
  public attribute Documentation: String?;
  public attribute Scope: Class? inverse Class.Attributes;
  public attribute Type: Class?;
  public attribute Inverse: Attribute* inverse Attribute.Inverse;
  public attribute OneToOne: Boolean;
  public attribute ManyToOne: Boolean;
  public attribute OneToMany: Boolean;
  public attribute ManyToMany: Boolean;
  public attribute Optional: Boolean;
 }
JavaFX支持通过class操作符对类、属性、成员函数和操作的进行反射访问:

 import java.lang.System;

 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"
对属性值进行反射访问时,如果访问操作数是属性,则使用[]操作符:

 import java.lang.System;

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

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

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

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

 import java.lang.System;

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

 var x = new X();
 var p = 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"

 


 

反射

教程

JavaFX

软件


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134