前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java反射是什么

Java反射是什么

作者头像
我是攻城师
发布2019-07-08 10:24:16
8210
发布2019-07-08 10:24:16
举报
文章被收录于专栏:我是攻城师我是攻城师

前言

Java的反射特性是一项非常强大和有用的功能,它使得我们可以轻松的在运行时观察到类实例的内部状态,并且可以动态的操作实例,从而为Java语言提供更多更灵活的想象空间。随便举几个例子:使用反射可以动态的映射Java对象属性到Json文件属性的操作,这一点无论在FastJson,还是GSON或者是jackson上都体现的淋漓尽致。此外使用反射可以轻松的用在JDBC中完成Java Bean和数据库表的动态适配组装,如我们熟知的hibnate,jpa,等持久化框架也都是利用了这种特性,最后无论是动态代理的AOP,还是OSGI的动态加载都离不开反射的辅助,由此可见反射的强大之处。

反射的类型

Java反射可以获取很多类的信息,如下:

(1)获取实例本身的信息

(2)获取实例的字段

(3)获取实例的构造函数

(4)获取实例的方法

(5)获取实例的私有的字段和方法

(6)获取实例的注解信息

(7)获取实例里面的数组

(8)获取实例的泛型类型

(9)获取实例的模块类型

(10)配合实现动态代理

(11)配合实现动态类的加载和热加载

一个简单的反射例子

下面是一个获取类里面所有方法的简单功能:

代码语言:javascript
复制
package reflection;
import java.lang.reflect.Method;
public class ReflectionDemo1 {
    public void m1(){
    }
    public void m2(){
    }
    public void m3(){
    }

    public static void m4(){
    }


    public static void main(String[] args) {

        Method[] methods=ReflectionDemo1.class.getMethods();
        for(Method method:methods){
            System.out.println(method.getName());        }
    }
}

输出如下:

代码语言:javascript
复制
mainm4m3m1m2waitwaitwaitequalstoStringhashCodegetClassnotifynotifyAll

注意,从上面的输出中我们能够看到,除了我们自定义的方法外,还有来自继承父类Object的方法也会被打印输出,另外我们注意到wait方法被输出了三次,这一次因为在Objec类里面,这个方法有三个重载,所以被输出了三次,当然通过反射的API,我们也是可以获取到每个重载方法有几个参数,以及参数的类型是什么。

总结

本篇文章主要简单的介绍了Java反射技术基本功能和应用场景,Java反射技术核心都是围绕着Class这个类展开的,所有反射可以获取到的信息都在Class类里面可以找到对应的API和方法,学习和了解反射技术是非常有用的,将有助于看清很多高级功能的底层原理,凡事有利必有弊,反射在带来灵活性的同时,也带来了一定的弊端比如对封装性的破坏以及反射自身调用性能低下等问题,所以在实际应用中应该权衡考虑,因地制宜,后面我们会结合具体的例子和场景来进一步介绍反射相关的内容。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我是攻城师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 反射的类型
  • 一个简单的反射例子
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档