![](https://csdnimg.cn/release/download_crawler_static/2572242/bg7.jpg)
hashCode(),毕竟那是操作系统的实现, 找到相通对象唯一的标识,实现方式很多,笔者
的实现方式是:
首先重写了 toString()方法:
return A[0]“+” A[1]“+” A[2]“+” A[3]; //显示上比较直观
然后利用 toString()来计算 hashCode():
return this.toString().hashCode();
这样上述 A 和 B 返回的就都是”1234”,在测试 toString().hashCode(),由于 String 在内
存中的副本是一样的,”1234”.hashCode()返回的一定是相同的结果。
说到这,相信大家能理解得比我更好,今后千万不要再误解 hashCode()方法的作用。
3. 关于 Class 类的成员函数与 Java 反射机制
很早刚接触 Java 就听很多老师说过 Java 的动态运行时机制、反射机制等。确实它们
都是 Java 的显著特点,运行时加载笔者在第一篇介绍过了,现在想讲讲反射机制。在 Java
中,主要是通过 java.lang 包中的 Class 类和 Method 类来实现内存反射机制的。
熟悉 C++的人一定知道下面这样在 C++中是做不到的: 运行时以字符串参数传递一个
类名,就可以得到这个类的所有信息,包括它所有的方法,和方法的详细信息。还可以实例
化一个对象,并通过查到的方法名来调用该对象的任何方法。这是因为 Java 的类在内存中
除了 C++中也有的静态动态数据区之外,还包括一份对类自身的描述,也正是通过这描述
中的信息,才能帮助我们才运行时读取里面的内容,得到需要加载目标类的所有信息,从而
实现反射机制。大家有没有想过当我们需要得到一个 JavaBean 的实例的时候,怎么知道它
有哪些属性呢?再明显简单不过的例子就是自己写一个 JavaBean 的解析器:
a. 通过 Class.forName(“Bean 的类名”)得到 Class 对象,例如叫 ABeanClass
b. 通过 ABeanClass 的 getMethods()方法,得到 Method[]对象
c. 按照规范所有 get 方法名后的单词就代表着该 Bean 的一个属性
d. 当已经知道一个方法名,可以调用 newInstance()得到一个实例,然后通过 invoke()
方法将方法的名字和方法需要用的参数传递进去,就可以动态调用此方法。
当然还有更复杂的应用,这里就不赘述,大家可以参考 Class 类和 Method 类的方法。
4. 坦言 Synchronize 的本质
Synchronize 大家都知道是同步、加锁的意思,其实它的本质远没有大家想得那么复杂。
声明 Synchronize 的方法被调用的时候,锁其实是加载对象上,当然如果是静态类则是加在
类上的锁,调用结束锁被解除。它的实现原理很简单,仅仅是不让第二把锁再次被加在同一
个对象或类上,仅此而已。一个简单的例子足以说明问题:
class A{
synchronized void f(){}
void g(){}
}
当 A 的一个对象 a 被第一个线程调用其 f()方法的时候,第二个线程不能调用 a 的