看完老板哭着让我留下来,Java反射由浅入深全面解析


//获取一个class的Class实例



Class clas = String.class;



String s = "hello";

Class cals = s.getClass();



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

  • Class实例在JVM中是唯一的:

    可以用==比较两个Class实例。


Class cla1 = String.class;



String s = "hello";

Class cal2 = s.getClass();



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



boolean b1 = cls1 ==cls2; // true

boolean b1 = cls2 ==cls3; // true 

  • Class实例比较和instanceof的差别;

    instanceof比较的时候,不但匹配当前类型,还匹配当前类型的子类。==只匹配当前类型。通常情况下用instanceof判断是数据类型,只有精确判断某个实例是否是某个类型的时候才用==来判断。


Integer n = new Integer(123);



boolean b1 = n instanceof Integer ; // true

boolean b2 = n instanceof Number;  // true



boolean b3 = n.getClass() == Integer.class;// true

boolean b4 = n.getClass() == Number.class;// false 

  • 反射的目的是获得某个Object实例时,我们可以获取该Objectclass信息。

  • Class实例判断class类型。


Runnable.class.isInterface(); //true

String[].class.isArray(); //true 

  • 利用JVM动态加载class的特性可以在运行其根据条件加载不同的实现类。

//commons  Logging优先使用Log4j

LogFactFactory factory;

if (isClassPresent("org.apache.logging.log4j.Logger")) {

     factory = createLog4j();

} else {

     factory = createJdkLog();

}



boolean isClassPresent(String name) {

     try {

          Class.forName(name);

          return true;

     } cath (Exception e) {

          return false;             

     }

} 

2. 访问字段(field)

  • 通过Class实例获取field信息:

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

    getDeclaredField(name):获取当前的某个类的field(不包括父类)。

    gerFields:获取所有public的field(包括父类)。

    getDeclaredFileds():获取当前类的所有filed(不包括父类)。

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

    getName(); getType(); getModifiers();

  • 获取一个filed值:get(Object)获取一个实例的该字段的值。

  • 设置一个filed值:set(Object)设置一个实例的该字段的值。

  • 通过setAccessible(true)来访问非public字段。

    **注意:**设置setAccessible(true)的时候可以访问private字段 。但是这个方法可能会失败。如果定义了SecurityManManager,它的规则阻止了对该field设置Accessible就会抛出异常 。例如:把规则应用于所有的java和javax开头的package的类,那么对于java的核心类就不能访问它们的private字段。通常情况下自己写的类和第三方的类是没有这个限制的。

3. 调用方法(method)

  • 通Clsss实例获取methood信息:

    getMethod(…):获取某个public的method(包括父类)。

    getDeclaredMethod(…):获取当前类的某个method(不包括父类)。

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

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

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

    getName():返回一个名称。

    getReturnType():返回一个类型。

    getParParameterTypesTypes():返回一个参数类型。

    getModifiers():返回方法的修饰符。

  • 调用无参数的Method

    Object invoke(Object obj)


Integer n = new Integer(123);

Class cls = n.getClass();

 Method m = cls.getMethod("toString");



## 最后

分享一套我整理的面试干货,这份文档结合了我多年的面试官经验,站在面试官的角度来告诉你,面试官提的那些问题他最想听到你给他的回答是什么,分享出来帮助那些对前途感到迷茫的朋友。

#### 面试经验技巧篇

* 经验技巧1 如何巧妙地回答面试官的问题
* 经验技巧2 如何回答技术性的问题
* 经验技巧3 如何回答非技术性问题
* 经验技巧4 如何回答快速估算类问题
* 经验技巧5 如何回答算法设计问题
* 经验技巧6 如何回答系统设计题
* 经验技巧7 如何解决求职中的时间冲突问题
* 经验技巧8 如果面试问题曾经遇见过,是否要告知面试官
* 经验技巧9 在被企业拒绝后是否可以再申请
* 经验技巧10 如何应对自己不会回答的问题
* 经验技巧11 如何应对面试官的“激将法”语言
* 经验技巧12 如何处理与面试官持不同观点这个问题
* 经验技巧13 什么是职场暗语

![](https://img-blog.csdnimg.cn/img_convert/dbb305a4e112be25de8882a65bccd1c7.png)

#### 面试真题篇

* 真题详解1 某知名互联网下载服务提供商软件工程师笔试题
* 真题详解2 某知名社交平台软件工程师笔试题
* 真题详解3 某知名安全软件服务提供商软件工程师笔试题
* 真题详解4 某知名互联网金融企业软件工程师笔试题
* 真题详解5 某知名搜索引擎提供商软件工程师笔试题
* 真题详解6 某初创公司软件工程师笔试题
* 真题详解7 某知名游戏软件开发公司软件工程师笔试题
* 真题详解8 某知名电子商务公司软件工程师笔试题
* 真题详解9 某顶级生活消费类网站软件工程师笔试题
* 真题详解10 某知名门户网站软件工程师笔试题
* 真题详解11 某知名互联网金融企业软件工程师笔试题
* 真题详解12 国内某知名网络设备提供商软件工程师笔试题
* 真题详解13 国内某顶级手机制造商软件工程师笔试题
* 真题详解14 某顶级大数据综合服务提供商软件工程师笔试题
* 真题详解15 某著名社交类上市公司软件工程师笔试题
* 真题详解16 某知名互联网公司软件工程师笔试题
* 真题详解17 某知名网络安全公司校园招聘技术类笔试题
* 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题

![](https://img-blog.csdnimg.cn/img_convert/0bf58eafbe71ad4828e7bcb4730e1f71.png)

> 需要这份文档的朋友可以[点击蓝色传送门](https://gitee.com/vip204888/java-p7)即可免费获取!

资料整理不易,点个关注再走吧

* 真题详解15 某著名社交类上市公司软件工程师笔试题
* 真题详解16 某知名互联网公司软件工程师笔试题
* 真题详解17 某知名网络安全公司校园招聘技术类笔试题
* 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题

[外链图片转存中...(img-kzhjYZDs-1628234343433)]

> 需要这份文档的朋友可以[点击蓝色传送门](https://gitee.com/vip204888/java-p7)即可免费获取!

资料整理不易,点个关注再走吧

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值