zoukankan      html  css  js  c++  java
  • 如何使用和理解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语言的反射机制

  • 相关阅读:
    [转]c#匿名类
    MVC中的验证码
    js常用方法
    centos6.x一直停留在进度条的问题
    使用linux flock文件锁实现任务锁定避免计划任务程序冲突
    nginx访问日志的几个统计命令
    centos安装tidy扩展
    用alert打印js对象
    laravel中的管道设计模式
    CentOS查看每个进程的网络流量
  • 原文地址:https://www.cnblogs.com/XiaojianGo/p/7476124.html
Copyright © 2011-2022 走看看