Java教程

java 反射命令

本文主要是介绍java 反射命令,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、关于获取Class对象的三种方式:

  1、 Student student = new Student();

    Class studentClass1 = student.getClass();

  2、 Class studentClass2 = Student.class;

  3、 Class.forName(“cn.hnist.Student”);

ps:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,无论通过哪种方式获取的Class对象都是同一个;

 

二、关于获取类信息的方式:

  1、获取该类构造器:

   (1) getDeclaredConstructors(),返回所有构造方法

   (2) getConstructors(),返回所有public构造方法

   (3) getConstructor(Class<?>... parameterTypes),返回指定public构造方法

    例:

    Constructor con0 = studentClass.getConstructor(null);

    Constructor con1 = studentClass.getConstructor(boolean.class, String.class);

    System.out.println(con0);

    System.out.println(con1);

    // 输出

    //public cn.hnist.Student()

    //public cn.hnist.Student(boolean, java.lang.String)

   (4) getDeclaredConstructor(Class<?>... parameterTypes),返回指定构造方法

 

  2、根据构造器创建对象:

    con1.setAccessible(true);

    // 假如构造器con1是private私有的,就用此方法解除私有限定

    Object object = con1.newInstance(true, “张三”);

    // 相当于new Student(true, “张三”);

 

  3、获取该类成员变量:

    (1) Field[] f = studentClass.getFields(),获取所有public成员变量

    (2) Field[] f = studentClass.getDeclaredFields(),获取所有成员变量

    (3) Field f = studentClass.getField(“name”),获取指定public成员变量

    (4) Field f = studentClass.getDeclaredField(“name”),获取指定成员变量

 

ps:给字段设置具体的值

Class studentClass = Class.forName(“cn.hnist.Student”);

Object object = studentClass.getConstructor().newInstance();

Field field = studentClass.getField(“name”);

field.set(object, “李四”);

 

  4、获取该类方法:

    (1) Method[] methods = studentClass.getMethods(),返回所有public方法

    (2) Method[] methods = studentClass.getDeclaredMethods(),返回所有方法

    (3) Method method = studentClass.getMethod(“getName”, new Class[]{boolean.class, String.class}),返回指定public方法(参数:指定方法名,方法名的参数类型列表(没有参数用null表示))

    (4) Method method = studentClass.getDeclaredMethod(“getName”, String.class),返回指定方法(参数:指定方法名,方法名的参数类型)

 

  5、执行该类方法:

    Object obj = studentClass.getConstructor().newInstance();

    Object result= method.invoke(obj, “王五”);

    // invoke参数1:要调用的对象;参数2:调用的方法要求的参数值

 

三、获取该方法的参数泛型和返回泛型:

  //获取该类方法

  Method method = Test1.class.getMethod(“test01”, Map.class, List.class);

  //获取该方法的参数集合

  Type[] genericParameterTypes = method.getGenericParameterTypes();

  //遍历该参数集合

  for (Type genericParameterType : genericParameterTypes){

    System.out.println(“#”+genericParameterType);

    // 判断

    if (genericParameterType instanceof ParameterizedType){

      Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();

      for(Type actualTypeArgument : actualTypeArguments){

        System.out.println(actualTypeArgument);

      }

    }

  }

 

  method = Test1.class.getMethod(“test02”, null);

  Type genericReturnType = method.getGenericReturnType();

  if (genericReturnType instanceof ParameterizedType){

    Type[] actualTypeArguments = ((ParameterizedType) genericReturnType ).getActualTypeArguments();

    for(Type actualTypeArgument : actualTypeArguments){

      System.out.println(actualTypeArgument);

    }

  }

 

执行结果:

 

 

这篇关于java 反射命令的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!