问六:说说反射吧?

 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)

 

全部评论

相关推荐

01-28 16:12
中南大学 Java
几年前还没有chatgpt的时候,刷题真的是很痛苦。刷不出来只能看题解,题解有几个问题:第一个是每次看的写题解的人都不一样,很难有一个统一的思路;第二个也是最重要的是,题解只提供了作者自己的思路,但是没有办法告诉你你的思路哪里错了。其实很少有错误的思路,我只是需要被引导到正确的思路上面去。所以传统题解学习起来非常困难,每次做不出来难受,找题解更难受。但是现在chatgpt能做很多!它可以这样帮助你 -1. 可以直接按照你喜欢的语言生成各种解法的题解和分析复杂度。2. 把题和你写的代码都发给它,它可以告诉你 你的思路到底哪里有问题。有时候我发现我和题解非常接近,只是有一点点🤏想错了。只要改这一点点就是最优解。信心倍增。3. 如果遇到不懂的题解可以一行一行询问为什么要这样写,chatgpt不会嫌你烦。有时候我觉得自己的range写错了,其实那样写也没错,只是chat老师的题解有一点优化,这个它都会讲清楚。4. 它可以帮你找可以用同类型解法来做的题。然后它可以保持解法思路不变,用一个思路爽刷一个类型的题。如果题目之间思路又有变化,它会告诉你只有哪里变了,其他的地方还是老思路。5. 它也可以直接帮你总结模板,易错点。经过chat老师的指导,我最大的改变是敢刷题了。之前刷题需要先找某一个人写的算法题repo,然后跟着某一个人他的思路刷他给的几个题。如果想写别的题,套用思路失败了,没有他的题解,也不知道到底哪里错了;看别人的题解,思路又乱了。这个问题在二分查找和dp类型的题里面特别常见。但是现在有chat老师,他会针对我的代码告诉我我哪里想错了,应该怎么做;还按照我写代码的习惯帮我总结了一套属于我的刷题模板。每天写题全是正反馈!
牛客981:不刷才是爽
AI时代的工作 VS 传...
点赞 评论 收藏
分享
2025-12-15 11:27
门头沟学院 Java
哇哇的菜鸡oc:所有人不要理会,就好了,后面他就知道怎么回事了,只能说有的时候市场都是被宰的人搞坏的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务