问六:说说反射吧?

 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)

 

全部评论

相关推荐

有没有经济学家能告诉我,三年后中国的就业市场会不会好转?我在校招中拿到了一份9k+的offer,还是行业的龙头企业,心里其实不想再考研了。但又总是担心,万一读研后薪资更高,我会不会后悔呢?
Fyhyuky:三年后肯定不会啊,只会比现在更烂,你自己看看现在有没有什么增长点,电车都是国家补贴兜底才发展出来的,已经比较违背市场自然规律了,互联网更不用说了,国家强力打压,传统制造业转型失败,现在苟延残喘中
点赞 评论 收藏
分享
头像
11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
昨天 13:29
已编辑
湖南铁道职业技术学院 后端
小红书 后端选手 n*16*1.18+签字费期权
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务