Java反射之获取类的相关信息学习笔记(一)

来源:互联网 发布:金蝶软件打不开 编辑:程序博客网 时间:2024/06/16 15:42

  Java反射是Java一个很重要的功能,刚开始学Java的时候学过这东西,当时不是很清楚,很多东西一知半解,现在回过头来看感觉貌似突然豁然开朗,不过还是总结一下比较好,现在记得很清楚,过一段时间不用怕又是忘了。

  好,开写。世间万物皆是对象在Java领域,类也是一种对象,不过称为类对象,反射的主要作用就是动态获取关于类的各种信息,也就是在运行期间获取,在Java中类对象用Class来表示。

  每个类都有类对象,先总结一下获取类对象的方式,一共有三种,一种是通过类名.class来获取类对象,一种是通过类的对象调用getClass()来获取,注意类对象和类的对象是两个完全不同的概念,还有一个是通过指定类的全路径名,调用Class.forName方法,以上三种效果都可以获取一个类对象,具体直接看下图,这里提示一下,当使用Class.forName方法时,编译期间不会去检查这个指定参数对应的类是否存在,在运行期间才会检查,为了严谨期间最好加上try catch来捕获一下,这里只是做个测试就简单写了

  这里写图片描述

  获取一个类的信息,简单来说就是主要获取类的方法,字段,以及构造方法,这些在Java中均有对应,分别是Method类,Field类,Constructor类。一个方法对应一个Method对象,一个类有多个方法就对应一个Method数组,同理,一个字段对应一个Field对象,一个构造方法对应一个Constructor对象,获取类的这些信息的前提是先获取类对象,写了个代码直接获取关于一个类的这三种对象的名字信息,

  这里写图片描述  

  简单解释一下,就是调用一个类对象的getXXX方法来获取之后遍历即可,这里就不贴Student类了,直接看控制台输出即可,这样你就通过反射在仅仅知道类名的情况下获得类的详细信息

  这里写图片描述  

  注意这里调用获取方法和字段的时候加上了Declared这个修饰词,是获取仅存在于当前类的方法以及字段信息,不包括来自父类的,如果去掉这个修饰词,那么就是获取包括从父类继承过来的方法以及字段,这里仅仅对方法做个测试了解一下即可,见下图

  这里写图片描述

  输出的信息是下面这个
  

类class com.fanshe.test.Student的所有方法名称为:getNamesetNamesetSexsetAgegetAgegetSexwaitwaitwaitequalstoStringhashCodegetClassnotifynotifyAll

  接下里是关于方法,一个方法通过反射可以获得的信息包括方法名,方法返回类型以及方法带的所有参数类型,是不是感觉很强大哈哈,获取方法名很简单,获取方法的返回值类型前提是需要先获取方法的返回值类型的Class对象 ,直接上代码
这里写图片描述

  
  关于获取方法参数,首先这里创建一个Person对象,见下面
  

public class Person {    private String first="zhang";    private String last="san";    public void eat(int a1, int b1) {    }    public void drink(float a1, int b1) {    }    public void sleep(int a1, double b1) {    }    public void walk(){    }}

  之后编写一个方法来获取这个类的方法的参数信息,简单来说就是调用Method对象的getParameterTypes方法获取方法参数数组之后遍历调用getName方法拼接字符串即可,直接看下面代码,这里为了简单起见,只获取当前类的方法参数列表信息,当然如果你愿意可以获取包括他父类的方法参数列表信息
  这里写图片描述

  对应的控制台输出为
  这里写图片描述

  利用反射还可以在仅仅知道类名的情况下获取关于这个类的成员变量的名称对应的默认value

  这里先创建一个Phone类,见下面
  

public class Phone {   private String name="小米MIX2";   private int price=3999;   private double safe=99;public String getName() {    return name;}public void setName(String name) {    this.name = name;}public int getPrice() {    return price;}public void setPrice(int price) {    this.price = price;}public Phone() {    super();}}

接下来造轮子,这里编了两个方法,接受的参数分别是普通Object对象和类对象,最终实现的效果都一样,根据实际情况去选择即可,这里只补充说一下,如果在仅仅知道类对象的情况下去创建一个类的对象,可以通过Class.forName(“xxx”).newInstance方法来创建一个类的对象,这类newInstance方法实际是调用了类的无参构造函数去创建对象,如果指定的类没有这个构造方法就会报错,这里注意一下。直接上代码。。见下图

  这里写图片描述

  对应的控制台输出见下
  这里写图片描述

  上面这些只不过整理总结了一些常见的Java反射的可能用到的场景,还有一些东西没写上,不过都是大同小异罢了,先写这些以后有机会再补充好了,睡觉。。。。明天回家

  以上。