Java反射由浅入深全面解析,Java小技巧

本文深入探讨了Java中的反射机制,介绍了如何通过Class实例获取类信息,包括获取字段(field)、方法(method)等,并讲解了setAccessible(true)在访问非public成员时的作用。此外,还讨论了instanceof与Class实例比较的区别。内容涵盖Class对象的唯一性、动态加载类以及如何通过反射调用方法和访问字段。
摘要由CSDN通过智能技术生成

一个 Class实例包含了该 class的完整信息。

  • JVM为每个加载的class创建对应的Class实例,并在实例中保存了该class的所有信息。

  • 如果获取了某个Class实例,则可以获取到该实例对应的class的所有信息。

  • 通过CLass实例获取class信息的方法称为反射(Refection)。


//获取一个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的所有信息:

最后总结

ActiveMQ+Kafka+RabbitMQ学习笔记PDF

image.png

  • RabbitMQ实战指南

image.png

  • 手写RocketMQ笔记

image.png

  • 手写“Kafka笔记”

image

关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦

afka笔记”

[外链图片转存中…(img-Bid7Kl7q-1630222893607)]

关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦

资料领取方式:戳这里免费领取

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值