Java之反射

简介: Java之反射

 Java的反射机制,常用的4个类,Class、Field、Constractor、Method。Class是一个比较特殊的类,可以说任何一个类都是Class的实例对象。后面的Field、Constractor、Method三个类都是在java.lang.reflect包下。


在Java中万事万物皆对象。


1.Class类的使用


例如有一个类

public class Food{
    public void print(){
    System.out.println("helloworld");
  }
  public void print(int a,int b){
    System.out.println(a+b);
  }
  public void print(String a,String b){
    System.out.println(a.toUpperCase()+","+b.toLowerCase());
  }
}

我们可以用Class来实例Food对象

//一般的常用方法
Food food = new Food();//food就表示出来了.
//Class类的实例对象,如何表示呢
//任何一个类都是Class的实例对象,这个实例对象有三种表示方式
//第一种表示方式--->实际在告诉我们任何一个类都有一个隐含的静态成员变量class
Class c1 = Food.class;
//第二中表达方式  已经知道该类的对象通过getClass方法
Class c2 = food.getClass();
//第三种表达方式
Class c3 = null;
try {
   c3 = Class.forName("com.smxy.lq.Food");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
   e.printStackTrace();
}
//我们完全可以通过类的类类型创建该类的对象实例
Food food = (Food)c1.newInstance();//需要有无参数的构造方法

2.Field的使用

成员变量也是对象

Field类封装了关于成员变量的操作,通过Class类的 getFields()方法获取的是所有的public的成员变量的信息,getDeclaredFields获取的是该类自己声明的成员变量的信息。

    /**
     * 获取成员变量的信息
     * @param obj
     */
  public static void printFieldMessage(Object obj) {
    Class c = obj.getClass();
    //Field[] fs = c.getFields();
    Field[] fs = c.getDeclaredFields();
    for (Field field : fs) {
      //得到成员变量的类型的类类型
      Class fieldType = field.getType();
      String typeName = fieldType.getName();
      //得到成员变量的名称
      String fieldName = field.getName();
      System.out.println(typeName+" "+fieldName);
    }
  }

3.Constractor的使用


构造函数也是对象


java.lang.reflect.Constructor中封装了构造函数的信息,通过Class类的getConstructors获取所有的public的构造函数,getDeclaredConstructors得到所有的构造函数。

  /**
   * 打印对象的构造函数的信息
   * @param obj
   */
  public static void printConMessage(Object obj) {
    Class c = obj.getClass();
    c.getDeclaredConstructors();
    Constructor[] cs = c.getDeclaredConstructors();
    for (Constructor constructor : cs) {
      System.out.print(constructor.getName()+"(");
      //获取构造函数的参数列表--->得到的是参数列表的类类型
      Class[] paramTypes = constructor.getParameterTypes();
      for (Class class1 : paramTypes) {
        System.out.print(class1.getName()+",");
      }
      System.out.println(")");
    }
  }

4.Method的使用


一个成员方法就是一个Method对象


Method类封装了方法对象,通过Class类的getMethods()方法获取的是所有的public的函数,包括父类继承而来的,getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限。

  /**
   * 打印类的信息(方法信息)
   * @param obj 该对象所属类的信息
   */
  public static void printClassMethodMessage(Object obj){
    //要获取类的信息  首先要获取类的类类型
    Class c = obj.getClass();//传递的是哪个子类的对象  c就是该子类的类类型
    //获取类的名称
    System.out.println("类的名称是:"+c.getName());
    Method[] ms = c.getDeclaredMethods();//c.getDeclaredMethods()
    for(int i = 0; i < ms.length;i++){
      //得到方法的返回值类型的类类型
      Class returnType = ms[i].getReturnType();
      System.out.print(returnType.getName()+" ");
      //得到方法的名称
      System.out.print(ms[i].getName()+"(");
      //获取参数类型--->得到的是参数列表的类型的类类型
      Class[] paramTypes = ms[i].getParameterTypes();
      for (Class class1 : paramTypes) {
        System.out.print(class1.getName()+",");
      }
      System.out.println(")");
    }
  }

利用Method的invoke方法我们可以执行类中的方法。

例如:这样我们就可以执行类中的toString方法。

    // 1.获取方法名称
    String getMethodName = "toString";
    // 2.获取方法对象
    Class c = obj.getClass();
    try {
      // get方法都是public的且无参数
      Method m = c.getMethod(getMethodName);
      // 3 通过方法的反射操作方法
      Object value = m.invoke(obj);
      return value;
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }


相关文章
|
27天前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
19 0
[Java]反射
|
2月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
65 9
Java——反射&枚举
|
1月前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
26 2
|
2月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
1月前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
16 0
|
2月前
|
Java 程序员 编译器
Java的反射技术reflect
Java的反射技术允许程序在运行时动态加载和操作类,基于字节码文件构建中间语言代码,进而生成机器码在JVM上执行,实现了“一次编译,到处运行”。此技术虽需更多运行时间,但广泛应用于Spring框架的持续集成、动态配置及三大特性(IOC、DI、AOP)中,支持企业级应用的迭代升级和灵活配置管理,适用于集群部署与数据同步场景。
|
2月前
|
存储 安全 Java
扫盲java基础-反射(一)
扫盲java基础-反射(一)
|
2月前
|
Java
扫盲java基础-反射(二)
扫盲java基础-反射(二)
|
4月前
|
安全 Java 测试技术
day26:Java零基础 - 反射
【7月更文挑战第26天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
35 5
|
3月前
|
缓存 安全 Java
【Java 第十篇章】反射
Java 反射技术让程序能在运行时动态获取类信息并操作对象,极大提升了灵活性与扩展性。本文将介绍反射的基本概念、原理及应用,包括如何使用 `Class`、`Field`、`Method` 和 `Constructor` 类进行动态操作。此外,还将探讨反射在动态加载、框架开发与代码测试中的应用场景,并提醒开发者注意性能与安全方面的问题,帮助你更合理地运用这一强大工具。
31 0