Java反射由浅入深全面解析(1),Java架构师必备技术

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`实例时,我们可以获取该`Object`的`class`信息。

*   从`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”);

String s = (String) m. invoke(n);

//“123”,相当于String s = n.toString();

写在最后

作为一名即将求职的程序员,面对一个可能跟近些年非常不同的 2019 年,你的就业机会和风口会出现在哪里?在这种新环境下,工作应该选择大厂还是小公司?已有几年工作经验的老兵,又应该如何保持和提升自身竞争力,转被动为主动?

就目前大环境来看,跳槽成功的难度比往年高很多。一个明显的感受:今年的面试,无论一面还是二面,都很考验Java程序员的技术功底。

最近我整理了一份复习用的面试题及面试高频的考点题及技术点梳理成一份“Java经典面试问题(含答案解析).pdf和一份网上搜集的“Java程序员面试笔试真题库.pdf”(实际上比预期多花了不少精力),包含分布式架构、高可扩展、高性能、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多个知识点高级进阶干货!

由于篇幅有限,为了方便大家观看,这里以图片的形式给大家展示部分的目录和答案截图!有需要的朋友可以戳这里免费获取

Java经典面试问题(含答案解析)

阿里巴巴技术笔试心得

https://codechina.csdn.net/m0_60958482/java-p7)**
[外链图片转存中…(img-M3ZiBtCY-1630222783106)]

Java经典面试问题(含答案解析)

[外链图片转存中…(img-Qvbxc5AY-1630222783108)]

阿里巴巴技术笔试心得

[外链图片转存中…(img-6ggj0RuE-1630222783109)]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值