1.获得Class对象

  1. Class<?>  classType  =  Class.forName() 可以通过传入一个全限定类名(包含包名)返回一个该类的Class类对象引用 。
  2. Class<?>  classType  =  object.getClass()   通过引用的到Class对象。
  3. Class<?>  classType  =  Object.class  通过类字面常量获得,好处就是懒加载,只有使用时才会加载。

2.获得构造器

  1. 获得指定构造器

    • Constructor<TgetConstructor(Class<?>... parameterTypes)

    • parameterTypes 是 Class[ ] ,它里面的元素和元素顺序与构造器参数对应。

    1. Constructor  constructor  = getConstructor(new Class[ ] { } ),获得默认构造器。
    2. Constructor  constructor  = getConstructor(new Class[ ] {String.class, int.class}),获得参数为(String,int) 的构造器。
  2. 获得所有构造器

    • Constructor[ ]  constructor = classType.getConstructors()

3.获得字段

  1. 获得public字段

    1. Field field =  classTypre.getField( String name ) ;  获得对应名称的字段,注意只能获得所有public字段,包括父类的public字段,其他权限的字段无法获得。
    2. Field[ ] fields =  classTypre.getField() ;  获得所有public字段的数组。
  2. 获得自身字段

    1. Field field = classTypre.getDeclaredField( String name); 获得 当前类定义的字段,包括所有权限。不包括父类任何字段,哪怕是public。
    2. Field[ ] fields =  classTypre.getDeclaredField() ;  获得所有字段的数组。
  3. 获得所有字段包括父类的字段

    1. getSuperClass()获得父类Class对象,getSuperClass()
    2. 循环调用 getSuperClass()和getDeclaredFields[ ],把Field放入List即可。

4.获得方法

  1. 获得public方法

    1. Method method=  classTypre.getMethod ( String name ,Class<?>... parameterTypes) ;  根据方法签名的方法。

      • name是方法名,parameterTypes是 Class [ ],用来获取方法参数的类型
      • 注意只能获得所有public方法,包括父类的public字段,其他权限的字段无法获得。
    2. Method [ ] methods=  classTypre.geMethods() ;  获得所有public方法。
  2. 获得自身方法

    1. Method method= classTypre.getDeclaredMethod (String name ,Class<?>... parameterTypes);

      • 获得 当前类定义的方法,包括所有权限。不包括父类任何方法,哪怕是public。
    2. Method [ ] methods=  classTypre.getDeclaredMethods() ;  获得所有字段的数组。
  3. 获得所有字段包括父类的方法

    1. getSuperClass()获得父类Class对象,getSuperClass()
    2. 循环调用 getSuperClass()和getDeclaredMethods(),把Method放入List即可。

5.获取修改字段相关信息

  • 反射只是通过Class对象获得方法和字段,要获取实例的字段就要传入一个具体的实例。
  1. 获取字段值

    1. Object value = field.get( Object obj)  通过get方法获得实例对象obj对应的field的值。
    2. 如果field是静态字段则可以直接使用get(null)获取值。
    3. 获取基本类型字段的值 : int value = field.get(Object obj) 获取int类型的字段。还有其他类型也是用同样的方法。
    4. private修饰的字段无法直接获得,必须先设置file.setAccessible(true) 才能访问
  2. 获取字段相关信息并通过Modifier解析修饰符

    1. Annotation<?> annotation  = field.getAnnotation(Class<T> annotationClass) 返回字段上的指定注解
    2. Annotation[ ] annotations = field.getDeclaredAnnotations() 返回字段上的所有注解数组
    3. Class<?> type = field.getType()  返回 字段 的类型 的 Class对象。
    4. int  modifier = field.getModifiers()  以int形式返回字段的修饰符。

      • 通过Modifier静态方法判断是不是某一个权限修饰符,如Modifier.isPrivate(modifier)
      • 再如:Modifier.isStatic(modifier) 判断是不是静态成员
      • Modifier静态方法toString 返回权限标识符。
  3. 设置修改字段值

    1. field.set( Object obj, Object value)  通过set方法设置实例对象obj对应的file字段的值为value。
    2. 设置基本类型字段的值 :field.set(Object obj,int value) 获取int类型的字段。还有其他类型也是用同样的方法。
    3. private修饰的字段无法直接设置,必须先设置field.setAccessible(true) 才能设置。
    4. 被final修饰的字段,可以通过反射临时修改值,但是不会把原始值修改了,所以final是绝对不可变的。

6.获取方法相关信息

  • 和字段一样需要传入一个实例对象。
  1. 获取字段相关信息并通过Modifier解析修饰符

    1. Annotation<?> annotation  = method.getAnnotation(Class<T> annotationClass) 返回方法上的指定注解
    2. Annotation[ ] annotations = method.getDeclaredAnnotations() 返回方法上的所有注解数组
    3. Class<?> type = field.getReturnType()  返回 方法返回值类型 的 Class对象。
  2. int  modifier = method.getModifiers()  以int形式返回字段的修饰符。

      • 通过Modifier静态方法判断是不是某一个权限修饰符,如Modifier.isPrivate(modifier)
      • 再如:Modifier.isStatic(modifier) 判断是不是静态成员
      • Modifier静态方法toString 返回权限标识符。
  3. 通过反射调用方法

    1. method.invoke(Object obj, Object... args)  传入实例对象obj和方法对应的参数。
    2. private修饰的方法无法反射,必须先设置method.setAccessible(true) 才能反射调用。

7.创建实例对象其他办法

  1. 通过反射得来的构造器创建实例。
    1. 默认构造器创建对象。

       Constructor<?> constructor = studentClass1.getConstructor(new Class[]{});
      Student student1 = (Student)constructor.newInstance();

      也可以写成constructor.newInstance(new Object[ ]  {  })

    2. 带参构造器创建对象。
       Constructor<?> constructor2 = studentClass1.getConstructor(new Class[]{int.class});
      Student student2 = (Student)constructor2.newInstance(12);

      也可以写成constructor.newInstance(new Object[ ]  { 12 })

  2. 通过Class对象创建实例
    Student student3 = Student.class.newInstance();
  3. 还有通过 new 、 反序列化、colon( ) 方法创建对象,Java中所以一共有5种方法创建实例对象。

JAVA 反射用法的更多相关文章

  1. 不藏了,这些Java反射用法总结都告诉你们

    摘要:Java反射是一种非常强大的机制,它可以在同一个系统中去检测内部的类的字段.方法和构造函数.它非常多的Java框架中,都大量应用了反射技术,如Hibernate和Spring.可以说,反射机制的 ...

  2. Java之反射 — 用法及原理

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

  3. java反射-- Field 用法实践

    java 反射是一种常用的技术手段, 通过加载类的字节码的方式来获取相关类的一些信息 比如成员变量, 成员方法等. Field 是什么呢? field 是一个类, 位于java.lang.reflec ...

  4. java 反射 动态代理

    在上一篇文章中介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大 ...

  5. java反射机制 + Method.invoke解释 getMethod + 反射理解

    功能: 通过读取另一个Dll去创建一个控件(Form,Button,TextBox,DataGridView),然后对当中一些属性进行检查. 创建控件的大致流程是,Assembly->Modul ...

  6. Java反射机制深度剖析

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Java反射机制是Java语言中一种很重要的机制,可能在工作中用到的机会不多,但是在很多框架中都有用到这种机制.我们知道Java是一门静态 ...

  7. Java反射机制剖析(一)-定义和API

    1.     什么是Java反射机制 Java的反射机制是在程序运行时,能够完全知道任何一个类,及其它的属性和方法,并且能够任意调用一个对象的属性和方法.这种运行时的动态获取就是Java的反射机制.其 ...

  8. 如何提高使用Java反射的效率?

    前言 在我们平时的工作或者面试中,都会经常遇到“反射”这个知识点,通过“反射”我们可以动态的获取到对象的信息以及灵活的调用对象方法等,但是在使用的同时又伴随着另一种声音的出现,那就是“反射”很慢,要少 ...

  9. 深入解析Java反射基础

    博客原文:http://www.sczyh30.com/posts/Java/java-reflection-1/ - 这老哥写的特别好 一.回顾:什么是反射? 反射(Reflection)是Java ...

随机推荐

  1. 使用AutoMapper实现Dto和Model的自由转换(下)

    书接上文.在上一篇文章中我们讨论了使用AutoMapper实现类型间1-1映射的两种方式——Convention和Configuration,知道了如何进行简单的OO Mapping.在这个系列的最后 ...

  2. IE userData

    前面的话 IE浏览器实现了它专属的客户端存储机制——“userData”.userData可以实现一定量的字符串数据存储,可以将其用做是Web存储的替代方案.本文将详细介绍IE userData 概述 ...

  3. 深入理解ajax系列第七篇——传递JSON

    前面的话 虽然ajax全称是asynchronous javascript and XML.但目前使用ajax技术时,传递JSON已经成为事实上的标准.因为相较于XML而言,JSON简单且方便.本文将 ...

  4. LOJ2542 PKUWC2018随机游走(概率期望+容斥原理)

    如果直接dp,状态里肯定要带上已走过的点的集合,感觉上不太好做. 考虑一种对期望的minmax容斥:其中Max(S)为遍历完S集合的期望步数,Min(S)为遍历到S集合中一个点的期望步数.当然才不管怎 ...

  5. Mybatis返回HashMap时,某个字段值为null时,不会保存key

    转载: http://blog.csdn.net/little2z/article/details/38525327 mybatis 的 callSettersOnNulls 问题项目用到mybati ...

  6. Educational Codeforces Round 14 D. Swaps in Permutation(并查集)

    题目链接:http://codeforces.com/contest/691/problem/D 题意: 题目给出一段序列,和m条关系,你可以无限次互相交换这m条关系 ,问这条序列字典序最大可以为多少 ...

  7. 学习Spring Boot:(十九)Shiro 中使用缓存

    前言 在 shiro 中每次去拦截请求进行权限认证的时候,都会去数据库查询该用户的所有权限信息, 这个时候就是有一个问题了,因为用户的权限信息在短时间内是不可变的,每次查询出来的数据其实都是重复数据, ...

  8. STM32配置GPIO前须先打开其时钟,否则配置失败

    @2018-5-9 17:11:38 STM32配置GPIO前须先打开其时钟,否则配置失败

  9. 洛谷P2672 推销员

    沙雕贪心...... 我一开始想的是倒着来,每次减去一个. 然后我们就有两个决策:去掉最后一个/去掉前面某一个. 然后第一个决策用并查集维护,第二个决策用线段树即可.仔细想想觉得普及组不会考这种东西, ...

  10. ueditor的上传文件漏洞(c#)

    项目中使用了ueditor,安全测试发现一个漏洞,涉及漏洞的文件名字为UploadHandler.cs,其中有一个方法: private bool CheckFileType(string filen ...