java 反射 强制转换_Java框架基础——反射(reflect) (转)

阅读目录

一、Class类的使用

二、动态加载类

三、获取方法信息

四、获取成员变量、构造函数信息

五、方法的反射

六、通过反射了解集合泛型的本质

一、Class类的使用

1)在面向对象(oop)的世界里,万事万物皆对象。

在Java中,包括基本的数据类型,都是对象。

Class c = int.class;//int 的类类型

那就是说:

类是对象,类是java.lang.Class类的实例对象。这个对象我们称之为类类型。

换言之,每一个类都有一个类类型,这个类类型就是java.lang.Class的实例对象

2)如何获取一个类的类类型(三种方法)

类名.class;

类的对象.getClass();

Class.forName(“类的全称包含包名”);

class Foo{}

Foo foo1=new Foo();

1. Class c1 = Foo.Class;//任何一个类都有一个隐含的静态成员变量class

2. Class c2 = foo1.getClass()//已经知道该类的对象通过getClassF方法

3. Class c3 = null;

c3 = Class.forName("com.immoc.reflect.Foo");

//of course, c1 == c2 == c3 is true

3)利用类类型来创造实例对象(需要有无参数的构造方法)(需要有强制类型转化,且有异常抛出)

Foo foo2 = (Foo)(c1.newInstance());

Foo foo3 = (Foo)(c2.newInstance());

Foo foo4 = (Foo)(c3.newInstance());

1 packagecom.study.reflect;

2

3 /**

4 * @description 6 * @date 2016-3-28 下午4:06:29

7 */

8 public classClassDemo1 {

9

10 public static voidmain(String[] args){

11 //Foo的实例对象如何表示?

12 Foo foo1=new Foo();//foo1就表示Foo的实例对象

13 //Foo这个类也是一个实例对象,它是Class类的对象,那Class类的实例对象,如何表示呢?

14 //任何一个类都是Class的实例对象,但是不能通过new关键字来创建。这个实例对象有三种表示方式:

15

16 //第一种表示方式---->实际是在告诉我们任何一个类都有一个隐含的静态成员变量class

17 Class c1=Foo.class;//如果Foo已经存在,可以用这种方法来创建Foo的类类型(class type),即Foo类的类类型就是Class类的一个实例对象。

18

19 //第二种方式-->已知该类的对象,通过getClass方法

20 Class c2=foo1.getClass();//如果Foo类的对象foo1已经存在,可以通过这种方法来创建Foo类的类类型。

21

22 /**

23 * 上面官网说c1,c2 是表示了Foo类的类类型(class type)---->指的就是Class的对象

24 * 类类型,即万事万物皆对象,

25 * 类也是一个对象,是Class类的实例对象

26 * 这个对象我们把它称为该类的类类型

27 */

28

29 //不管c1 or c2,他们都代表了Foo类的类类型,一个类只可能是Class类的一个实例对象

30 System.out.println(c1==c2);//true

31

32 //第三种表示:

33 Class c3=null;

34 try{

35 c3=Class.forName("com.study.reflect.Foo");//通过Foo的全称来创建

36 } catch(ClassNotFoundException e) {

37 e.printStackTrace();

38 }

39 System.out.println(c2==c3);//true

40

41 //我们完全可以通过类的类类型创建该类的对象实例-->通过c1 or c2 or c3 创建Foo的实例

42 try{

43 //如果c1是A类的类类型,创建的就是A类的实例对象,所以需要做强制类型转换,也会有异常

44 Foo foo = (Foo) c1.newInstance();//这个前提要求是需要有无参数的构造方法

45 foo.print();

46 } catch(InstantiationException e) {

47 e.printStackTrace();

48 } catch(IllegalAccessException e) {

49 e.printStackTrace();

50 }

51 }

52

53 }

54 classFoo{

55 voidprint(){

56 }

57 }

二、动态加载类

首先区分什么是动态加载和静态加载。

0f01cb4f2f2d673839aba2812b2281a2.png

也就是区分编译和运行。

new 创建对象,是静态加载类,在编译时刻就需要加载所有可能使用到的类

通过动态加载类可以解决该问题。通过类类型创建该类的对象

1、静态加载类,是编译时刻加载;动态加载类,是运行时刻加载

2、new创建对象

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值