没有合适的资源?快使用搜索试试~ 我知道了~
首页Java反射详解.pdf
Java反射详解.pdf

简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。
资源详情
资源评论
资源推荐

本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只
看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会
有更好的理解。
下面开始正文。
【案例1】
通过
一个
对
象
获
得
完
整
的
包
名和
类
名
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package
Reflect;
/**
*通过一个对
象获得完整的
包名和类名
**/
classDemo{
//other
codes...
}
classhello{
public
staticvoid
main(String[
]args){
Demo
demo=new
Demo();
Syst
em.out.print
ln(demo.getC
lass().getNa
me());
}
}
【运行结果】:Reflect.Demo
添加一句:
所
有
类
的
对
象
其
实
都
是
Class
的
实
例
。
【案例2】实例化Class类对象
?
1
2
3
4
5
6
7
8
9
10
11
12
package
Reflect;
classDemo{
//other
codes...
}
classhello{
public
staticvoid
main(String[
]args){

12
13
14
15
16
17
18
19
20
21
22
23
24
25
]args){
Clas
s<?>
demo1=null;
Clas
s<?>
demo2=null;
Clas
s<?>
demo3=null;
try{
//一般尽量采
用这种形式
demo1=Class.
forName("Ref
lect.Demo");
}cat
ch(Exception
e){
e.printStack
Trace();
}
demo
2=new
Demo().getCl
ass();
demo
3=Demo.class
;
Syst
em.out.print
ln("类名称
"+demo1.getN
ame());
Syst
em.out.print
ln("类名称
"+demo2.getN
ame());
Syst
em.out.print
ln("类名称
"+demo3.getN
ame());
}
}
【运行结果】:
类名称Reflect.Demo

类名称Reflect.Demo
类名称Reflect.Demo
【案例3】通过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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package
Reflect;
class
Person{
public
String
getName(){
retu
rnname;
}
public
void
setName(Stri
ngname){
this
.name=
name;
}
public
intgetAge()
{
retu
rnage;
}
public
void
setAge(int
age){
this
.age=age;
}
@Overrid
e
public
String
toString(){
retu
rn"
["+this.name
+"
"+this.age+"
]";
}
private
Stringname;
private

private
intage;
}
classhello{
public
staticvoid
main(String[
]args){
Clas
s<?>
demo=null;
try{
demo=Class.f
orName("Refl
ect.Person")
;
}cat
ch
(Exception
e){
e.printStack
Trace();
}
Pers
onper=null;
try
{
per=
(Person)demo
.newInstance
();
}
catch
(Instantiati
onException
e){
//TODO
Auto
generated
catchblock
e.printStack
Trace();
}
catch
(IllegalAcce
ssException
e){
//TODO
Auto
generated
catchblock

catchblock
e.printStack
Trace();
}
per.
setName("Rol
len");
per.
setAge(20);
Syst
em.out.print
ln(per);
}
}
【运行结果】:
[Rollen20]
但是注意一下,当我们把Person中的默认的无参构造函数取消的时候,比如自己定义只定义一个有参数的
构造函数之后,会出现错误:
比如我定义了一个构造函数:
?
1
2
3
4
public
Person(Strin
gname,int
age){
this
.age=age;
this
.name=name;
}
然后继续运行上面的程序,会出现:
java.lang.InstantiationException:Reflect.Person
atjava.lang.Class.newInstance0(Class.java:340)
atjava.lang.Class.newInstance(Class.java:308)
atReflect.hello.main(hello.java:39)
Exceptioninthread"main"java.lang.NullPointerException
atReflect.hello.main(hello.java:47)
所以大家以后再编写使用Class实例化其他类的对象的时候,一定要自己定义无参的构造函数
剩余38页未读,继续阅读











安全验证
文档复制为VIP权益,开通VIP直接复制

评论1