Java反射的使用

浅浅的花香味﹌ 2024-03-18 00:37 153阅读 0赞

反射是Java框架的核心,无论是Tomcat,SpringMVC,SpringIOC,SpringAOP,动态代理,都使用了反射

那么什么是反射?——————-反射就是获取类信息的能力

Java有两种创建对象的方式:①new 对象 ②反射

因此,反射的作用就是,无需new对象,就可以动态获取到一个类的全部信息,包括属性,方法,构造器,以及他们的修饰符,参数,注解等等….从而构造出对象实例并对对象实例进行操作

一、获取类信息

1、获取class对象

  • Class.forName(“全类名”) ——- 在 java文件阶段 就可以获取 字节码文件对象,因此这是最常用的(这种是最常用的)
  • 类名.class ——— 要在类加载完成阶段才能获取
  • 对象名.getClass() ———— 要在对象已经被创建出来的阶段才能获取

    //第一种

    1. Class clazz = Class.forName("fanshe.person");
    2. //第二种
    3. Class clazz1 = person.class;
    4. //第三种
    5. person person = new person();
    6. Class clazz2 = person.getClass();

2、获取变量

  1. Filed[] fileds = clazz.getDeclaredFileds(); //获取全部的变量
  2. Filed[] fileds = clazz.getFileds(); //获取public修饰的变量
  3. Filed filed = clazz.getFiled("变量名"); //获取指定的public修饰的变量
  4. Filed filed = clazz.getDeclaredFiled(变量名"); //获取指定的的变量

3、获取方法

  1. Method[ ] methods = clazz.getDeclaredMethods(); //获取全部的方法
  2. Method[ ] methods = clazz.getMethods(); //获取全部public修饰的方法
  3. Method method = clazz.getMethod("方法名",参数类型.class,参数类型.class...; //单独获取public修饰的方法
  4. Method method = clazz.getDeclaredMethod("方法名",参数类型.class,参数类型.class...); //单独获取方法

4、获取构造器

  1. Constructor[] constructors = clazz.getDeclaredConstructors(); //获取所有的构造器
  2. Constructor[] constructors = clazz.getConstructors(); //获取public修饰的构造器
  3. Constructor constructor = clazz.getConstructor(参数类型.class,参数类型.class..; //单独获取public修饰的构造器
  4. Constructor constructor = clazz.getDeclaredConstructor(参数类型.class ,参数类型.class….;//单独获取构造器

5、获取注解信息

  1. Annotation[] annotations = clazz.getAnnotations();

二、如何操作变量

下面看一段代码示例

  1. Class clazz = Class.forName("fanshe.person");
  2. System.out.println("----------获取 修改值--------------");
  3. //要想获取到值,必须先创建对象,给数据存储空间
  4. person p = new person();
  5. Field age = clazz.getDeclaredField("age");
  6. //get() set()取值和赋值
  7. int ageValue = (int) age.get(p);//类型转换
  8. System.out.println(ageValue);
  9. age.set(p, 20);
  10. int ageValue1 = (int) age.get(p);
  11. System.out.println(ageValue1);
  12. Field height = clazz.getDeclaredField("height");
  13. //私有数据需要使用暴力反射
  14. height.setAccessible(true);//暴力反射
  15. height.set(p, 180);
  16. System.out.println(height.get(p));
  17. //只有private类型需要使用暴力反射
  18. Field name = clazz.getDeclaredField("name");
  19. name.set(p, "张三");
  20. System.out.println(name.get(p));
  21. Field eyes = clazz.getDeclaredField("eyes");
  22. eyes.set(p, 2);
  23. System.out.println(eyes.get(p));

需要注意的是,

如果该属性或方法类型为private,那么需要使用暴力反射,也就是 属性.setAccessible(true)

如果要获取private类型的方法,那么需要使用getDeclared*****

三、调用方法

方法.invoke(对象,”参数”);

  1. clazz = Class.forName("fanshe.person");
  2. Method run = clazz.getDeclaredMethod("run", String.class);
  3. //创建对象,给方法以内存空间
  4. person p1 = new person();
  5. //invoke()执行方法
  6. run.invoke(p1, "张三");
  7. Method change = clazz.getDeclaredMethod("change",String.class,Integer.class);
  8. change.invoke(p1,"小白",183);
  9. Method age = clazz.getDeclaredMethod("getAge", Integer.class);
  10. //暴力反射
  11. age.setAccessible(true);
  12. age.invoke(p1, 18);

发表评论

表情:
评论列表 (有 0 条评论,153人围观)

还没有评论,来说两句吧...

相关阅读

    相关 使用JAVA利与弊

    在Java的20周年的纪念日的日子里,让我们来重新温习下Java里面的高级知识,Java肯定希望大家了解她,要不然你跟她天天相濡以沫了这么长时间,让她知道你竟然不了解她,不在乎

    相关 使用

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

    相关 如何提高使用Java效率?

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

    相关 Java深入浅出

    刚开始接触反射这个概念,感觉反射这个机制很复杂很难懂,所以在这篇文章中对java的反射机制以个人的理解总结归纳。 1. 什么是反射? 什么是反射?在官方文档中是这样说的