﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-fcailiao</title><link>http://www.blogjava.net/fcailiao/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 05 May 2026 21:55:28 GMT</lastBuildDate><pubDate>Tue, 05 May 2026 21:55:28 GMT</pubDate><ttl>60</ttl><item><title>Mysql的常用命令详细介绍</title><link>http://www.blogjava.net/fcailiao/archive/2007/10/11/151965.html</link><dc:creator>hanzao</dc:creator><author>hanzao</author><pubDate>Thu, 11 Oct 2007 02:24:00 GMT</pubDate><guid>http://www.blogjava.net/fcailiao/archive/2007/10/11/151965.html</guid><wfw:comment>http://www.blogjava.net/fcailiao/comments/151965.html</wfw:comment><comments>http://www.blogjava.net/fcailiao/archive/2007/10/11/151965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fcailiao/comments/commentRss/151965.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fcailiao/services/trackbacks/151965.html</trackback:ping><description><![CDATA[Mysql的常用命令<br />
<br />
&nbsp; &nbsp; 一、连接MYSQL。 <br />
<br />
格式： mysql -h主机地址 -u用户名 －p用户密码 <br />
<br />
1、例1：连接到本机上的MYSQL。 <br />
<br />
&nbsp;
&nbsp;&nbsp;&nbsp;首先在打开DOS窗口，然后进入目录 mysqlbin，再键入命令mysql -uroot
-p，回车后提示你输密码，如果刚安装好MYSQL，超级用户root是没有密码的，故直接回车即可进入到MYSQL中了，MYSQL的提示符是：
mysql&gt; <br />
<br />
2、例2：连接到远程主机上的MYSQL。假设远程主机的IP为：110.110.110.110，用户名为root,密码为abcd123。则键入以下命令： <br />
<br />
mysql -h110.110.110.110 -uroot -pabcd123 <br />
<br />
（注:u与root可以不用加空格，其它也一样） <br />
<br />
3、退出MYSQL命令： exit （回车）;quit;
你也可以用control-D退出。 <br />
<br />
<p>4、查看版本号和当前日期 </p>
<p>mysql&gt; select version(),current_date(); <br />
+----------------+-----------------+ <br />
| version() | current_date() | <br />
+----------------+-----------------+ <br />
| 3.23.25a-debug | 2001-05-17 | <br />
+----------------+-----------------+ <br />
1 row in set (0.01 sec) <br />
mysql&gt;<br />
<br />
此命令要求mysql服务器告诉你它的版本号和当前日期。尝试用不同大小写操作上述命令，看结果如何。结果说明mysql命令的大小写结果是一致的。 </p>
<br />
&nbsp; &nbsp;&nbsp;&nbsp;二、修改密码。 <br />
<br />
格式：mysqladmin -u用户名 -p旧密码 password 新密码 <br />
<br />
1、例1：给root加个密码ab12。首先在DOS下进入目录mysqlbin，然后键入以下命令 <br />
<br />
mysqladmin -uroot -password ab12 <br />
<br />
注：因为开始时root没有密码，所以-p旧密码一项就可以省略了。 <br />
<br />
2、例2：再将root的密码改为djg345。 <br />
<br />
mysqladmin -uroot -pab12 password djg345 <br />
<br />
&nbsp; &nbsp;&nbsp;&nbsp;三、增加新用户。（注意：和上面不同，下面的因为是MYSQL环境中的命令，所以后面都带一个分号作为命令结束符） <br />
<br />
格式：grant select on 数据库.* to 用户名@登录主机 identified by ""密码"" <br />
<br />
例1、增加一个用户test1密码为abc，让他可以在任何主机上登录，并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL，然后键入以下命令： <br />
<br />
grant select,insert,update,delete on *.* to test1@""%"" Identified by ""abc""; <br />
<br />
但例1增加的用户是十分危险的，你想如某个人知道test1的密码，那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了，解决办法见例2。 <br />
<br />
&nbsp;
&nbsp;&nbsp;&nbsp;例2、增加一个用户test2密码为abc,让他只可以在localhost上登录，并可以对数据库mydb进行查询、插入、修改、删除的操作
（localhost指本地主机，即MYSQL数据库所在的那台主机），这样用户即使用知道test2的密码，他也无法从internet上直接访问数据
库，只能通过MYSQL主机上的web页来访问了。 <br />
<br />
grant select,insert,update,delete on mydb.* to test2@localhost identified by ""abc""; <br />
<br />
如果你不想test2有密码，可以再打一个命令将密码消掉。 <br />
<br />
grant select,insert,update,delete on mydb.* to test2@localhost identified by """"; <br />
<br />
&nbsp; &nbsp;&nbsp;&nbsp;在上篇我们讲了登录、增加用户、密码更改等问题。下篇我们来看看MYSQL中有关数据库方面的操作。注意：你必须首先登录到MYSQL中，以下操作都是在MYSQL的提示符下进行的，而且每个命令以分号结束。 <br />
<br />
一、操作技巧 <br />
<br />
1、如果你打命令时，回车后发现忘记加分号，你无须重打一遍命令，只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打，完后用分号作结束标志就OK。 <br />
<br />
2、你可以使用光标上下键调出以前的命令。但以前我用过的一个MYSQL旧版本不支持。我现在用的是mysql-3.23.27-beta-win。 <br />
<br />
3、一条命令可以分成多行输入，直到出现分号&#8220;；&#8221;为止，如：<br />
mysql&gt; select <br />
-&gt; USER() <br />
-&gt; , <br />
-&gt; now() <br />
-&gt;; <br />
+--------------------+---------------------+ <br />
| USER() | now() | <br />
+--------------------+---------------------+ <br />
| ODBC@localhost | 2001-05-17 22:59:15 | <br />
+--------------------+---------------------+ <br />
1 row in set (0.06 sec) <br />
mysql&gt;<br />
<p>注意中间的逗号和最后的分号的使用方法。</p>
<br />
<p>4、一行多命令
</p>
<p>输入如下命令： </p>
<p>mysql&gt; SELECT USER(); SELECT NOW(); <br />
+------------------+ <br />
| USER() | <br />
+------------------+ <br />
| ODBC@localhost | <br />
+------------------+ <br />
1 row in set (0.00 sec) </p>
<p>+---------------------+ <br />
| NOW() | <br />
+---------------------+ <br />
| 2001-05-17 23:06:15 | <br />
+---------------------+ <br />
1 row in set (0.00 sec) <br />
mysql&gt;<br />
</p>
<p><br />
注意中间的分号，命令之间用分号隔开。 </p>
<br />
二、显示命令 <br />
<br />
1、显示数据库列表。 <br />
<br />
show databases; <br />
<br />
刚开始时才两个数据库：mysql和test。mysql库很重要它里面有MYSQL的系统信息，我们改密码和新增用户，实际上就是用这个库进行操作。 <br />
<br />
2、显示库中的数据表： <br />
<br />
use mysql； ／／打开库，学过FOXBASE的一定不会陌生吧 <br />
<br />
show tables; <br />
<br />
3、显示数据表的结构： <br />
<br />
describe 表名; <br />
<br />
4、建库： <br />
<br />
create database 库名; <br />
<br />
5、建表： <br />
<br />
use 库名； <br />
<br />
create table 表名 (字段设定列表)； <br />
<br />
6、删库和删表: <br />
<br />
drop database 库名; <br />
<br />
drop table 表名； <br />
<br />
7、将表中记录清空： <br />
<br />
delete from 表名; <br />
<br />
8、显示表中的记录： <br />
<br />
select * from 表名; <br />
<br />
三、一个建库和建表以及插入数据的实例 <br />
<br />
drop database if exists school; //如果存在SCHOOL则删除 <br />
<br />
create database school; //建立库SCHOOL <br />
<br />
use school; //打开库SCHOOL <br />
<br />
create table teacher //建立表TEACHER <br />
<br />
( <br />
<br />
id int(3) auto_increment not null primary key, <br />
<br />
name char(10) not null, <br />
<br />
address varchar(50) default &#8217;深圳&#8217;, <br />
<br />
year date <br />
<br />
); //建表结束 <br />
<br />
//以下为插入字段 <br />
<br />
insert into teacher values(&#8217;&#8217;,&#8217;glchengang&#8217;,&#8217;深圳一中&#8217;,&#8217;1976-10-10&#8217;); <br />
<br />
insert into teacher values(&#8217;&#8217;,&#8217;jack&#8217;,&#8217;深圳一中&#8217;,&#8217;1975-12-23&#8217;); <br />
<br />
&nbsp;
&nbsp;&nbsp;&nbsp;注：在建表中（1）将ID设为长度为3的数字字段:int(3)并让它每个记录自动加一:auto_increment并不能为空:not
null而且让他成为主字段primary
key（2）将NAME设为长度为10的字符字段（3）将ADDRESS设为长度50的字符字段，而且缺省值为深圳。varchar和char有什么区别
呢，只有等以后的文章再说了。（4）将YEAR设为日期字段。 <br />
<br />
如果你在mysql提示符键入上面的命令也可以，但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.sql，然后复制到c:""下，并在DOS状态进入目录""mysql""bin，然后键入以下命令： <br />
<br />
mysql -uroot -p密码 &lt; c:""school.sql <br />
<br />
如果成功，空出一行无任何显示；如有错误，会有提示。（以上命令已经调试，你只要将//的注释去掉即可使用）。 <br />
<br />
四、将文本数据转到数据库中 <br />
<br />
1、文本数据应符合的格式：字段数据之间用tab键隔开，null值用""n来代替. <br />
<br />
例： <br />
<br />
3 rose 深圳二中 1976-10-10 <br />
<br />
4 mike 深圳一中 1975-12-23 <br />
<br />
2、数据传入命令 load data local infile ""文件名"" into table 表名; <br />
<br />
注意：你最好将文件复制到""mysql""bin目录下，并且要先用use命令打表所在的库。 <br />
<br />
五、备份数据库：（命令在DOS的""mysql""bin目录下执行） <br />
<br />
mysqldump --opt school&gt;school.bbb <br />
<br />
注释:将数据库school备份到school.bbb文件，school.bbb是一个文本文件，文件名任取，打开看看你会有新发现。 <br />
<br />
&nbsp;
&nbsp;&nbsp;&nbsp;后记：其实MYSQL的对数据库的操作与其它的SQL类数据库大同小异，您最好找本将SQL的书看看。<a href=""></a>
<img src ="http://www.blogjava.net/fcailiao/aggbug/151965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fcailiao/" target="_blank">hanzao</a> 2007-10-11 10:24 <a href="http://www.blogjava.net/fcailiao/archive/2007/10/11/151965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]MYSQL 字符集问题</title><link>http://www.blogjava.net/fcailiao/archive/2007/10/11/151946.html</link><dc:creator>hanzao</dc:creator><author>hanzao</author><pubDate>Thu, 11 Oct 2007 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/fcailiao/archive/2007/10/11/151946.html</guid><wfw:comment>http://www.blogjava.net/fcailiao/comments/151946.html</wfw:comment><comments>http://www.blogjava.net/fcailiao/archive/2007/10/11/151946.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fcailiao/comments/commentRss/151946.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fcailiao/services/trackbacks/151946.html</trackback:ping><description><![CDATA[[原文]http://www.blogjava.net/wldandan/archive/2007/09/04/142669.html<br />
前一段时间，一直被mysql的字符集困扰，今天就这方面的知识总结一下.<br />
MySQL的字符集支持(Character Set Support)有两个方面：<br />
&nbsp;&nbsp;&nbsp;&nbsp; 字符集(Character
set)和排序方式(Collation)。<br />
对于字符集的支持细化到四个层次:
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 服务器(server)，数据库(database)，数据表(table)和连接(connection)。<br />
<br />
<br />
1.MySQL默认字符集
<p>&nbsp; MySQL对于字符集的指定可以细化到一个数据库，一张表，一列，应该用什么字符集。</p>
<p>但是，传统的
程序在创建数据库和数据表时并没有使用那么复杂的配置，它们用的是默认的配置，那么，默认的配置从何而来呢？</p>
&nbsp;&nbsp;&nbsp; (1)编译MySQL 时，指定了一个默认的字符集，这个字符集是 latin1；<br />
&nbsp;&nbsp;&nbsp; (2)安装MySQL 时，可以在配置文件 (my.ini) 中指定一个默认的的字符集，如果没指定，这个值继承自编译时指定的；<br />
&nbsp;&nbsp;&nbsp; (3)启动mysqld 时，可以在命令行参数中指定一个默认的的字符集，如果没指定，这个值继承自配置文件中的配置,此时 <strong>character_set_server</strong> 被设定为这个默认的字符集；<br />
&nbsp;&nbsp;&nbsp; (4)当创建一个新的数据库时，除非明确指定，这个数据库的字符集被缺省设定为<strong>character_set_server</strong>；<br />
&nbsp;&nbsp;&nbsp; (5)当选定了一个数据库时，<strong>character_set_database</strong> 被设定为这个数据库默认的字符集；<br />
&nbsp;&nbsp;&nbsp; (6)在这个数据库里创建一张表时，表默认的字符集被设定为 <strong>character_set_database</strong>，也就是这个数据库默认的字符集；<br />
&nbsp;&nbsp;&nbsp; (7)当在表内设置一栏时，除非明确指定，否则此栏缺省的字符集就是表默认的字符集；<br />
<p>简单的总结一下，如果什么地方都不修改，那么所有的数据库的所有表的所有栏位的都用 latin1 存储，不过我们如果安装 MySQL，一般都会选择多语言支持，也就是说，安装程序会自动在配置文件中把 <strong>default_character_set</strong> 设置为 UTF-8，这保证了缺省情况下，所有的数据库的所有表的所有栏位的都用 UTF-8 存储。</p>
<br />
2.查看默认字符集(默认情况下，mysql的字符集是latin1(ISO_8859_1)<br />
通常，查看系统的字符集和排序方式的设定可以通过下面的两条命令：<br />
&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; SHOW VARIABLES LIKE 'character%';<br />
+--------------------------+---------------------------------+<br />
| Variable_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
+--------------------------+---------------------------------+<br />
| character_set_client&nbsp;&nbsp;&nbsp;&nbsp; | latin1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_connection | latin1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_database&nbsp;&nbsp; | latin1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_filesystem | binary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; |<br />
| character_set_results&nbsp;&nbsp;&nbsp; | latin1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_server &nbsp;&nbsp;&nbsp; | latin1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_system&nbsp; &nbsp;&nbsp; | utf8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_sets_dir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | D:"mysql-5.0.37"share"charsets" |<br />
+--------------------------+---------------------------------+<br />
<br />
&nbsp; mysql&gt; SHOW VARIABLES LIKE 'collation_%';<br />
+----------------------+-----------------+<br />
| Variable_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
+----------------------+-----------------+<br />
| collation_connection | utf8_general_ci |<br />
| collation_database&nbsp;&nbsp; | utf8_general_ci |<br />
| collation_server&nbsp;&nbsp;&nbsp;&nbsp; | utf8_general_ci |<br />
+----------------------+-----------------+<br />
<br />
3.修改默认字符集<br />
&nbsp; (1) 最简单的修改方法，就是修改mysql的my.ini文件中的字符集键值，<br />
如 &nbsp;&nbsp; default-character-set = utf8<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; character_set_server =&nbsp; utf8<br />
&nbsp;&nbsp; 修改完后，重启mysql的服务，service mysql restart<br />
&nbsp;&nbsp; 使用 mysql&gt; SHOW VARIABLES LIKE 'character%';查看，发现数据库编码均已改成utf8<br />
+--------------------------+---------------------------------+<br />
| Variable_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
+--------------------------+---------------------------------+<br />
| character_set_client&nbsp;&nbsp;&nbsp;&nbsp; | utf8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_connection | utf8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_database&nbsp;&nbsp; | utf8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_filesystem | binary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_results&nbsp;&nbsp;&nbsp; | utf8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_server&nbsp;&nbsp;&nbsp;&nbsp; | utf8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_set_system&nbsp;&nbsp;&nbsp;&nbsp; | utf8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
| character_sets_dir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | D:"mysql-5.0.37"share"charsets" |<br />
+--------------------------+---------------------------------+<br />
<br />
&nbsp;&nbsp; (2) 还有一种修改字符集的方法，就是使用mysql的命令<br />
&nbsp;&nbsp; &nbsp; mysql&gt; SET character_set_client = utf8 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; SET character_set_connection = utf8 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; SET character_set_database = utf8 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; SET character_set_results = utf8 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; SET character_set_server = utf8 ;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; SET collation_connection = utf8 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; SET collation_database = utf8 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; SET collation_server = utf8 ;<br />
<br />
<br />
一般就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询，你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句：
<p>SET NAMES 'utf8';</p>
它相当于下面的三句指令：<br />
SET character_set_client = utf8;<br />
SET character_set_results = utf8;<br />
SET character_set_connection = utf8;<br />
<br />
总结: <br />
<span>因此，使用什么数据库版本，不管是3.x，还是4.0.x还是4.1.x，其实对我们来说不重要，重要的有二： <br />
&nbsp; 1)
正确的设定数据库编码.MySQL4.0以下版本的字符集总是默认ISO8859-1，MySQL4.1在安装的时候会让你选择。如果你准备使用UTF-
8，那么在创建数据库的时候就要指定好UTF-8(创建好以后也可以改，4.1以上版本还可以单独指定表的字符集) <br />
&nbsp; 2) 正确的设定数据库connection编码.设置好数据库的编码后，在连接数据库时候，应该指定connection的编码，比如使用jdbc连接时，指定连接为utf8方式.</span>
<img src ="http://www.blogjava.net/fcailiao/aggbug/151946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fcailiao/" target="_blank">hanzao</a> 2007-10-11 09:39 <a href="http://www.blogjava.net/fcailiao/archive/2007/10/11/151946.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java反射机制[基础学习]</title><link>http://www.blogjava.net/fcailiao/archive/2007/10/07/150800.html</link><dc:creator>hanzao</dc:creator><author>hanzao</author><pubDate>Sun, 07 Oct 2007 03:34:00 GMT</pubDate><guid>http://www.blogjava.net/fcailiao/archive/2007/10/07/150800.html</guid><wfw:comment>http://www.blogjava.net/fcailiao/comments/150800.html</wfw:comment><comments>http://www.blogjava.net/fcailiao/archive/2007/10/07/150800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fcailiao/comments/commentRss/150800.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fcailiao/services/trackbacks/150800.html</trackback:ping><description><![CDATA[[来自]http://java.ccidnet.com/art/3737/20050409/454831_1.html<br />
<h3><font size="1">一、反射的概念 ：</font></h3>
<font size="1"></font>
<p><font size="1">Java中，反射是一种强大的工具。它使您能够创建灵活的代码，这些代码可以在运行时装配，无需在组件之间进行源代
表链接。反射允许我们在编写与执
行时，使我们的程序代码能够接入装载到JVM中的类的内部信息，而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的
是：如果使用不当，反射的成本很高。</font></p>
<h3><font size="1">二、Java中的类反射：</font></h3>
<p><font size="1">Reflection 是 Java 程序开发语言的特征之一，它允许运行中的 Java
程序对自身进行检查，或者说&#8220;自审&#8221;，并能直接操作程序 的内部属性。Java
的这一能力在实际应用中也许用得不是很多，但是在其它的程序设计语言中根本就不存在这一特性。例如，Pascal、C 或者 C+ +
中就没有办法在程序中获得函数定义相关的信息。</font></p>
<p><font size="1"><strong>1</strong><strong>．检测类：</strong></font></p>
<p><font size="1"><strong>1.1 reflection</strong><strong>的工作机制</strong></font></p>
<p><font size="1">考虑下面这个简单的例子，让我们看看 reflection 是如何工作的。</font></p>
<p><font size="1">import java.lang.reflect.*;<br />
public class DumpMethods {<br />
&nbsp;&nbsp;&nbsp;&nbsp;  public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Class c = Class.forName(args[0]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Method m[] = c.getDeclaredMethods();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  for (int i = 0; i &lt; m.length; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println(m[i].toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
}</font></p>
<p><font size="1">按如下语句执行：</font></p>
<p><font size="1">java DumpMethods java.util.Stack</font></p>
<p><font size="1">它的结果输出为：</font></p>
<p><font size="1">public java.lang.Object java.util.Stack.push(java.lang.Object)</font></p>
<p><font size="1">public synchronized java.lang.Object java.util.Stack.pop()</font></p>
<p><font size="1">public synchronized java.lang.Object java.util.Stack.peek()</font></p>
<p><font size="1">public boolean java.util.Stack.empty()</font></p>
<p><font size="1">public synchronized int java.util.Stack.search(java.lang.Object)</font></p>
<p><font size="1">这样就列出了java.util.Stack 类的各方法名以及它们的限制符和返回类型。</font></p>
<p><font size="1">这个程序使用 Class.forName 载入指定的类，然后调用 getDeclaredMethods 来获取这个类中定义了的方法列表。java.lang.reflect.Methods 是用来描述某个类中单个方法的一个类。</font></p>
<p><font size="1"><strong>1.2 Java</strong><strong>类反射中的主要方法</strong></font></p>
<p><font size="1">对于以下三类组件中的任何一类来说 -- 构造函数、字段和方法 -- java.lang.Class 提供四种独立的反射调用，以不同的方式来获得信息。调用都遵循一种标准格式。以下是用于查找构造函数的一组反射调用：</font></p>
<p><font size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数，</font></p>
<p><font size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   Constructor[] getConstructors() -- 获得类的所有公共构造函数</font></p>
<p><font size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)</font></p>
<p><font size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关) </font></p>
<p><font size="1">获得字段信息的Class 反射调用不同于那些用于接入构造函数的调用，在参数类型数组中使用了字段名：</font></p>
<p><font size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   Field getField(String name) -- 获得命名的公共字段</font></p>
<p><font size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   Field[] getFields() -- 获得类的所有公共字段</font></p>
<p><font size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   Field getDeclaredField(String name) -- 获得类声明的命名的字段</font></p>
<p><font size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   Field[] getDeclaredFields() -- 获得类声明的所有字段 </font></p>
<p><font size="1">用于获得方法信息函数：</font></p>
<p><font size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   Method getMethod(String name, Class[] params) -- 使用特定的参数类型，获得命名的公共方法</font></p>
<p><font size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   Method[] getMethods() -- 获得类的所有公共方法</font></p>
<p><font size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型，获得类声明的命名的方法</font></p>
<p><font size="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   Method[] getDeclaredMethods() -- 获得类声明的所有方法 </font></p>
<p><font size="1"><strong>1.3</strong><strong>开始使用 Reflection：</strong></font></p>
<span id="zoom">
<p><font size="1">用于 reflection 的类，如 Method，可以在
java.lang.relfect 包中找到。使用这些类的时候必须要遵循三个步骤：第一步是获得你想操作的类的 java.lang.Class
对象。在运行中的 Java 程序中，用 java.lang.Class 类来描述类和接口等。</font></p>
<p><font size="1">下面就是获得一个 Class 对象的方法之一：</font></p>
<p><font size="1">Class c = Class.forName("java.lang.String");</font></p>
<p><font size="1">这条语句得到一个 String 类的类对象。还有另一种方法，如下面的语句：</font></p>
<p><font size="1">Class c = int.class;</font></p>
<p><font size="1">或者</font></p>
<p><font size="1">Class c = Integer.TYPE;</font></p>
<p><font size="1">它们可获得基本类型的类信息。其中后一种方法中访问的是基本类型的封装类 (如 Integer) 中预先定义好的 TYPE 字段。</font></p>
<p><font size="1">第二步是调用诸如 getDeclaredMethods 的方法，以取得该类中定义的所有方法的列表。</font></p>
<p><font size="1">一旦取得这个信息，就可以进行第三步了——使用 reflection API 来操作这些信息，如下面这段代码：</font></p>
<p><font size="1">Class c = Class.forName("java.lang.String");</font></p>
<p><font size="1">Method m[] = c.getDeclaredMethods();</font></p>
<p><font size="1">System.out.println(m[0].toString());</font></p>
<p><font size="1">它将以文本方式打印出 String 中定义的第一个方法的原型。</font></p>
<p><font size="1">在下面的例子中，这三个步骤将为使用 reflection 处理特殊应用程序提供例证。</font></p>
<p><font size="1">模拟 instanceof 操作符</font></p>
<p><font size="1">得到类信息之后，通常下一个步骤就是解决关于 Class 对象的一些基本的问题。例如，Class.isInstance 方法可以用于模拟 instanceof 操作符：</font></p>
<p><font size="1">class A {<br />
}</font></p>
<p><font size="1">public class instance1 {<br />
&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("A");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean b1 = cls.isInstance(new Integer(37));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(b1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean b2 = cls.isInstance(new A());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(b2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}</font></p>
<p><font size="1">在这个例子中创建了一个 A 类的 Class 对象，然后检查一些对象是否是 A 的实例。Integer(37) 不是，但 new A() 是。</font></p>
<p><span id="zoom">
<p><strong><font size="1">1.4 找出类的方法</font></strong></p>
<p><font size="1">找出一个类中定义了些什么方法，这是一个非常有价值也非常基础的 reflection 用法。下面的代码就实现了这一用法：</font></p>
<p><font size="1">import java.lang.reflect.*;</font></p>
<p><font size="1">public class method1 {<br />
&nbsp;&nbsp; private int f1(Object p, int x) throws NullPointerException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (p == null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new NullPointerException();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x;<br />
&nbsp;&nbsp; }</font></p>
<p><font size="1">&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("method1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method methlist[] = cls.getDeclaredMethods();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; methlist.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method m = methlist[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("name = " + m.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("decl class = " + m.getDeclaringClass());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class pvec[] = m.getParameterTypes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; pvec.length; j++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("param #" + j + " " + pvec[j]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class evec[] = m.getExceptionTypes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; evec.length; j++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("exc #" + j + " " + evec[j]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("return type = " + m.getReturnType());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("-----");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}</font></p>
<p><font size="1">这
个程序首先取得 method1 类的描述，然后调用 getDeclaredMethods 来获取一系列的 Method
对象，它们分别描述了定义在类中的每一个方法，包括 public 方法、protected 方法、package 方法和 private
方法等。如果你在程序中使用 getMethods 来代替 getDeclaredMethods，你还能获得继承来的各个方法的信息。</font></p>
<p><font size="1">取得了 Method 对象列表之后，要显示这些方法的参数类型、异常类型和返回值类型等就不难了。这些类型是基本类型还是类类型，都可以由描述类的对象按顺序给出。</font></p>
<p><font size="1">输出的结果如下：</font></p>
<p><font size="1">name = f1</font></p>
<p><font size="1">decl class = class method1</font></p>
<p><font size="1">param #0 class java.lang.Object</font></p>
<p><font size="1">param #1 int</font></p>
<p><font size="1">exc #0 class java.lang.NullPointerException</font></p>
<p><font size="1">return type = int</font></p>
<p><font size="1">-----</font></p>
<p><font size="1">name = main</font></p>
<p><font size="1">decl class = class method1</font></p>
<p><font size="1">param #0 class [Ljava.lang.String;</font></p>
<p><font size="1">return type = void</font></p>
<p><font size="1">-----</font></p>
<p><br />
<strong><span id="zoom"><span id="zoom"><font size="1">1.5 </font></span></span><font size="1">获取构造器信息</font></strong></p>
<p><font size="1">获取类构造器的用法与上述获取方法的用法类似，如：</font></p>
<p><font size="1">import java.lang.reflect.*;</font></p>
<p><font size="1">public class constructor1 {<br />
&nbsp;&nbsp; public constructor1() {<br />
&nbsp;&nbsp; }</font></p>
<p><font size="1">&nbsp;&nbsp; protected constructor1(int i, double d) {<br />
&nbsp;&nbsp; }</font></p>
<p><font size="1">&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("constructor1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Constructor ctorlist[] = cls.getDeclaredConstructors();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; ctorlist.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Constructor ct = ctorlist[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("name = " + ct.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("decl class = " + ct.getDeclaringClass());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class pvec[] = ct.getParameterTypes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; pvec.length; j++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("param #" + j + " " + pvec[j]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class evec[] = ct.getExceptionTypes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; evec.length; j++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("exc #" + j + " " + evec[j]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("-----");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}</font></p>
<p><font size="1">这个例子中没能获得返回类型的相关信息，那是因为构造器没有返回类型。</font></p>
<p><font size="1">这个程序运行的结果是：</font></p>
<p><font size="1">name = constructor1</font></p>
<p><font size="1">decl class = class constructor1</font></p>
<p><font size="1">-----</font></p>
<p><font size="1">name = constructor1</font></p>
<p><font size="1">decl class = class constructor1</font></p>
<p><font size="1">param #0 int</font></p>
<p><font size="1">param #1 double</font></p>
<p><font size="1">-----</font></p>
<p><strong><font size="1">1.6获取类的字段(域)</font></strong></p>
<p><font size="1">找出一个类中定义了哪些数据字段也是可能的，下面的代码就在干这个事情：</font></p>
<p>例1：<br />
<font size="1">import java.lang.reflect.*;</font></p>
<p><font size="1">public class field1 {<br />
&nbsp;&nbsp; private double d;<br />
&nbsp;&nbsp; public static final int i = 37;<br />
&nbsp;&nbsp; String s = "testing";</font></p>
<p><font size="1">&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("field1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field fieldlist[] = cls.getDeclaredFields();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; fieldlist.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field fld = fieldlist[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("name = " + fld.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("decl class = " + fld.getDeclaringClass());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("type = " + fld.getType());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int mod = fld.getModifiers();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("modifiers = " + Modifier.toString(mod));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("-----");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}</font></p>
<p><font size="1">这
个例子和前面那个例子非常相似。例中使用了一个新东西 Modifier，它也是一个 reflection
类，用来描述字段成员的修饰语，如&#8220;private int&#8221;。这些修饰语自身由整数描述，而且使用 Modifier.toString
来返回以&#8220;官方&#8221;顺序排列的字符串描述 (如&#8220;static&#8221;在&#8220;final&#8221;之前)。这个程序的输出是：</font></p>
<p><font size="1">name = d</font></p>
<p><font size="1">decl class = class field1</font></p>
<p><font size="1">type = double</font></p>
<p><font size="1">modifiers = private</font></p>
<p><font size="1">-----</font></p>
<p><font size="1">name = i</font></p>
<p><font size="1">decl class = class field1</font></p>
<p><font size="1">type = int</font></p>
<p><font size="1">modifiers = public static final</font></p>
<p><font size="1">-----</font></p>
<p><font size="1">name = s</font></p>
<p><font size="1">decl class = class field1</font></p>
<p><font size="1">type = class java.lang.String</font></p>
<p><font size="1">modifiers =</font></p>
<p><font size="1">-----</font></p>
<p>例2:</p>
<p><span id="zoom"><span id="zoom"><font size="1">import java.lang.reflect.*;<br />
import java.awt.*;<br />
<br />
class SampleGet {<br />
<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Rectangle r = new Rectangle(100, 325);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printHeight(r);<br />
<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; static void printHeight(Rectangle r) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Field heightField;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Integer heightValue;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Class c = r.getClass();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; heightField = c.getField("height");//取得height这个变量<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; heightValue = (Integer) heightField.get(r);//取得height这个变量的值<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("Height: " + heightValue.toString());<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (NoSuchFieldException e) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(e);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (SecurityException e) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(e);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (IllegalAccessException e) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(e);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></span></span></p>
<p><span id="zoom"><span id="zoom">输出: </span></span><span id="zoom"><span id="zoom"><span id="zoom"><span id="zoom"><font size="1">Height:325</font></span></span></span></span><br />
<font size="1"><br />
</font></p>
<p><font size="1">和获取方法的情况一下，获取字段的时候也可以只取得在当前类中申明了的字段信息 (getDeclaredFields)，或者也可以取得父类中定义的字段 (getFields) 。</font></p>
<p><br />
<strong><font size="1">1.7 根据方法的名称来执行方法</font></strong></p>
<p><font size="1">文本到这里，所举的例子无一例外都与如何获取类的信息有关。我们也可以用 reflection 来做一些其它的事情，比如执行一个指定了名称的方法。下面的示例演示了这一操作：</font></p>
<p><font size="1">例1:<br />
</font></p>
<p><font size="1">import java.lang.reflect.*;<br />
public class method2 {<br />
&nbsp;&nbsp; public int add(int a, int b) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return a + b;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("method2");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class partypes[] = new Class[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; partypes[0] = Integer.TYPE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; partypes[1] = Integer.TYPE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method meth = cls.getMethod("add", partypes);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method2 methobj = new method2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arglist[] = new Object[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arglist[0] = new Integer(37);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arglist[1] = new Integer(47);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object retobj = meth.invoke(methobj, arglist);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer retval = (Integer) retobj;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(retval.intvalue());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}</font></p>
<p><font size="1">假如一个程序在执行的某处的时候才知道需要执行某个方法，这个方法的名称是在程序的运行过程中指定的 (例如，JavaBean 开发环境中就会做这样的事)，那么上面的程序演示了如何做到。</font></p>
<p><font size="1">上
例中，getMethod 用于查找一个具有两个整型参数且名为 add 的方法。找到该方法并创建了相应的 Method
对象之后，在正确的对象实例中执行它。执行该方法的时候，需要提供一个参数列表，这在上例中是分别包装了整数 37 和 47 的两个 Integer
对象。执行方法的返回的同样是一个 Integer 对象，它封装了返回值 84。</font></p>
<p>例2：</p>
<p><font size="1">import java.lang.reflect.Method;<br />
<br />
//Base.java 抽象基类<br />
//Son1.java 基类扩展1<br />
//Son2.java 基类扩展2<br />
//Util.java <br />
<br />
//Base.java 抽象基类只是一个定义<br />
abstract class Base {<br />
<br />
}<br />
<br />
//Son1.java 是已经实现的Base<br />
class Son1 extends Base {<br />
&nbsp;&nbsp; &nbsp;private int id;<br />
<br />
&nbsp;&nbsp; &nbsp;private String name;<br />
<br />
&nbsp;&nbsp; &nbsp;public int getId() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; return id;<br />
&nbsp;&nbsp; &nbsp;}<br />
<br />
&nbsp;&nbsp; &nbsp;public void setId(int id) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; this.id = id;<br />
&nbsp;&nbsp; &nbsp;}<br />
<br />
&nbsp;&nbsp; &nbsp;public String getName() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; return name;<br />
&nbsp;&nbsp; &nbsp;}<br />
<br />
&nbsp;&nbsp; &nbsp;public void setName(String name) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />
&nbsp;&nbsp; &nbsp;}<br />
<br />
&nbsp;&nbsp; &nbsp;public void son1Method(String s) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; System.out.println(s);<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
<br />
// Son2.java 是已经实现的Base<br />
class Son2 extends Base {<br />
&nbsp;&nbsp; &nbsp;private int id;<br />
<br />
&nbsp;&nbsp; &nbsp;private double salary;<br />
<br />
&nbsp;&nbsp; &nbsp;public int getId() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; return id;<br />
&nbsp;&nbsp; &nbsp;}<br />
<br />
&nbsp;&nbsp; &nbsp;public void setId(int id) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; this.id = id;<br />
&nbsp;&nbsp; &nbsp;}<br />
<br />
&nbsp;&nbsp; &nbsp;public double getSalary() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; return salary;<br />
&nbsp;&nbsp; &nbsp;}<br />
<br />
&nbsp;&nbsp; &nbsp;public void setSalary(double salary) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; this.salary = salary;<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
<br />
// Util.java 演示了如何根据指定的类名，类字段名和所对应的数据，得到一个类的实例<br />
public class Util {<br />
&nbsp;&nbsp; &nbsp;// 此方法的最大好处是没有类名Son1,Son2 可以通过参数来指定，程序里面根本不用出现<br />
&nbsp;&nbsp; &nbsp;public static Base utilDo(String beanName,<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String methodName, String paraValue) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; Base base = null;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Class cls = Class.forName(beanName);//生成类<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; base = (Base) cls.newInstance();//生成类的对象<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Class[] paraTypes = new Class[] { String.class};<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Method method = cls.getMethod(methodName, paraTypes);// fieldSetter为方法的名称;paraTypes为该方法的参数数组,要用类的形式<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String[] paraValues = new String[] { paraValue };<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; method.invoke(base, paraValues);//执行方法<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; return base;<br />
&nbsp;&nbsp; &nbsp;}<br />
<br />
&nbsp;&nbsp; &nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; Son1 son1 = (Son1) Util.utilDo("test.Reflection.Son1",<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "setName", "I am son1");// 表示类的字符串一定要是类的&#8220;全类名&#8221;,这里是</font><font size="1">test.Reflection.Son1</font><br />
<font size="1">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; System.out.println("son1.getName() :" + son1.getName());<br />
&nbsp;&nbsp; &nbsp;}<br />
}</font></p>
</span></p>
</span>
<p><font size="1">输出：son1.getName() :I am son1<br />
</font></p>
<span id="zoom">
<p><span id="zoom">
<p><strong><font size="1">1.8 创建新的对象</font></strong></p>
<p><font size="1">对于构造器，则不能像执行方法那样进行，因为执行一个构造器就意味着创建了一个新的对象 (准确的说，创建一个对象的过程包括分配内存和构造对象)。所以，与上例最相似的例子如下：</font></p>
<p><font size="1">import java.lang.reflect.*;</font></p>
<p><font size="1">public class constructor2 {<br />
&nbsp;&nbsp; public constructor2() {<br />
&nbsp;&nbsp; }</font></p>
<p><font size="1">&nbsp;&nbsp; public constructor2(int a, int b) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("a = " + a + " b = " + b);<br />
&nbsp;&nbsp; }</font></p>
<p><font size="1">&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("constructor2");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class partypes[] = new Class[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; partypes[0] = Integer.TYPE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; partypes[1] = Integer.TYPE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Constructor ct = cls.getConstructor(partypes);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arglist[] = new Object[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arglist[0] = new Integer(37);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arglist[1] = new Integer(47);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object retobj = ct.newInstance(arglist);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}</font></p>
<p><font size="1">根据指定的参数类型找到相应的构造函数并执行它，以创建一个新的对象实例。使用这种方法可以在程序运行时动态地创建对象，而不是在编译的时候创建对象，这一点非常有价值。</font></p>
<p><strong><font size="1">1.9 改变字段(域)的值</font></strong></p>
<p><font size="1">reflection 的还有一个用处就是改变对象数据字段的值。reflection 可以从正在运行的程序中根据名称找到对象的字段并改变它，下面的例子可以说明这一点：</font></p>
<p><font size="1">import java.lang.reflect.*;</font></p>
<p><font size="1">public class field2 {<br />
&nbsp;&nbsp; public double d;</font></p>
<p><font size="1">&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("field2");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field fld = cls.getField("d");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; field2 f2obj = new field2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("d = " + f2obj.d);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fld.setDouble(f2obj, 12.34);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("d = " + f2obj.d);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}</font></p>
<p><font size="1">这个例子中，字段 d 的值被变为了 12.34。</font></p>
<p><strong><font size="1">1.10 使用数组</font></strong></p>
<p><font size="1">本文介绍的 reflection 的最后一种用法是创建的操作数组。数组在 Java 语言中是一种特殊的类类型，一个数组的引用可以赋给 Object 引用。观察下面的例子看看数组是怎么工作的：</font></p>
<p><font size="1">import java.lang.reflect.*;</font></p>
<p><font size="1">public class array1 {<br />
&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = Class.forName("java.lang.String");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arr = Array.newInstance(cls, 10);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Array.set(arr, 5, "this is a test");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s = (String) Array.get(arr, 5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}</font></p>
<p><font size="1">例中创建了 10 个单位长度的 String 数组，为第 5 个位置的字符串赋了值，最后将这个字符串从数组中取得并打印了出来。</font></p>
<p><font size="1">下面这段代码提供了一个更复杂的例子：</font></p>
<p><font size="1">import java.lang.reflect.*;</font></p>
<p><font size="1">public class array2 {<br />
&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int dims[] = new int[]{5, 10, 15};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arr = Array.newInstance(Integer.TYPE, dims);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object arrobj = Array.get(arr, 3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class cls = arrobj.getClass().getComponentType();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(cls);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arrobj = Array.get(arrobj, 5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Array.setInt(arrobj, 10, 37);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int arrcast[][][] = (int[][][]) arr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(arrcast[3][5][10]);<br />
&nbsp;&nbsp; }<br />
}<br />
例
中创建了一个 5 x 10 x 15 的整型数组，并为处于 [3][5][10] 的元素赋了值为
37。注意，多维数组实际上就是数组的数组，例如，第一个 Array.get 之后，arrobj 是一个 10 x 15
的数组。进而取得其中的一个元素，即长度为 15 的数组，并使用 Array.setInt 为它的第 10 个元素赋值。</font></p>
<p><font size="1">注意创建数组时的类型是动态的，在编译时并不知道其类型。</font></p>
</span></p>
</span>
<img src ="http://www.blogjava.net/fcailiao/aggbug/150800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fcailiao/" target="_blank">hanzao</a> 2007-10-07 11:34 <a href="http://www.blogjava.net/fcailiao/archive/2007/10/07/150800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>