![](https://csdnimg.cn/release/download_crawler_static/28121560/bg6.jpg)
说到这,相信大家能理解得比我更好,今后千万不要再误解 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 的 synchronized
方法例如 f() ,因为那是在试图在对象上加第二把锁。但调用 g() 却是可以的,因为并没有在同一对象上加
两把锁的行为产生。
这样大家能理解了麽?明白它的原理能更好的帮助大家设计同步机制,不要滥用加锁。
PS:下篇笔者计划开始对 J2ee 接触到的各个方面来进行总结,谈谈自己的经验和想法。希望大
家还能一如既往的支持笔者写下去,指正不足之处。
Java 杂谈(四)
不知不觉已经写到第四篇了,论坛里面不断的有朋友鼓励我写下去。坚持自己的作风,把一切迷
惑不容易理清楚的知识讲出来, 讲到大家都能听懂, 那么自己就真的懂了。 最近在公司实习的时候 Trainer