java反射-java Class基本使用
通过Class类获取对象完整包类名:
我们新建一个Student类:
1
2
3
4
5
|
package
com.java1234.chap07.sec01;
public
class
Student {
}
|
我们新建一个测试类:
1
2
3
4
5
6
7
8
9
|
package
com.java1234.chap07.sec01;
public
class
Test01 {
public
static
void
main(String[] args) {
Student student=
new
Student();
System.out.println(student.getClass().getName());
}
}
|
运行输出:
com.java1234.chap07.sec01.Student
这里对象.getClass() 调用的是Object类的getClass() 得到Class对象 然后再调用Class里的getName()方法,获取到完整包路径类;
通过完整包路径类型来实例化Class对象:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package
com.java1234.chap07.sec01;
public
class
Test02 {
public
static
void
main(String[] args) {
try
{
Class<?> c=Class.forName(
"com.java1234.chap07.sec01.Student"
);
System.out.println(c.getName());
}
catch
(ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
|
运行输出:
com.java1234.chap07.sec01.Student
通过得到Class对象,我们可以通过Class对象得到com.java1234.chap07.sec01.Student类的完整结构;
通过完整包路径类型来实例化Class对象,再通过Class对象获取Student类实例:
我们先改写下Student类:
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
|
package
com.java1234.chap07.sec01;
public
class
Student {
private
String name;
private
Integer age;
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
public
Integer getAge() {
return
age;
}
public
void
setAge(Integer age) {
this
.age = age;
}
@Override
public
String toString() {
return
"Student [name="
+ name +
", age="
+ age +
"]"
;
}
}
|
我们写个测试类:
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
com.java1234.chap07.sec01;
public
class
Test03 {
public
static
void
main(String[] args) {
Class<?> c=
null
;
try
{
c=Class.forName(
"com.java1234.chap07.sec01.Student"
);
System.out.println(c.getName());
}
catch
(ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Student s=
null
;
try
{
s=(Student) c.newInstance();
}
catch
(InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
s.setName(
"小锋"
);
s.setAge(
28
);
System.out.println(s);
}
}
|
我们改下上面的Student 加下有参构造方法,这样使得Student类没有默认无参构造方法:
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
|
package
com.java1234.chap07.sec01;
public
class
Student {
private
String name;
private
Integer age;
public
Student(String name, Integer age) {
super
();
this
.name = name;
this
.age = age;
}
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
public
Integer getAge() {
return
age;
}
public
void
setAge(Integer age) {
this
.age = age;
}
@Override
public
String toString() {
return
"Student [name="
+ name +
", age="
+ age +
"]"
;
}
}
|
然后我们再运行上面的测试类:
报错了 找不到默认构造方法;
在这种情况下,我们可以通过Class类来获取Student类里的构造方法,再调用构造方法即可,我们前面说过,可以通过反射获取整个类的结构,
包括 属性 方法 构造方法 等等。
我们给下测试代码:
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
|
package
com.java1234.chap07.sec01;
import
java.lang.reflect.Constructor;
public
class
Test04 {
public
static
void
main(String[] args) {
Class<?> c=
null
;
try
{
c=Class.forName(
"com.java1234.chap07.sec01.Student"
);
System.out.println(c.getName());
}
catch
(ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Student s=
null
;
Constructor<?>[] cons=c.getConstructors();
try
{
s=(Student) cons[
0
].newInstance(
"小锋"
,
28
);
}
catch
(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(s);
}
}
|
运行输出:
com.java1234.chap07.sec01.Student
Student [name=小锋, age=28]