JAVA语言中的反射机制的作用原理及使用

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;动态获取的信息以及动态调用对象的方法的功能。

所属分类 JAVA

相关标签 对象获取反射

前言

绝大多数经典的JAVA框架均采用了JAVA的反射机制来实例化、维护JAVA对象。

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用它的任意一个方法和属性;

这种动态获取的信息以及动态调用对象的方法的功能称为JAVA语言的反射机制。

JAVA通常是先有类再有对象,类的对象可以调用方法或者属性。

反射其实是通过Class对象来调用类里面的方法。

通过反射可以调用私有方法和私有属性。

什么是反射

反射就是可以在程序运行的时候动态装载类,查看类的信息,生成对象,或操作生成对象。

类在运行的时候,可以得到该类的信息,并且可以动态的修改这些信息,自己能看到自己,跟照镜子一样。

JAVA的反射机制是在编译的时候并不确定哪个类被加载,而在程序运行的时候才加载、探知、自审、使用在编译期并不知道的类,这样的特点就是反射。

反射的作用

如果没有采用反射的机制,A类如果需要使用B类的方法,必须要求B类已经完成方法的编写(编译),否则A类无法通过编译。

而利用JAVA的反射机制,A类可以在未得到B类完成编译时能够完成自己身代码的编译。

JAVA的反射机制提供了这些能力:

  1. 运行时判断任意一个对象所属的类
  2. 运行时构造任意一个类的对象
  3. 运行时判断任意一个类所具有的成员变量和方法
  4. 运行时调用任意一个对象的方法
  5. 生成动态代理

JAVA的反射机制能够探知类的基本结构,这种能力被称为JAVA类的“自审”。

开发常用的eclipse和idea,当我们构建出一个对象的时候,去调用该对象的方法和属性的时候,一按点.编译工具就会将该对象可用的所有的方法和属性全部都列出来,供用户进行选择,就是利用了JAVA的反射原理,对创建的对象的探知、自审。

反射技术被大量用于JAVA设计模式和框架技术,最常见的设计模式就是工厂模式和单例模式。

反射的实现

反射的实现主要借助四个类:Class、Constructor、Field、Method

//获取Class类的三种方式
Class<User> userClass;
//.class
userClass = User.class;
//类名全路径
userClass = (Class<User>) Class.forName("com.mebugs.user");
//对象获取Class
User user = new User();
userClass = (Class<User>) user.getClass();
//Class获取对象
User tom = userClass.newInstance();
//Class类获取构造方法
Class<User> consClass = User.class;
//全部公共构造方法数组
Constructor<User>[] allPubCons = (Constructor<User>[]) consClass.getConstructors();
//根据入参获取指定公共构造方法
Constructor needPubCons = consClass.getConstructor(new Class[]{int.class,String.class});
//全部构造方法(包含私有)
Constructor<User>[] allCons = (Constructor<User>[]) consClass.getDeclaredConstructors();
//根据入参获取指定构造方法(包含私有)
Constructor needCons = consClass.getDeclaredConstructor(new Class[]{int.class,String.class});
//Class类获取属性
Class<User> fieldClass = User.class;
//获取指定的公共属性(类或接口的指定已声明字段类对象)
Field pubName = fieldClass.getField("name");
//获取全部公共属性(类或接口的指定已声明字段类对象)
Field[] allPubFiels = fieldClass.getFields();
//获取指定的属性(类或接口的指定已声明字段类对象)
Field name = fieldClass.getDeclaredField("name");
//获取全部属性(类或接口的指定已声明字段类对象)
Field[] allFiels = fieldClass.getDeclaredFields();
//Class类获取方法
Class<User> modClass = User.class;
//获取指定的公共方法
Method pubDo = modClass.getMethod("do",new Class[]{int.class,String.class});
//获取全部公共方法
Method[] allPubMo = fieldClass.getMethods();
//获取指定的方法
Method doMo = modClass.getDeclaredMethod("do",new Class[]{int.class,String.class});
//获取全部方法
Method[] allMo = fieldClass.getDeclaredMethods();

备注

ClassForName与ClassLoader的区别:

  • class.forName()除了将类的.class文件加载到JVM中会对类进行解释、执行类中的static块以及静态变量赋值的静态方法
  • classLoader只干一件事情,就是将.class文件加载到JVM中

米虫

做一个有理想的米虫,伪全栈程序猿,乐观主义者,坚信一切都是最好的安排!

本站由个人原创、收集或整理,如涉及侵权请联系删除

本站内容支持转发,希望贵方携带转载信息和原文链接

本站具有时效性,不提供有效、可用和准确等相关保证

本站不提供免费技术支持,暂不推荐您使用案例商业化

发表观点

提示

昵称

邮箱

QQ

网址

当前还没有观点发布,欢迎您留下足迹!

同类其他

JAVA

listener、filter、servlet的加载次序

在web.xml中经常会看到listener,filter,servlet的相关标签配置,它们分别是监听器、过滤器、容器,都是在项目启动的时候就可以进行初始化的加载动作

JAVA中创建线程的三种方式的使用与区别

JAVA中通过继承Thread类、实现Runnable接口以及实现Callable接口配合Future接口实现创建多线程,三种方式各有优缺点,而第三种则具备更多的增强能力

SpringBoot配置文件生效优先级

SpringBoot 可以通过 spring.profiles.active 属性指定生效不同配置文件来满足多环境要求,多环境更为复杂的场景,就需要理解配置文件生效优先级,考虑直接引入外部配置项和配置文件

自定义filter过滤器拦截未登录(非法)请求

在JAVA的WEB工程中我们可以将JSP页面文件放在WEB-INFO中限制用户进行URL直接访问,但静态资源如js、css文件却是需要被外部直接访问的,直接对外暴露又不太安全,可以通过自定义过滤器处理

Maven的pom配置文件的scope属性

scope属性主要用于控制依赖范围,主要分为编译、打包、运行、测试、依赖传递等各个常见,scope不同于optional提供了更多可选择的配置参数用于应对不同的依赖场景。

JAVA单例模式中的饿汉模式与懒汉模式

在绝大多数的JAVA经典应用框架中广泛使用到了单例设计模式,单例设计模式最普遍的分类方式分类分为懒汉模式与饿汉模式两种,其主要区别在于初始化创建对象的时机不同。

选择个人头像

昵称

邮箱

QQ

网址

评论提示

  • 头像:系统为您提供了12个头像自由选择,初次打开随机为你选择一个
  • 邮箱:可选提交邮箱,该信息不会外泄,或将上线管理员回复邮件通知
  • 网址:可选提交网址,评论区该地址将以外链的形式展示在您的昵称上
  • 记忆:浏览器将记忆您已选择或填写过得信息,下次评论无需重复输入
  • 审核:提供一个和谐友善的评论环境,本站所有评论需要经过人工审核