天天看點

java 反射 new class_Java反射機制(建立Class對象的三種方式)

1:了解什麼是反射機制?

在通常情況下,如果有一個類,可以通過類建立對象;但是反射就是要求通過一個對象找到一個類的名稱;

2:在反射操作中,握住一個核心概念:

一切操作都将使用Object完成,類,數組,的引用都可以使用Object進行接收;

3:Class類:

功能:

通過一個執行個體化對象,找到一個類的完整資訊;

public final class Class

extends Object

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

package cn.itcast;

//聲明X類

class X {

}

public class ClassDemo01 {

public static void main(String[] args) {

//執行個體化X類對象

X x =new X();

//得到對象所在的類

System. out.println(x.getClass().getName());

}

}

列印結果:cn.itcast.X(包名.類)

1:get.Class()方法:

任何一個類如果沒有聲明繼承自那個父類,預設繼承Object類;

傳回Object運作時的類,傳回值是Class類,此類就是反射的源頭;

public final Class> getClass()

2:getName()方法:

public String getName()

以 String 的形式傳回此 Class 對象所表示的實體(類、接口、數組類、基本類型或 void)名稱;

3:傳統方式和反射方式:

傳統方式:

引入“包.類”的名稱  ----- 通過new執行個體化  ------ 建立執行個體化對象

反射方式:

執行個體化對象  -----  getClass() ---- 得到完整的“包.類”名稱

4:結論

所有類的對象實際上都是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

48

package cn.itcast;

public class Person {

private String name;

private int age;

private char sex;

public Person() {

super();

}

public Person(String name,int age,char sex) {

super();

this.name = name;

this.age = age;

this.sex = sex;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public char getSex() {

return sex;

}

public void setSex(char sex) {

this.sex = sex;

}

@Override

public String toString() {

return "Person [name=" + name +", age=" + age +", sex=" + sex +"]";

}

}

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

5:建立Class對象的三種方式:

package cn.itcast;

public class ClassDemo02 {

public static void main(String[] args) {

Person p1 =new Person("小明" ,20,'男' );

Person p2 =new Person("小紅" ,23,'女' );

//建立Class對象的方式一:(對象.getClass())

Class class1 = p1.getClass();

System. out.println(p1.getClass().getName());

Class class2 = p2.getClass();

System. out.println(class1 == class2 );

System. out.println("==============================" );

//建立Class對象的方式二:(類.class:需要輸入一個明确的類)

Class class3 = Person.class;

System. out.println(class1 == class2);

System. out.println("==============================" );

//建立Class對象的方式三:(forName():傳入時隻需要以字元串的方式傳入即可)

//Class.forName()有異常:ClassNotFoundException

Class class4 =null;

try {

class4 = Class. forName("cn.itcast.Person");

}catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System. out.println(class4 == class3);

}

}

結論:

Class類不能使用new來執行個體化對象,代表類的位元組碼.相同類别的對象的類位元組碼相同

一個Class對象代表着一份位元組碼,相同類型的對象得到的位元組碼對象是同一個