本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解。
下面开始正文。
【案例1】通过一个对象获得完整的包名和类名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package
Reflect;
/**
* 通过一个对象获得完整的包名和类名
* */
class
Demo{
//other codes...
}
class
hello{
public
static
void
main(String[] args) {
Demo demo=
new
Demo();
System.out.println(demo.getClass().getName());
}
}
|
【运行结果】:Reflect.Demo
添加一句:所有类的对象其实都是Class的实例。
【案例2】实例化Class类对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package
Reflect;
class
Demo{
//other codes...
}
class
hello{
public
static
void
main(String[] args) {
Class<?> demo1=
null
;
Class<?> demo2=
null
;
Class<?> demo3=
null
;
try
{
//一般尽量采用这种形式
demo1=Class.forName(
"Reflect.Demo"
);
}
catch
(Exception e){
e.printStackTrace();
}
demo2=
new
Demo().getClass();
demo3=Demo.
class
;
System.out.println(
"类名称 "
+demo1.getName());
System.out.println(
"类名称 "
+demo2.getName());
System.out.println(
"类名称 "
+demo3.getName());
}
}
|
【运行结果】:
类名称 Reflect.Demo
类名称 Reflect.Demo
类名称 Reflect.Demo
我的理解是:所谓反射,就是根据一个已经实例化了的对象来还原类的完整信息
至少对我而言,我认为它带给我的好处是,让我从下往上的又了解了一遍面向对象
x_x 在此又痛恨一边那些厚部头们,把我的脑细胞搞死一片
Class类
如果要完成反射,那么必须了解Class类
实例1:通过对象取得包名和类名
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package
org.siu;
class
Test {
}
public
class
Demo {
public
static
void
main(String[] args) {
Test t =
new
Test();
System.out.println(t.getClass());
System.out.println(t.getClass().getName());
}
}
|
编译结果如下,注意包的编译方式即可
此处的getClass()方法是默认继承自Object类的
在java中,Object类是所有类的父类,同样,所有类的实例化对象也都是Class类的实例
因此,这样一来就会牵扯到向上转型和向下转型的概念