如何使用和理解java的反射机制

  先说下反射机制的概念:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

  那么我们再来说下反射机制实现需要用到的类,总共有四大类:Class,Constructor,Method,Field。

  其实实现反射需要如下几个步骤:

  1.获取Class类

  2.通过Class创建对象

  3.获取类中的方法

  4.获取类中的属性,属性值或类型

  首先来说一下获取Class的三种方法

public static void main(String[] args) {
        //第一种方式 通过对象获取Class
        Student student = new Student();
        Class sc=student.getClass();
    }
public static void main(String[] args) {
        //第二种方式 直接通过类名获取
        Class sc2=Student.class;
  }
//第三种方式  通过类的全称获取(使用forName方法)
        Class sc3=Class.forName("com.java.Student");  //其实就是这个类所在的包的路径

  接下来通过Instance方法实例化对象

        //使用newInstance方法来创建实例对象。
        Student s1=(Student)sc.newInstance();     //这里需要强转一下,因为创建出来的的对象是Object类型的

  最后就是通过创建Field对象和Method对象来获取属性和方法(这里如果想要实现动态输入必须要使set方法的setAccessible方法为true

     Field f1=s1.getClass().getDeclaredField("name");   //获取方法中的name属性        
        Method getm1=s1.getClass().getDeclaredMethod("getName", new Class[]{}); //获取getname方法  这里的getName是可以修改成你想获取的方法
        Method setm1=s1.getClass().getDeclaredMethod("setName", new Class[]{f1.getType()});//这里的fi.getType是为了获取setName输入时的类型
        setm1.setAccessible(true);                //设置setm1是可访问的
        setm1.invoke(s1, "abc");                //通过setm1输入值
        System.out.println(getm1.invoke(s1, null));     //通过getm1获取值

这段代码是可以获取到你所输入的值,如果只是想要获取属性或方法的名字只需要前两行!

上面介绍的是获取单一属性方法的办法,

也可以获取整个类的所有属性和方法如下代码所示:

  Field []f = s1.getClass().getDeclaredFields();//获取方法中所有的属性
        for(Field inputf :f){                        //输出所有的属性
            System.out.println(inputf);
        }
        
   Method[] allmethod = s1.getClass().getDeclaredMethods();//获取类中所有的方法
        for(Method inputm : allmethod){                            //输出所有的方法
            System.out.println(inputm);
        }

这就是使用反射机制的具体步骤。

最后总结如下:

我们通过整体代码可以知道,我们是可以通过用户的输入来调取某个类的某个方法或属性,或是获取某个类的所有方法或属性,这也就对应了解到了开头我们所说的反射的概念:动态获取信息以及动态调用对象方法的功能称为java语言的反射机制

原文地址:https://www.cnblogs.com/XiaojianGo/p/7476124.html