# java反射

1、反射就是把Java类中的各个成分映射成一个个的Java对象。即在运行状态中,对于任意一个类,都能够知道这个类的所以属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性。这种动态获取信息及动态调用对象方法的功能叫Java的反射机制。
2、在方法区存在的类对象(Class),当new对象时,通过方法区的类对象在堆里创建实例;即每个堆里的对象都有在方法区里对应的类对象
java反射机制是在运行状态中,对任意类都能够操作其属性和方法。
3、Java反射机制主要提供了以下功能:
      在运行时判断任意一个对象所属的类。
      在运行时构造任意一个类的对象。
     在运行时判断任意一个类所具有的成员变量和方法。
     在运行时调用任意一个对象的方法(动态代理)

## test所需类

/*** 战士类*/
public class FighterEntity {protected String name;//姓名public String sex;//性别protected int age;//年龄private String star;//所属星球private String sects;//所属门派public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getStar() {return star;}public void setStar(String star) {this.star = star;}/*** 类注解*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ClassAnn {String value() default "";
} /*** 字段注解*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldAnn {String value() default "";
}public String getSects() {return sects;}public void setSects(String sects) {this.sects = sects;}
}@ClassAnn("类注解测试")
public class SaiyaEntity extends FighterEntity{@FieldAnn("字段注解测试")private String arms;public SaiyaEntity(String name){this.name = name;}private SaiyaEntity(String name,String arms){this.name = name;this.arms = arms;}public SaiyaEntity(){}public String getArms() {return arms;}public void setArms(String arms) {this.arms = arms;}//变身 无参 无返回值public void evolution(){System.out.println(getName()+"变身为超级赛亚人");}//变身 有参 无返回值public void evolution(int no){System.out.println(getName()+"变身为超级赛亚人"+no);}//变身 有参 有返回值public String getEvolution(int no){return getName()+"变身为超级赛亚人"+no;}private void isHungry() {System.out.println(getName()+"饿了");}
}

## 获取类对象方法

1、 通过类名获取

2、 通过类路径获取

3、通过实例对象获取

/*** 获取类名* @throws Exception*/@Testpublic void getClassObjTest() throws Exception {//1、通过类名获取Class clazz1 = FighterEntity.class;System.out.println(clazz1.getCanonicalName());//2、通过类路径获取Class clazz2 = Class.forName("com.example.entity.FighterEntity");//3、通过实例对象获取FighterEntity kklt = new FighterEntity();Class clazz3 = kklt.getClass();}

## 类对象操作

@Testpublic void classOpt(){Class clazz = SaiyaEntity.class;//获取类名称String name = clazz.getName();System.out.println("类名称:"+name);//得到父类Class superClass = clazz.getSuperclass();System.out.println("父类名:"+superClass.getName());//获取类加载器ClassLoader classLoader = clazz.getClassLoader();//获取资源URL resource = clazz.getResource("");//判断一个类是不是接口boolean anInterface = clazz.isInterface();//判断一个类是否是数组boolean isArray = clazz.isArray();//......}

## 属性操作

1、 获取属性对象Field

- getField获取public属性(包含父类属性)
- getDeclaredField获取所有属性(不包含父类的属性)

2、 属性对象Field操作

- public属性可以直接操作(包含父类属性)
- 非public属性需要setAccessible(true)(不包含父类属性)

/*** 类属性操作*/@Testpublic void classFieldOpt() throws Exception {Class clazz = SaiyaEntity.class;Field[] pubFields = clazz.getFields();//public属性 可以拿到父类System.out.println("public属性:");for(Field field : pubFields){System.out.println(field.getName());}Field[] allFields = clazz.getDeclaredFields();//所有属性 不能拿到父类的属性System.out.println("所有属性:");for(Field field : allFields){System.out.println(field.getName());}SaiyaEntity kklt = new SaiyaEntity();//创建赛亚人战士kklt.setName("卡卡罗特");//public field操作Field sexField = clazz.getField("sex");sexField.set(kklt,"男");System.out.println(kklt.getName() +"性别:"+kklt.getSex());System.out.println("反射获取"+kklt.getName() +"性别:"+sexField.get(kklt));Field armsField = clazz.getDeclaredField("arms");//武器属性armsField.setAccessible(true);//操作权限armsField.set(kklt,"金箍棒");System.out.println(kklt.getName() +"武器:"+kklt.getArms());System.out.println("反射获取"+kklt.getName() +"武器:"+armsField.get(kklt));}

## 方法操作

1、 获取方法对象

- getMethod获取public方法(包含父类方法)
- getDeclaredMethod获取所有方法(不包含父类的方法)
2、方法对象Method操作

- public方法可以直接操作(包含父类方法)
    - 非public方法需要setAccessible(true)(不包含父类方法)
    - 通过invoke()调用方法(4种情况)

- 无参,无返回值
        - 有参无返回值
        - 有参有返回值
        - 无参,有返回值

/*** 类方法操作*/@Testpublic void classMethodOpt() {try {Class<?> clazz = SaiyaEntity.class;//获取类对象SaiyaEntity kklt = new SaiyaEntity();//创建赛亚人战士 卡卡罗特kklt.setName("卡卡罗特");kklt.setArms("金箍棒");System.out.println("----------------无参数 无返回值test");Method evolution1 = clazz.getMethod("evolution");//无参数 无返回值 调用evolution1.invoke(kklt);System.out.println("----------------无参数 无返回值test--------------------");System.out.println("----------------有参数 无返回值test");Method evolution2 = clazz.getMethod("evolution",int.class);//有参数 无返回值 调用System.out.println("参数个数:"+evolution2.getParameterCount());//方法参数个数System.out.println("参数类型数组:"+ Arrays.toString(evolution2.getParameterTypes()));//方法参数类型数组evolution2.invoke(kklt,2);System.out.println("----------------有参数 无返回值test--------------------");System.out.println("----------------有参数 有返回值test");Method getEvolution = clazz.getMethod("getEvolution",int.class);//有参数 有返回值 调用System.out.println("参数类型数组:"+ getEvolution.getReturnType().getName());//返回值类型String str = (String)getEvolution.invoke(kklt,2);System.out.println(str);System.out.println("----------------有参数 有返回值test--------------------------");System.out.println("----------------非public方法test");//非public方法Method isHungry = clazz.getDeclaredMethod("isHungry");isHungry.setAccessible(true);isHungry.invoke(kklt);System.out.println("----------------非public方法test-------------------------");}catch (NoSuchMethodException e){e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}

## 构造器(特殊的方法)

### getConstructor获取public构造器

### getDeclaredConstructor获取所有构造器

### 创建对象newInstance()

### 非public方法需要setAccessible(true)

/*** 类构造器操作*/@Testpublic void classConstructorOpt() {try {Class<?> clazz = SaiyaEntity.class;//获取类对象Constructor[] pubConstructors = clazz.getConstructors();for(Constructor obj : pubConstructors){System.out.println("构造器名称:"+obj.getName()+"----构造器参数:"+obj.getParameterCount());}Constructor pubConstructor = clazz.getConstructor();System.out.println("构造器名称:"+pubConstructor.getName()+"----构造器参数:"+pubConstructor.getParameterCount());Constructor[] constructors = clazz.getDeclaredConstructors();for(Constructor obj : constructors){System.out.println("构造器名称:"+obj.getName()+"----构造器参数:"+obj.getParameterCount());}//创建无参对象Constructor constructor1 = clazz.getDeclaredConstructor();Object obj1 = constructor1.newInstance();//创建有参对象Constructor constructor2 = clazz.getDeclaredConstructor(String.class,String.class);constructor2.setAccessible(true);Object obj2 = constructor2.newInstance("卡卡罗特","金箍棒");System.out.println();}catch (NoSuchMethodException e){e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}

## 注解操作

/*** 注解操作*/@Testpublic void classAnnotationOpt() {try {Class<?> clazz = SaiyaEntity.class;//获取类对象ClassAnn classAnn = clazz.getAnnotation(ClassAnn.class);//获取类注解System.out.println(classAnn.value());Field armsField = clazz.getDeclaredField("arms");FieldAnn fieldAnn = armsField.getAnnotation(FieldAnn.class);System.out.println(fieldAnn.value());}catch (NoSuchFieldException e){e.printStackTrace();}}

反射思维导图:

java原理之反射机制相关推荐

  1. JAVA基础--JAVA中的反射机制详解

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

  2. 根据实例详解Java中的反射机制

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

  3. Java动态性之反射机制(reflection)

    说到反射机制,第一次接触的人可能会比较懵,反射?什么反射?怎么反射?反射是干嘛的?下面我将在这篇文章中讲讲Java的反射机制 不过在这之前,还有一个问题需要解决,标题名中的动态性,说起动态性,我先介绍 ...

  4. 黑马程序员,黑马论坛 ------JAVA中的反射机制

    文章来源:黑马程序员,黑马论坛 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法 ...

  5. 浅说Java中的反射机制(一)

    在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...

  6. java 有哪些反射机制_Java 的反射机制你了解多少?

    不知道多少次听说过了Java反射机制的使用,比如:Spring 框架如何实例化IoC容器中的Bean,编码过程中如何动态的清理对象中的字段信息等等.工作中只是听说.看同事们编码实践,但是自己却只是概念 ...

  7. java代码安全检测机制_全面解析:java中的反射机制,内含代码验证解析

    什么是反射? 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功 ...

  8. JAVA Reflection(反射机制)续

    接上一篇文章  JAVA Reflection(反射机制) 动态数组 java.lang.reflect.Array static Object set(Object array, int index ...

  9. JAVA Reflection(反射机制)

    Java 反射机制 反射机制简介 反射机制应用示例 简单的Ioc实现 代理模式 Java动态代理 简单的Aop实现 "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言" ...

最新文章

  1. css中的垂直居中方法
  2. 雷军哽咽:我愿押上人生全部声誉,为小米汽车而战!
  3. Linux 构建一些 开机就可以使用的命令
  4. boost::core模块实现fn地址
  5. asp dsn mysql 连接失败_ASP连接MySQL遇到一些问题 Microsoft OLE DB Provider for ODBC Drivers (0x80004005)...
  6. 重启开源,分享无限--微软面试187题精选
  7. spark 过滤log
  8. FPGA 20个例程篇:7.FLASH读写断电存储
  9. python傅里叶谐波分析_利用傅里叶谐波分析法的时序数据周期迭代辨识算法
  10. 无线网络管理工具wifi hoper在win7上的安装方法及推荐软件inSSIDer
  11. 一个人的行动力,取决于他的底层信念。
  12. 【解决】jsPDF之长图片生成PDF(分页,失真)
  13. 关于人工智能(AI),【西部世界】提供一点小想法
  14. 制作背景为透明的logo
  15. 移动端H5页面编辑器开发实战--经验技巧篇
  16. 【CCNA | 网络模拟器CPT系列】Cisco Packet Tracer 8.2.0 的安装 Ⅰ
  17. fatfs文件系统详解之f_mount函数分析
  18. 初识阿里云(云计算)--发展历程和技术架构、地域和可用区
  19. k8s学习(2)- 虚拟机搭建搭建Kubernetes集群(1.24.2)
  20. https://www.atlassian.com

热门文章

  1. 心电图心跳信号多分类预测(一)
  2. Monkey的11种事件
  3. java基于微信小程序的师生答疑交流平台 uniAPP小程序
  4. [转载]性能测试中TPS和并发用户数估算
  5. .NET-房贷计算器
  6. 技术、产品、交流、思考 - 微软技术暨生态大会 2018
  7. 体系解读罗克韦尔MES平台FTPC-跟我入门MES/MOM系列特别篇
  8. 统计每天每个直播间的访客数、每天最大访客数的直播间
  9. 数仓建模之声明粒度 一文读懂什么是粒度 看完保证通透!
  10. zol 中关村在线是骗子网站,大家当心