Class

JAVA除了基础类型外其他都是class(本质就是数据类型)(可以把interface看做广义上的class),JVM为每个加载的class创建唯一的Class实例(正因如此,可以用==判断Class实例是否相同)

class/interface的数据类型是Class

Class实例包含该class的所有信息,通过Class实例获取class信息的方法称为反射(Reflection)

 

获取一个class的Class实例:

Class cls = String.class;

Class cls = "str".getClass();

Class cls = Class.forName("java.lang.String");

注意Class的==比较和instanceof的区别

== 只能判断是否为同一类型

instanceof 可以判断是否为同一家族的(即是否为父子继承关系或同一级)

 

从Class实例获取class信息:

getName()

getSimpleName()

getPackage()

 

从Class实例判断class类型:

isInterface()

isEnum()

isArray()

isPrimitive()

 

创建class实例:

cls.newInstance()

 

JVM总是动态加载class,可以在运行期根据条件控制加载class

访问字段Field

通过Class实例获取字段field信息:

getField(name) 获取某个public的field(包括父类)

getDeclaredField(name) 获取当前类的某个field(不包括父类)【如果是非public的,则需要setAccess】

 

getFields() 获取所有public的field(包括父类)

getDeclaredFields() 获取当前类的所有field(不包括父类)

 

所有和某个的意思都是不管是什么访问权限都能访问(比如private)[同]

 

Field对象包含一个field的所有信息:

getName()

getType()

getModifiers()

 

获取和设置field的值:

get(Object obj)

set(Object, Object)

 

通过反射访问Field需要通过SecurityManager设置的规则,也就是说反射访问字段可能会失败

通过设置setAccessible(true)来访问非public字段

调用方法Method

通过Class实例获取方法Method信息:

getMethod(name, Class...) 获取某个public的method(包括父类)

getDeclaredMethod(name, Class...) 获取当前类的某个method(不包括父类)

getMethods() 获取所有public的method(包括父类)

getDeclaredMethods() 获取当前类的所有method(不包括父类)

 

Method对象包含一个method的所有信息:

getName()

getReturnType()

getParameterTypes()

getModifiers()

 

调用Method:

Object invoke(Object obj, Object... args)

 

通过设置setAccessible(true)来访问非public方法

反射调用Method也遵守多态的规则

实际上在当我们在父类获取一个方法后,传入的实例是子类,实际上执行的是子类覆写父类的方法

调用构造方法Constructor

调用public无参数构造方法 Class.newInstance()

例如:String s = (String) String.class.newInstance();

 

通过Class实例获取Constructor信息:

getConstructor(Class...)     获取某个public的Constructor

getDeclaredConstructor(Class...) 获取某个Constructor

getConstructors() 获取所有public的Constructor

getDeclaredConstructors() 获取所有Constructor

 

通过Constructor实例可以创建一个实例对象:

newInstance(Object… parameters)

通过设置setAccessible(true)来访问非public构造方法(和上面的一样,也有可能失败)

获取继承关系

获取父类的Class:

Class getSuperclass()

Object的父类是null

interface的父类是null

 

获取当前类直接实现的interface:Class[] getInterfaces()不包括间接实现的interface

没有interface的class返回空数组

interface返回继承的interface

 

判断一个向上转型是否成立:bool isAssignableFrom(Class)