易截截图软件、单文件、免安装、纯绿色、仅160KB

为什么如此获取Java数组的长度

记得vamcily 曾问我:“为什么获取数组的长度用.length(成员变量的形式),而获取String的长度用.length()(成员方法的形式)?”
我当时一听,觉得问得很有道理。做同样一件事情,为什么采用两种风格迥异的风格呢?况且,Java中的数组其实是完备(full-fledged)的对象,直接暴露成员变量,可能不是一种很OO的风格。那么,设计Java的那帮天才为什么这么做呢?
带着这个疑问,我查阅了一些资料,主要是关于“JVM是如何处理数组”的。
数组对象的类是什么?
既然数组都是对象,那么数组的类究竟是什么呢?当然不是java.util.Arrays啦!我们以int一维数组为例,看看究竟。
public class Main {
public static void main(String args[]){
int a[] = new int[10];
Class clazz = a.getClass();
System.out.println(clazz.getName());
}
}
在SUN JDK 1.6上运行上述代码,输出为:
[I
看起来数组的类很奇怪,非但不属于任何包,而且名称还不是合法的标识符(identifier)。具体的命名规则[1]可以参见java.lang.Class.getName()的javadoc。简单的说,数组的类名由若干个'['和数组元素类型的内部名称组成,'['的数目代表了数组的维度。
具有相同类型元素和相同维度的数组,属于同一个类。如果两个数组的元素类型相同,但维度不同,那么它们也属于不同的类。如果两个数组的元素类型和维度均相同,但长度不同,那么它们还是属于同一个类。
数组的类有哪些成员呢?
既然我们知道了数组的类名是什么,那么就去看看数组的类究竟是什么样的吧?有哪些成员变量?有哪些成员方法?length这个成员变量在哪?是不是没有length()这个成员方法?
找来找去,在JDK的代码中没有找打'[I'这个类。想想也对,'[I'都不是一个合法的标识符,肯定不会出现public class [I {...}这样的Java代码。我们暂且不管[I类是谁声明的,怎么声明的,先用反射机制一探究竟吧。
public class Main {
public static void main(String[] args) {
int a[] = new int[10];
Class clazz = a.getClass();
System.out.println(clazz.getDeclaredFields().length);
System.out.println(clazz.getDeclaredMethods().length);
System.out.println(clazz.getDeclaredConstructors().length);
System.out.println(clazz.getDeclaredAnnotations().length);
System.out.println(clazz.getDeclaredClasses().length);


相关文档:

获取普通Java对象大小

缓存对象需要知道对象占用空间的大小,可以事先设置好每种类型的大小,此方法对普通的对象起效,Jive论坛中的对象也是采用这种办法来获取对象的大小的(取自Jive).
public class CacheSizes {
/**
* Returns the size in bytes of a basic Object. This method should only
* be used for actual Object obje ......

java如何获取真实的IP

如果服务器如果没有采用反向代理,而且客户端没有用正向代理的话,
                   那么可以获取客户端的真实IP地址request.getRemoteAddr()
如果服务器如果没有采用反向代理,而且客户端有用正向代理的话,
 &nbs ......

JAVA 泛型 受限泛型

package com.fanxing.neibulei;
/**
*
* @author xiaxiaorui
*
*泛型 受限泛型
*http://developer.51cto.com/art/200909/153983.htm
*/
class Info2<T>
{
private T var; // 定义泛型变量
public T getVar() {
return var;
}
public void setVar(T var) {
this.var = var;
}

......

java反射的使用

    java中的反射经常被用在一些框架搭建上,他能够让我们很方便的对自己未来将使用的类,方法和变量进行访问。个人觉得有种黑客的味道在里面。当我们知道一个类的类名后,我们基本上可以使用反射的到它的一切。包括他的private的方法和变量等(当然访问他们的使用需要使用的是getDeclared***(**))。另外,据 ......

java字符串处理函数列表一览

java中的字符串也是一连串的字符。但是与许多其他的计算机语言将字符串作为字符数组处理不同,Java将字符串作为String类型对象来处理。将字符串作为内置的对象处理允许Java提供十分丰富的功能特性以方便处理字符串。下面是一些使用频率比较高的函数及其相关说明。
substring()
它有两种形式,第一种是:String substring ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号