📄 tij0177.html
字号:
is distinct from
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Double.class</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">).
It’s also possible, for a more flexible solution, to call <A NAME="Index2972"></A></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>getConstructors( )</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">,
which returns an array of the possible constructors.
</FONT><P></DIV><DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">What
comes back from
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>getConstructor( )
</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">is
a handle to a <A NAME="Index2973"></A></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Constructor</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
object (part of
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>java.lang.reflect</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">).
You call the constructor dynamically with the method <A NAME="Index2974"></A></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>newInstance( )</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">,
which takes an array of
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Object</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
containing the actual arguments. This array is again created using the Java 1.1<A NAME="Index2975"></A>
syntax:
</FONT><P></DIV><DIV ALIGN=LEFT><TT><FONT FACE="Courier New" SIZE=3 COLOR="Black">new
Object[]{new Double(info.data)}
</FONT></TT><P></DIV><DIV ALIGN=LEFT><P></DIV><DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">In
this case, however, the
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>double</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
must be placed inside a wrapper class so that it can be part of this array of
objects. The process of calling
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>newInstance( )</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
extracts the
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>double</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">,
but you can see it is a bit confusing – an argument might be a
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>double
</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">or
a
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Double</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">,
but when you make the call you must always pass in a
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Double</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">.
Fortunately, this issue exists only for the primitive types.
</FONT><P></DIV><DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">Once
you understand how to do it, the process of creating a new object given only a
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Class</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
handle is remarkably simple. Reflection also allows you to call methods in this
same dynamic fashion.
</FONT><P></DIV><DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">Of
course, the appropriate
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Class</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
handle might not be in the
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>trashTypes</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
list. In this case, the
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>return</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
in the inner loop is never executed and you’ll drop out at the end. Here,
the program tries to rectify the situation by loading the
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Class</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
object dynamically and adding it to the
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>trashTypes</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
list. If it still can’t be found something is really wrong, but if the
load is successful then the
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>factory</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
method is called <A NAME="Index2976"></A><A NAME="Index2977"></A>recursively
to try again.
</FONT><P></DIV><DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">As
you’ll see, the beauty of this design is that this code doesn’t
need to be changed, regardless of the different situations it will be used in
(assuming that all
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Trash</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
subclasses contain a constructor that takes a single
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>double</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
argument).
</FONT><P></DIV>
<A NAME="Heading560"></A><H4 ALIGN=LEFT>
Trash
subclasses
</H4>
<DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">To
fit into the prototyping scheme, the only thing that’s required of each
new subclass of
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Trash</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
is that it contain a constructor that takes a
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>double</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
argument. Java 1.1<A NAME="Index2978"></A>
reflection handles everything else.
</FONT><P></DIV><DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">Here
are the different types of
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Trash</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">,
each in their own file but part of the
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Trash</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
package (again, to facilitate reuse within the chapter):
</FONT><P></DIV>
<font color="#990000"><PRE><font color="#009900">//: Aluminum.java </font>
<font color="#009900">// The Aluminum class with prototyping</font>
<font color="#0000ff">package</font> c16.trash;
<font color="#0000ff">public</font> <font color="#0000ff">class</font> Aluminum <font color="#0000ff">extends</font> Trash {
<font color="#0000ff">private</font> <font color="#0000ff">static</font> <font color="#0000ff">double</font> val = 1.67f;
<font color="#0000ff">public</font> Aluminum(<font color="#0000ff">double</font> wt) { <font color="#0000ff">super</font>(wt); }
<font color="#0000ff">public</font> <font color="#0000ff">double</font> value() { <font color="#0000ff">return</font> val; }
<font color="#0000ff">public</font> <font color="#0000ff">static</font> <font color="#0000ff">void</font> value(<font color="#0000ff">double</font> newVal) {
val = newVal;
}
} <font color="#009900">///:~ </PRE></font></font><DIV ALIGN=LEFT><P></DIV>
<font color="#990000"><PRE><font color="#009900">//: Paper.java </font>
<font color="#009900">// The Paper class with prototyping</font>
<font color="#0000ff">package</font> c16.trash;
<font color="#0000ff">public</font> <font color="#0000ff">class</font> Paper <font color="#0000ff">extends</font> Trash {
<font color="#0000ff">private</font> <font color="#0000ff">static</font> <font color="#0000ff">double</font> val = 0.10f;
<font color="#0000ff">public</font> Paper(<font color="#0000ff">double</font> wt) { <font color="#0000ff">super</font>(wt); }
<font color="#0000ff">public</font> <font color="#0000ff">double</font> value() { <font color="#0000ff">return</font> val; }
<font color="#0000ff">public</font> <font color="#0000ff">static</font> <font color="#0000ff">void</font> value(<font color="#0000ff">double</font> newVal) {
val = newVal;
}
} <font color="#009900">///:~ </PRE></font></font><DIV ALIGN=LEFT><P></DIV>
<font color="#990000"><PRE><font color="#009900">//: Glass.java </font>
<font color="#009900">// The Glass class with prototyping</font>
<font color="#0000ff">package</font> c16.trash;
<font color="#0000ff">public</font> <font color="#0000ff">class</font> Glass <font color="#0000ff">extends</font> Trash {
<font color="#0000ff">private</font> <font color="#0000ff">static</font> <font color="#0000ff">double</font> val = 0.23f;
<font color="#0000ff">public</font> Glass(<font color="#0000ff">double</font> wt) { <font color="#0000ff">super</font>(wt); }
<font color="#0000ff">public</font> <font color="#0000ff">double</font> value() { <font color="#0000ff">return</font> val; }
<font color="#0000ff">public</font> <font color="#0000ff">static</font> <font color="#0000ff">void</font> value(<font color="#0000ff">double</font> newVal) {
val = newVal;
}
} <font color="#009900">///:~ </PRE></font></font><DIV ALIGN=LEFT><P></DIV><DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">And
here’s a new type of
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Trash</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">:</FONT><P></DIV>
<font color="#990000"><PRE><font color="#009900">//: Cardboard.java </font>
<font color="#009900">// The Cardboard class with prototyping</font>
<font color="#0000ff">package</font> c16.trash;
<font color="#0000ff">public</font> <font color="#0000ff">class</font> Cardboard <font color="#0000ff">extends</font> Trash {
<font color="#0000ff">private</font> <font color="#0000ff">static</font> <font color="#0000ff">double</font> val = 0.23f;
<font color="#0000ff">public</font> Cardboard(<font color="#0000ff">double</font> wt) { <font color="#0000ff">super</font>(wt); }
<font color="#0000ff">public</font> <font color="#0000ff">double</font> value() { <font color="#0000ff">return</font> val; }
<font color="#0000ff">public</font> <font color="#0000ff">static</font> <font color="#0000ff">void</font> value(<font color="#0000ff">double</font> newVal) {
val = newVal;
}
} <font color="#009900">///:~ </PRE></font></font><DIV ALIGN=LEFT><P></DIV><DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">You
can see that, other than the constructor, there’s nothing special about
any of these classes.
</FONT><P></DIV>
<A NAME="Heading561"></A><H4 ALIGN=LEFT>
Parsing
Trash from an external file
</H4>
<DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">The
information about
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Trash</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
objects will be read from an outside file. The file has all of the necessary
information about each piece of trash on a single line in the form
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>Trash:weight</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">,
such as:
</FONT><P></DIV>
<font color="#990000"><PRE>c16.Trash.Glass:54
c16.Trash.Paper:22
c16.Trash.Paper:11
c16.Trash.Glass:17
c16.Trash.Aluminum:89
c16.Trash.Paper:88
c16.Trash.Aluminum:76
c16.Trash.Cardboard:96
c16.Trash.Aluminum:25
c16.Trash.Aluminum:34
c16.Trash.Glass:11
c16.Trash.Glass:68
c16.Trash.Glass:43
c16.Trash.Aluminum:27
c16.Trash.Cardboard:44
c16.Trash.Aluminum:18
c16.Trash.Paper:91
c16.Trash.Glass:63
c16.Trash.Glass:50
c16.Trash.Glass:80
c16.Trash.Aluminum:81
c16.Trash.Cardboard:12
c16.Trash.Glass:12
c16.Trash.Glass:54
c16.Trash.Aluminum:36
c16.Trash.Aluminum:93
c16.Trash.Glass:93
c16.Trash.Paper:80
c16.Trash.Glass:36
c16.Trash.Glass:12
c16.Trash.Glass:60
c16.Trash.Paper:66
c16.Trash.Aluminum:36
c16.Trash.Cardboard:22</PRE></font><DIV ALIGN=LEFT><P></DIV><DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">Note
that the class path must be included when giving the class names, otherwise the
class will not be found.
</FONT><P></DIV><DIV ALIGN=LEFT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">To
parse this, the line is read and the <A NAME="Index2979"></A></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>String
</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">method
<A NAME="Index2980"></A></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>indexOf( )</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
produces the index of the ‘
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>:</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">’.
This is first used with the
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>String
</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">method
<A NAME="Index2981"></A><A NAME="Index2982"></A></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>substring( )
</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">to
extract the name of the trash type, and next to get the weight that is turned
into a
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>double
</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">with
the
</FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>static
<A NAME="Index2983"></A>Double.valueOf( )
</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">method.
The <A NAME="Index2984"></A><A NAME="Index2985"></A></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black"><B>trim( )</B></FONT><FONT FACE="Carmina Md BT" SIZE=3 COLOR="Black">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -