Java 库的建立方法及其实例(6)

2008-05-24 05:34:41.0     浏览:139     来源:天新网
关键词:

Java 库的建立方法及其实例(6)


接下来,看看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<memregCount;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<lookaheadCount;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<memregCount;i++){


memregs[i]=new MemReg(-1); //unlikely to SearchEntry, in this case we know memreg indicies by defin


ition


}


this.memregs=memregs;


}


if((counterCount=regex.counters)>0) counters=new int[counterCount];


//定义了一些内部的数据。类的声明见下。


if((lookaheadCount=regex.lookaheads)>0){


LAEntry[] lookaheads=new LAEntry[lookaheadCount];


for(int i=0;i<lookaheadCount;i++){


lookaheads[i]=new LAEntry();


}


this.lookaheads=lookaheads;


}


this.memregCount=memregCount;


this.counterCount=counterCount;


this.lookaheadCount=lookaheadCount;


first=new SearchEntry(memregCount,counterCount);


defaultEntry=new SearchEntry(memregCount,counterCount);


minQueueLength=regex.stringRepr.length()/2; // evaluation!!!


}


把这两个类说明为default属性,说明这两个类在jregex这个包的内部可见,而在外部是不可见的。这 两个类的作用是专有的,而不是通用的。回忆一下本文前面提到过的,包的封装,"如果你不想让 类被外部的代码使用,可以用缺省的属性,去掉public."


class MemReg{


int index;


int in=-1,out=-1;


int tmp=-1; //for assuming at GROUP_IN


MemReg(int index){


this.index=index;


}


void reset(){


in=out=-1;


}

}


class LAEntry{


int index;


SearchEntry top,actual;


}


另外,关于包的结构和包中的类的关系,我们感兴趣的还有,MatchIterator。


[games]$javap -classpath .. -s jregex.MatchIterator


Compiled from jregex/MatchIterator.java


public interface jregex.MatchIterator


/* ACC_SUPER bit NOT set */


{


public abstract boolean hasMore();


/* ()Z */


public abstract jregex.MatchResult nextMatch();


/* ()Ljregex/MatchResult; */


public abstract int count();


/* ()I */


}


这是一个interface, 定义了iterator的常用方法,列出所有的MatchResult的实例。 (未完待续)