JAVA中文站社区门户t
h6V+W*`V!^ y"yJava历来是
种以不变应万变
语言
在Java 5中
annotation
引入使得Java在某些特殊
应用场合(如企业应用)中能够进行定制
Annotations 可被看作是用Java核心技术来定义
"领域特定语言"(Do
Spec
ic Languages,DSLs)
YF9t3pLm;nzh
r+WJAVA中文站社区门户+v\ Bs/L"KaH
~${,BAnnotation本质上是
种 name-value 形式
绑定
仅限于它们所能表达
意义
它们不能定义新
语法结构
例如为collection增加个"select"
事实上annotations
存在揭示了Java本身需要DSL
兼容
但是却缺乏能够完全实现DSL所必要
丰富性
4x!|d*p@u|iJAVA中文站社区门户 A~
LY6k\@在这里我们为使Java能够支持自定义语义给出了
些建议和方案
如果能够进行
些适当
"扩展"(extension)
在不和现有
语法冲突
情况下并且保留向后兼容
例如:用
些语法定义类来产生新
语法结构
姑且称的为 "语义类"
这样就能够以现有方式在
中得以实现
我们把这个方案称的: XJ (eXtensible Java,可扩展Java)
JAVA中文站社区门户mUTeJ8~H5|(Q8[#\Q;P:g#mXJ给Java带来了这个所谓
"语义类"
个语义类也是
个有通常语法
Java类
当Java解析器遇到由语义类定义
语法结构
那么就用语义类中定义
语法来处理这些输入信息
如果解析成功
那这些语法可以合成为
个Java抽象语法树(AST:abstract syntax tree )
个抽象语法树可以有
个标准接口被Java编译器所使用当处理语法
时候
AST
新类型可以通过实现合适
接口来进行创建
8poC9{5e.U4pd!DV!qW@;n``B [考虑到JAVA中
个简单语言结构:依据某些条件从
个collection中选
个元素出来
个使用新结构
例子如下所示:
JAVA中文站社区门户V0fq#\6y3zma MU8~5H A
lJava代码
5z7LO
F6i-ZJAVA中文站社区门户f^,Da1FrR*@"m"L H$X
_e0Zi
- import language mylang.Select;
- JAVA中文站社区门户P7w3m-{6Q
TZ:j
public Person getChild(Vector<;Person> people) {
:e+x]"k3u-^@Select Person p from people where p.age < 18 {
7Au$AF$i`4Im
U p;
- }
"~9JK]#T ?'A Q { JAVA中文站社区门户'u,K'?IT
null; }
- }
JAVA中文站社区门户h Oj"J&\O7i#P9U`JAVA中文站社区门户S
e N-m ^VhRP
- import language mylang.Select;
- JAVA中文站社区门户 \A$d Gr:t:NY;B'[
public Person getChild(Vector<;Person> people) {
+W*Ol)rB;B
c;B(_@Select Person p from people where p.age < 18 {
@AmN)c)C(WYWZ p;
- }
I*c^%q;guE-n.H/} { JAVA中文站社区门户(EZ6L+QN|0~
null; }
- }
JAVA中文站社区门户Y@5k&I(E2zx+nJimport language mylang.Select;public Person getChild(Vector<;Person> people) { @Select Person p from people where p.age < 18 {
p; }
{
null; }}
JAVA中文站社区门户:X_
{"^"ba:r4cM9~/cu be8N8nd6OOm这个新
语法接口可以叫做"Select",用"@"符号定义在语法类饮用
前缀
定义了
个Vector从中选出条件为年纪小于18岁
人群
最后返回满足条件
值
或者返回空值
Select
语法定义如下
JAVA中文站社区门户 J}/ZT
poJAVA中文站社区门户E-ef$a6H#W{:dDjJava代码
*mEATJ$De%y;b$e6Pf%@n
BLBZ:Is
- public Person getChild(Vector<;Person> people) {
- JAVA中文站社区门户Hqi2Ff;P
for( i = 0; i < people.size; i) {
- Person p = people.elementAt(i);
8x|-k%g;g:G(p.age < 18)
t0_x(Ba p;
- }
- JAVA中文站社区门户W.g*\B9aN6U
JAVA中文站社区门户}$F+ou@q;wy0W
null;
- }
JAVA中文站社区门户z#w1ed]oa8KpJAVA中文站社区门户(g;r-F2@3xXgZA\Zye4T
- public Person getChild(Vector<;Person> people) {
,fm4h` G&h9p5@EKsfor( i = 0; i < people.size; i) {
- Person p = people.elementAt(i);
- JAVA中文站社区门户hp;~^"i2{7w
pX
(p.age < 18)
- JAVA中文站社区门户
WeE0B/S#CnhM2g&D
p;
- }
8pBo4].r!v7l
%raD&Xh;[M
?null;
- }
N)WE1D!CI4t
epublic Person getChild(Vector<;Person> people) { for(
i = 0; i < people.size
; i
) { Person p = people.elementAt(i);
(p.age < 18)
p; }
null;}
JAVA中文站社区门户6h@!O!R9_C$K