JAVA语言之java利器------反射机制
小标 2019-03-04 来源 : 阅读 669 评论 0

摘要:本文主要向大家介绍了JAVA语言之java利器------反射机制,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言之java利器------反射机制,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

JAVA语言之java利器------反射机制

java反射的概念:java的反射机制是指在运行状态下,对于一个类来说,可以得到这个类的所有方法和属性。对于一个对象来说,可以调用这个对象的人和方法和属性。 反射机制首先会拿到该类的字节码文件(Class文件),然后反向获取这个类的所有信息。(注意:一个类型的类在运行中,只产生一个class文件)


既然反射的前置条件是获取class类,所以不得不提出获取class的方法。


获取class的几种方式:


(1)Persion p=new Persion();


Class c=p.getClass();


该方法不推荐使用,因为已经有了persion对象,反射多此一举。


(2)Class c=Persion.class;


任意的类都是继承object类,任何类也都有.class属性,说明object里面有一个class用来获取类的信息,但是该方法需要倒入包,依赖强。


(3)Class c =Class.forName("com.xxxx.xxxx")


推荐第三种,无序导包,效率较高。


以上三种方法获得的c对象都是同一个对象,因为类在运行的过程中,只产生一个class文件。


反射重要的类和方法


(1)Class类


getName():获得类的完整名字。


  getFields():获得类的public类型的属性。


  getDeclaredFields():获得类的所有属性。包括private 声明的和继承类


  getMethods():获得类的public类型的方法。


  getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类


  getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。


  getConstructors():获得类的public类型的构造方法。


  getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。


  newInstance():通过类的不带参数的构造方法创建这个类的一个对象。


boolean isPrimitive = class1.isPrimitive();//判断是否是基础类型


boolean isArray = class1.isArray();//判断是否是集合类


boolean isAnnotation = class1.isAnnotation();//判断是否是注解类


boolean isInterface = class1.isInterface();//判断是否是接口类


boolean isEnum = class1.isEnum();//判断是否是枚举类


boolean isAnonymousClass = class1.isAnonymousClass();//判断是否是匿名内部类


boolean isAnnotationPresent = class1.isAnnotationPresent(Deprecated.class);//判断是否被某个注解类修饰


String className = class1.getName();//获取class名字 包含包名路径


Package aPackage = class1.getPackage();//获取class的包信息


String simpleName = class1.getSimpleName();//获取class类名


int modifiers = class1.getModifiers();//获取class访问权限


Class<?>[] declaredClasses = class1.getDeclaredClasses();//内部类


Class<?> declaringClass = class1.getDeclaringClass();//外部类


(2)Field类(一般于Class类连用)


Class c =Class.forName("XXXX");


Field fields=c.getDeclaredFields("fieldName");


fields.setAccessible(true);//设置私有变量可访问


Object obj=c.newInstance();


fields.set(obj,"xxx")//设置变量的值


(3)Method


Class.forName("com.XXX.XXX." + className).newInstance().getMethod("methodName").invoke(lass.forName("com.XXX.XXX." + className).newInstance())//调用反射对象的方法


反射的应用场景:


(1)简单工厂


(2)代理模式


(3)一般还和配置文件共同使用


Class clazz = Class.forName("com.XXX.XXX." + className);//className为配置文件className的值


Object obj = clazz.newInstance();


Method method = clazz.getMethod(methodName);//methodName为配置文件methodName的值


method.invoke(obj);


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程