获取Class对象

有三种方式获取Class对象。
– 类名.class
如果JVM里面没有该类,则将类装入内存里,但不会初始化代码,返回Class的对象
– Class.forName(“包名+类名”)
同上,但会初始化静态代码。
– 实例对象.getClass()
此时对象已经新建了,新建对象会把静态和非静态的方法属性都初始化了。此时getClass()返回引用真正所属类的Class对象。动态绑定中,子类对象引用赋给父类对象的引用变量需要注意一下这点。
这三个方法其实都是同一个Class对象,在生成Class对象时候,他们共同都会先判断内存里是否已经加载了。

运行结果

可以看出,.class不初始化代码,Class.forName()初始化了静态属性,Object.getClass()是在队形的静态、非静态方法属性都建立好了再调用,并不会重复新建。
false是父类和子类的class对象是不同的,即使是子类把引用赋予了父类引用(动态绑定)。

getCalss

该方法出自Object.class里面。

获取Class对象时候用<类名>.class获取,接口同样。
Class<Date> cls = Date.class;

基本类型没有getClass方法, 但有对应的Class 对象, 类型参数为对应的包装类型。

void
Class<Vode> vodeCls = vode.class;
数组
每个维度一个类型

forName

静态方法,可以根据类名加载Class,获取Class对象。

此时费劲心思获取Class对象是为下一步对Class里面的属性进行操作。

Class类

每个已加载的类在内存里面都有一份类信息,每个对象都指向它所属类信息的引用。信息对应的类是java.lang.Class类。

1.获取名称信息

  • getName()
    返回的是java内部真正的名字。

如果遇到数组会返回“[”,一维就返回一个“[”,多少维就返回多少个“[”。数组类型是用符号表示,如下图。注意引用型的数据是带分号的“;”。

Element Type

   

Encoding

boolean

   

Z

byte

   

B

char

   

C

class or interface

   

Lclassname;

double

   

D

float

   

F

int

   

I

long

   

J

short

   

S
  • getSimpleName()
    返回不带包名的名字

  • getCanonicalName()
    返回包名和类名

  • getPackage()
    获取包名。基础类的包名为null,数组也是。

2.字段信息

类中静态变量和实例变量都是字段信息,用类Field表示,位于包java.lang.reflect下。
Class里面获取字段信息

获取到Field对象就可以根据Field里面的一些方法属性来操作了。
Field里面的一些方法属性。

案例

输出

set(Object obj, Object value),如果是基本类型的数据,会自动与对应包装类型之间相互转化,静态对象可以为null。
在Field里面还有一堆get/set方法,用来获取基本类型。

下面是展示修饰符的一个例子

Modifier类里面有各种修饰符判断。

运行结果

3.方法信息

Class类里面获取方法信息的方式如下。

Method类里面基本方法。

invoke方法上,如果Method是静态方法,可以为null,args可以为null,也可以为空的数组,调用返回值被包裹为Object输出。

输出

Method里面还有获取修修饰符,参数,范沪指,注解等信息,这里不一一列举了。

4.创建对象和构造方法

Class类里面

newInstance只能用在无参数的默认构造方法。如果想要建有参数方法,用java.lang.reflect.Constructor#newInstance(java.lang.Object...) Constructor.newInstance调用。

实例

5.类型检查和转换

Class类里面

范例

6.Class的类型信息检查

判断普通类,内部类,数组等。

7.类的声明信息

修饰符,父类,接口,注解等。

8.类加载

initialize表示加载后,是否初始化代码(比如static代码)。第一个方法等同于Class. forName( className, true, currentLoader)
基本数据类型不能用forName。要该结果要自己处理。

java9还有另外一个forName

找不到类返回null

9.数组

Class类里面。

例子

输出

更加细致的操作可以看看到java.lang.reflect.Array

详细点

例子

10.枚举

分类: Java

发表评论

电子邮件地址不会被公开。