实战中反射的应用-阿里云开发者社区

开发者社区> 小鲍侃java> 正文

实战中反射的应用

简介: 实战中反射的应用
+关注继续查看

image.png

1.概念

反射 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Serializable),也包括fields和methods的所有信息,并可于运行时改变fields内容或调用methods。

一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。

尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语。

用白话讲 反射 能够获取java类在运行过程中(class文件)的对象,方法,成员变量。

ps:反射能获取private方法,楼主面试常问。

2.名词解析

  • Class类:代表一个类
  • Field类:代表类的成员变量
  • Method类:代表类的方法
  • Constructor类:代表类的构造方法
  • Array类:提供了动态创建数组,以及访问数组的元素的静态方法

3.常用操作

1.获取类的变量

public Object getProperty(Object object, String fieldName) throws Exception {  
     Class class = object.getClass();  //得到该类的Class。
     Field field = class .getField(fieldName);  //获取声明属性
     Object property = field.get(object);  //获取类属性
     return property;  
} 

2.获取类的静态变量

public Object getStaticProperty(String className, String fieldName)  
             throws Exception {  
     Class class = Class.forName(className);  //获取类的Class
     Field field = class.getField(fieldName);   //获取声明的属性
     Object property = field.get(Class);  获取静态属性
     return property;  
}  

3.执行类的方法

public Object invokeMethod(Object object, String methodName, Object[] args) throws Exception {  
     Class Class = object.getClass();   //获取class对象
     Class[] argsClass = new Class[args.length];    //获取参数
     for (int i = 0, j = args.length; i < j; i++) {  
         argsClass[i] = args[i].getClass();  
     }  
     Method method = class.getMethod(methodName,argsClass);   //获取方法
     return method.invoke(object, args);      //通过发射调用方法
}   

4.执行类的静态方法

public Object invokeStaticMethod(String className, String methodName,  
             Object[] args) throws Exception {  
     Class Class = Class.forName(className);  //获取class
     Class[] argsClass = new Class[args.length];  
     for (int i = 0, j = args.length; i < j; i++) {  
         argsClass[i] = args[i].getClass();  
     }  //获取参数
     Method method = class.getMethod(methodName,argsClass);  //获取方法
     return method.invoke(null, args);   //通过反射执行
 }  

5.新建实例

public Object newInstance(String className, Object[] args) throws Exception {  
     Class class = Class.forName(className); //获取class 
     Class[] argsClass = new Class[args.length];   
     for (int i = 0, j = args.length; i < j; i++) {  
         argsClass[i] = args[i].getClass();  
     }  //获取参数
     Constructor cons = class.getConstructor(argsClass);  //获取构造方法
     return cons.newInstance(args);  //新建实例
}  

6.判断是否是指定类

public boolean isInstance(Object obj, Class cls) {  
     return cls.isInstance(obj);  
}  

7.获取数组属性

public Object getByArray(Object array, int index) {  
     return Array.get(array,index);  
}  


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10084 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
12076 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
9161 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13890 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
4660 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
4506 0
+关注
小鲍侃java
小作坊架构师。
365
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载