﻿<?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-fatsheng</title><link>http://www.blogjava.net/fatsheng/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 08:13:25 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 08:13:25 GMT</pubDate><ttl>60</ttl><item><title>Class 类的isArray()方法</title><link>http://www.blogjava.net/fatsheng/archive/2008/10/22/235925.html</link><dc:creator>猪升</dc:creator><author>猪升</author><pubDate>Wed, 22 Oct 2008 05:33:00 GMT</pubDate><guid>http://www.blogjava.net/fatsheng/archive/2008/10/22/235925.html</guid><wfw:comment>http://www.blogjava.net/fatsheng/comments/235925.html</wfw:comment><comments>http://www.blogjava.net/fatsheng/archive/2008/10/22/235925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fatsheng/comments/commentRss/235925.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fatsheng/services/trackbacks/235925.html</trackback:ping><description><![CDATA[<p>isXXX()的方法是很经常见的一类方法，其中，在反射类库中的Class 类就有isArray()这一方法，由下文的代码运行可以得到一个结论：就是ArrayList对象不能通过isArray()的检验，其实很大程度是我先入为主的认为ArrayList是Array，为什么会这样认为呢？一方面是因为类名上有Array的字样，另一方面就是认为ArrayList可能是实现了一个叫Array的接口。查api可以知道，其实并没有这样一个接口，只有反射库里有这么一个类，当然和ArrayList没什么关系啦。明白了这点，就可以知道其实isArray()方法的判断就不是接口了。<br />
<br />
结合下面代码的结果可以知道，其实isArray()是以&#8220;[]&#8221;来判断的，至于怎么实现，小弟能力有限。<br />
事实上，ArrayList对象中有elementData这一Object[]变量，所以，在代码的第一次递归前，利用反身机制获得了这一Field并进入toString递归，并通过了isArray()的检验。<br />
<br />
另外：由打印出来的消息可以知道，如果将两个return分成两部分，则，前面的只调用过1次，后面的调用了5次，那是因为数组Object[] elementData在接收了原型数据int后会将int自动封装成java.lang.Integer对象，所以getComponent()获得的是Integer类型，而非原型int，因此递归调用toString()。<br />
<br />
第一次写BLOG，哈哈，马马虎虎，请见谅<br />
<br />
<br />
以下是一段Core Java里的一个例子，加上我自己的调试语句：<br />
<font style="background-color: #cce8cf">import java.lang.reflect.AccessibleObject;<br />
import java.lang.reflect.Array;<br />
import java.lang.reflect.Field;<br />
import java.lang.reflect.Modifier;<br />
import java.util.ArrayList;<br />
import java.util.Date;<br />
import java.util.LinkedList;</font></p>
<font style="background-color: #cce8cf">
<p><br />
public class ObjectAnalyzerTest {<br />
&nbsp;<br />
&nbsp;public static void main(String [] args){<br />
&nbsp;<br />
&nbsp;&nbsp;ArrayList&lt;Integer&gt; squares=new ArrayList&lt;Integer&gt;();<br />
&nbsp;&nbsp;for(int i=1; i&lt;=5;i++)squares.add(i*i);<br />
&nbsp;&nbsp;System.out.println(new ObjectAnalyzer().toString(squares));<br />
&nbsp;&nbsp;<br />
&nbsp;}</p>
<p>}</p>
<p>class ObjectAnalyzer{<br />
&nbsp;<br />
&nbsp;public String toString(Object obj){<br />
&nbsp;&nbsp;if(obj==null)return "null";<br />
&nbsp;&nbsp;if(visited.contains(obj))return "...";//************<br />
&nbsp;&nbsp;visited.add(obj);<br />
&nbsp;&nbsp;Class cl=obj.getClass();<br />
&nbsp;&nbsp;if(cl==String.class)return (String)obj;<br />
&nbsp;&nbsp;if(cl.isArray()){<br />
//&nbsp;&nbsp;&nbsp;System.out.println(cl.getName()+"+"+"1+"+re++);<br />
&nbsp;&nbsp;&nbsp;String r = cl.getComponentType()+"[]{";<br />
&nbsp;&nbsp;&nbsp;for (int i = 0;i &lt; Array.getLength(obj);i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (i&gt;0)r+=",";<br />
&nbsp;&nbsp;&nbsp;&nbsp;Object val = Array.get(obj,i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (cl.getComponentType().isPrimitive()) r+=val;<br />
&nbsp;&nbsp;&nbsp;&nbsp;else r += toString(val);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;System.out.println("X+"+r);<br />
&nbsp;&nbsp;&nbsp;return r+"}";<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;String r = cl.getName();<br />
&nbsp;&nbsp;<br />
//&nbsp;&nbsp;System.out.println(cl.getName()+"+"+"0+"+re++);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;do<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;r+="[";<br />
&nbsp;&nbsp;&nbsp;Field[] fields=cl.getDeclaredFields();<br />
&nbsp;&nbsp;&nbsp;AccessibleObject.setAccessible(fields,true);<br />
&nbsp;&nbsp;&nbsp;for(Field f:fields){<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(!Modifier.isStatic(f.getModifiers())){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!r.endsWith("["))r+=",";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r+= f.getName()+"=";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class t = f.getType();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object val = f.get(obj);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(t.isPrimitive()) r+=val;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else r+=toString(val);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;r+="]";<br />
&nbsp;&nbsp;&nbsp;cl=cl.getSuperclass();<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;while(cl!=null);<br />
&nbsp;&nbsp;System.out.println("X+"+r);<br />
&nbsp;&nbsp;return r;<br />
&nbsp;&nbsp;<br />
&nbsp;}<br />
&nbsp;private ArrayList&lt;Object&gt; visited=new ArrayList&lt;Object&gt;();<br />
&nbsp;private int re=0;<br />
}<br />
</font></p>
<img src ="http://www.blogjava.net/fatsheng/aggbug/235925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fatsheng/" target="_blank">猪升</a> 2008-10-22 13:33 <a href="http://www.blogjava.net/fatsheng/archive/2008/10/22/235925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>