通过一个实例让你快速学习java反射

来源:互联网 发布:python 日志文件 编辑:程序博客网 时间:2024/06/03 20:48

什么是反射?

反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是:如果使用不当,反射的成本很高。

通俗的讲就是反射可以在运行时根据指定的类名获得类的信息。

    也许你看完java反射的解释之后还是一头雾水,不要急,我们通过一个实例来让你了解java反射的作用,实践才是检验真理的唯一标准。

    首先我们需要知道java反射大部分是需要Class这个类来完成,这里我给出经常使用的Class的方法,想了解更多的可以去查看jdk Api。



     通过类的全限定名来获取类的信息,还原该类的字段和方法等声明和定义。

     测试需要的类

package com.zhu.test;class Animal{}interface A{}interface B{}public class Dog extends Animal implements A,B{private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

public static void main(String[] args) throws ClassNotFoundException {      StringBuffer sb=new StringBuffer();            //-------------------获取类信息------------------------------------------      Class c=Class.forName("com.zhu.test.Dog");      //通过Modifier的toString方法获取类的修饰符      String modifier=Modifier.toString(c.getModifiers());      sb.append(modifier+" class");      sb.append(" "+c.getSimpleName());    //获取该类继承的类      Class superClass=c.getSuperclass();      c.getGenericSuperclass();      //判断该类是否有父类(除了Object)      if(!superClass.getSimpleName().equals("Object")){      sb.append(" extends "+superClass.getSimpleName());      }      //获取该类实现的接口      Class[] interfaces=c.getInterfaces();      if(interfaces!=null){      sb.append(" implements ");      for(int i=0;i<interfaces.length;i++){      Class cl=interfaces[i];     sb.append( cl.getSimpleName());     if(i!=interfaces.length-1){     sb.append(",");     }      }      }      sb.append("{\n");                  //-------------------获取字段信息------------------------------------------      Field[] fields=c.getDeclaredFields();      for(Field field:fields){      String s=Modifier.toString(field.getModifiers());      sb.append(s);      sb.append(" ");      String fieldType=field.getType().getSimpleName();      sb.append(fieldType);      sb.append(" ");      String fieldName=field.getName();      sb.append(fieldName);      sb.append("\n");      }                        //-------------------获取方法信息------------------------------------------      Method [] methods=c.getDeclaredMethods();      for(Method m:methods){      //获取方法修饰符      String methodModifier=Modifier.toString(m.getModifiers());      sb.append(methodModifier);      sb.append(" ");      //获取方法返回值      String returnType=m.getReturnType().getSimpleName();      sb.append(returnType);      sb.append(" ");      sb.append(m.getName());      sb.append("(");            //获取方法参数信息      Class[]params=m.getParameterTypes();      for(int i=0;i<params.length;i++){      Class clas=params[i];     sb.append(clas.getSimpleName());     sb.append(" ");     sb.append("arg"+i);     if(i!=params.length-1){     sb.append(",");     }      }      sb.append(");");      sb.append("\n");      }            sb.append("}");      System.out.println(sb.toString());          }

输出结果

由此可看出java反射的强大。