回忆一下,我在本文的开头,曾经提到过:"一个好的库必须是一个紧凑的关系紧密的整体,而不是一个分散的关系松散的对象的集合。"从api说明文档所显示的这个库的树形结构,并不能看出这些类之间的联系。而从源代码的角度,我们则可以清楚地看到这一点。在这一部分的讨论中,我们 也明白了两点:
1、如何编写重载构造函数
2、在一个类的实例中返回另外一个类的实例
接下来,看看matcher类。这个类实现了matchresult interface. 看看matchresult的定义:
[games]$javap -classpath .. -s jregex.matchresult
compiled from jregex/matchresult.java
public interface jregex.matchresult
/* acc_super bit not set */
{
public static final int match;
/* i */
public static final int prefix;
/* i */
public static final int suffix;
/* i */
public static final int target;
/* i */
public abstract jregex.pattern pattern();
/* ()ljregex/pattern; */
public abstract int groupcount();
/* ()i */
public abstract boolean iscaptured();
/* ()z */
public abstract boolean iscaptured(int);
/* (i)z */
public abstract boolean iscaptured(java.lang.string);
/* (ljava/lang/string;)z */
public abstract java.lang.string group(int);
/* (i)ljava/lang/string; */
public abstract boolean getgroup(int, java.lang.stringbuffer);
/* (iljava/lang/stringbuffer;)z */
public abstract boolean getgroup(int, jregex.textbuffer);
/* (iljregex/textbuffer;)z */
public abstract java.lang.string group(java.lang.string);
/* (ljava/lang/string;)ljava/lang/string; */
public abstract boolean getgroup(java.lang.string, java.lang.stringbuffer);
/* (ljava/lang/string;ljava/lang/stringbuffer;)z */
public abstract boolean getgroup(java.lang.string, jregex.textbuffer);
/* (ljava/lang/string;ljregex/textbuffer;)z */
public abstract java.lang.string prefix();
/* ()ljava/lang/string; */
public abstract java.lang.string suffix();
/* ()ljava/lang/string; */
public abstract java.lang.string target();
/* ()ljava/lang/string; */
public abstract int targetstart();
/* ()i */
public abstract int targetend();
/* ()i */
public abstract char targetchars()[];
/* ()[c */
public abstract int start();
/* ()i */
public abstract int end();
/* ()i */
public abstract int length();
/* ()i */
public abstract int start(int);
/* (i)i */
public abstract int end(int);
/* (i)i */
public abstract int length(int);
/* (i)i */
public abstract char charat(int);
/* (i)c */
public abstract char charat(int, int);
/* (ii)c */
}
jregex.matchresult定义了一些abstract函数。有什么作用?在后面我们将会讨论到。
再看看matcher的实现。
games]$javap -classpath .. -s jregex.matcher
compiled from jregex/matcher.java
public class jregex.matcher extends java.lang.object implements jregex.matchresult {
public static final int anchor_start;
/* i */
public static final int anchor_lastmatch;
/* i */
public static final int anchor_end;
/* i */
public static final int accept_incomplete;
/* i */
jregex.matcher(jregex.pattern);
/* (ljregex/pattern;)v */
public final void settarget(jregex.matcher, int);
/* (ljregex/matcher;i)v */
public void settarget(java.lang.string);
/* (ljava/lang/string;)v */
public void settarget(java.lang.string, int, int);
/* (ljava/lang/string;ii)v */
public void settarget(char[], int, int);
/* ([cii)v */
public final void settarget(char[], int, int, boolean);
/* ([ciiz)v */
public void settarget(java.io.reader, int) throws java.io.ioexception;
/* (ljava/io/reader;i)v */
public final boolean isstart();
/* ()z */
public final boolean matches();
/* ()z */
public final boolean matches(java.lang.string);
/* (ljava/lang/string;)z */
public void setposition(int);
/* (i)v */
public final boolean find();
/* ()z */
public final boolean find(int);
/* (i)z */
public jregex.matchiterator findall();
/* ()ljregex/matchiterator; */
public jregex.matchiterator findall(int);
/* (i)ljregex/matchiterator; */
public final boolean proceed();
/* ()z */
public final boolean proceed(int);
/* (i)z */
public final void skip();
/* ()v */
public java.lang.string tostring();
/* ()ljava/lang/string; */
public jregex.pattern pattern();
/* ()ljregex/pattern; */
public java.lang.string target();
/* ()ljava/lang/string; */
public char targetchars()[];
/* ()[c */
public int targetstart();
/* ()i */
public int targetend();
/* ()i */
public char charat(int);
/* (i)c */
public char charat(int, int);
/* (ii)c */
public final int length();
/* ()i */
public final int start();
/* ()i */
public final int end();
/* ()i */
public java.lang.string prefix();
/* ()ljava/lang/string; */
public java.lang.string suffix();
/* ()ljava/lang/string; */
public int groupcount();
/* ()i */
public java.lang.string group(int);
/* (i)ljava/lang/string; */
public java.lang.string group(java.lang.string);
/* (ljava/lang/string;)ljava/lang/string; */
public boolean getgroup(int, jregex.textbuffer);
/* (iljregex/textbuffer;)z */
public boolean getgroup(java.lang.string, jregex.textbuffer);
/* (ljava/lang/string;ljregex/textbuffer;)z */
public boolean getgroup(int, java.lang.stringbuffer);
/* (iljava/lang/stringbuffer;)z */
public boolean getgroup(java.lang.string, java.lang.stringbuffer);
/* (ljava/lang/string;ljava/lang/stringbuffer;)z */
public java.lang.string groups()[];
/* ()[ljava/lang/string; */
public java.util.vector groupv();
/* ()ljava/util/vector; */
public final boolean iscaptured();
/* ()z */
public final boolean iscaptured(int);
/* (i)z */
public final boolean iscaptured(java.lang.string);
/* (ljava/lang/string;)z */
public final int length(int);
/* (i)i */
public final int start(int);
/* (i)i */
public final int end(int);
/* (i)i */
public java.lang.string tostring_d();
/* ()ljava/lang/string; */
static {};
/* ()v */
先来看看它的构造函数,这个函数在pattern中被调用用来构造matcher类的实例。
matcher(pattern regex){
//注意下面这一行,它说明matcher类的内部有一个指向pattern实例的reference.
this.re=regex;
//int memregcount=(memregs=new memreg[regex.memregs]).length;
//for(int i=0;i // this.memregs[i]=new memreg(-1); //unlikely to searchentry, in this case we know memreg indicies by d
efinition
//}
//counters=new int[regex.counters];
//int lookaheadcount=(lookaheads=new laentry[regex.lookaheads]).length;
//for(int i=0;i // this.lookaheads[i]=new laentry();
//}
//定义了一些内部的数据,memreg是一个有三个整数的类。类的声明见下。
int memregcount,countercount,lookaheadcount;
if((memregcount=regex.memregs)>0){
memreg[] memregs=new memreg[memregcount];
for(int i=0;i memregs[i]=new memreg(-1); //unlikely to searchentry, in this case we know memreg indicies by defin
ition
}
this.m
闽公网安备 35060202000074号