乐趣区

关于javascript:初识Java反射概念和使用

前言
  大家好,瑞雪后的第一天,每个周一的大家都期待这周五的降临。置信很多小伙伴上周末就两件事,赏雪和看 EDG。哈哈 开始正题吧,明天聊一聊反射吧,在 java 中常常应用。

反射
  置信刚接触 Java 的,第一句必定会问什么是反射呢?反射有什么作用呢?为什么应用反射呢?首先反射是 Java 的特色之一,我的项目中 Java 程序在运行的过程中,主动去辨认并创立对应的类,可能动静的调用类的属性、构造方法、类中的办法。一句话形容:在程序中能动静调用不同的类和属性,去执行特定的操作。

  正因为反射可能在运行时动静加载须要的对象,所以很多框架中都应用到了反射。本次为了大家很好的了解反射,将基于反射创建对象、获取反射中的对象、获取类中属性、获取类中的构造方法、获取类中办法几个方面进行介绍,上面开始进入正题。

根底数据筹备
  为了不便演示,创立了一个根底的对象类。并基于他进行本次的介绍。创立的演示类 JueJinUser 如下,蕴含四个属性,别离有 get 和 set 办法,还有 toString 办法,没有创立构造方法,上面会介绍通过反射主动创立的相干反射的办法。

public class JueJinUser {

private Integer id;

private String name;

private String title;

private Integer age;

public Integer getId() {return id;}

public void setId(Integer id) {this.id = id;}

public String getName() {return name;}

public void setName(String name) {this.name = name;}

public String getTitle() {return title;}

public void setTitle(String title) {this.title = title;}

public Integer getAge() {return age;}

public void setAge(Integer age) {this.age = age;}

@Override
public String toString() {
    return "JueJinUser{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", title='" + title + '\'' +
            ", age=" + age +
            '}';
}

}
复制代码
基于反射创建对象
  基于反射创立类对象次要有两种形式:第一种是通过类对象的 newInstance() 办法创建对象,第二种是通过结构器中的 newInstance()办法创建对象。

类对象的 newInstance()办法

  类对象的 newInstance()办法创立办法如下:

   Class class = JueJinUser.class;
   JueJinUser jueJinUseByClass = (JueJinUser) class.newInstance();

复制代码
结构器的 newInstance()办法

    Class jueJinUserClass = JueJinUser.class;
    Constructor constructor = jueJinUserClass.getConstructor();
    JueJinUser jueJinUserByConstructor = (JueJinUser) constructor.newInstance();

复制代码
  须要留神的是,两种创立形式中第一种基于类对象的 newInstance() 的办法只能是无参构造方法,而第二种基于结构器的 newInstance()办法能够有有参构造方法和无参构造方法,比拟灵便。

获取反射中的对象
  获取反射对象的形式有三种,别离是:Class.forName、.class 办法和 getClass() 办法。获取反射中对象的办法大家在我的项目中应用的还是比拟多的,置信大家都不生疏。

Class.forName

Class clzForName = Class.forName("com.example.demo.module.JueJinUser");

复制代码
.class 办法

Class clzForClass =JueJinUserString.class;
    

复制代码
getClass() 办法

JueJinUser JueJinUser = new JueJinUser();
Class clzNewObject = str.getClass();

复制代码
获取类中属性
  通过 getFields 和 getDeclaredFields 的办法,能够获取类中的属性信息,其中 getFields 能够获取类中的私有属性值,而 getDeclaredFields 的办法,获取所有类中的属性信息,然而无奈获取到父类的信息。格局如下:

    Class clz = JueJinUser.class;
    Field[] fields = clz.getFields();
    System.out.println("--- getFields start ---");
    for (Field field : fields) {System.out.println(field.getName());
    }
    System.out.println("--- getFields end ---");


    System.out.println("--- getDeclaredFields start ---");
    Field[] declaredFields = clz.getDeclaredFields();
    for (Field field : declaredFields) {System.out.println(field.getName());
    }
    System.out.println("--- etDeclaredFields end ---");

复制代码
获取类中的构造方法
  通过 getConstructors 和 getDeclaredConstructors 的办法,能够获取类中的构造方法信息,其中 getConstructors 能够获取类中构造方法,而 getDeclaredConstructors 的办法,获取所有类中的构造方法,然而无奈获取到父类的构造方法信息。格局如下:

 System.out.println("--- getConstructors start ---");
    Constructor[] constructors = clz.getConstructors();
    for (Constructor constructor : constructors) {System.out.println(constructor.getName());
    }
    System.out.println("--- getConstructors end ---");

    System.out.println("---getDeclaredConstructors start---");
    Constructor[] declaredConstructors = clz.getDeclaredConstructors();
    for (Constructor constructor : declaredConstructors) {System.out.println(constructor.getName());
    }
    System.out.println("---getDeclaredConstructors end---");

复制代码
获取类中办法
  通过 getMethods 和 getDeclaredMethods 的办法,能够获取类中的构造方法信息,其中 getMethods 能够获取类中构造方法,而 getDeclaredMethods 的办法,获取所有类中的办法,然而无奈获取到父类的办法信息。格局如下:

 System.out.println("--- getMethods start ---");
    Method[] methods = clz.getMethods();
    for (Method method : methods) {System.out.println(method.getName());
    }
    System.out.println("--- getMethods end ---");


    System.out.println("--- getDeclaredMethods start---");
    Method[] declaredMethods = clz.getDeclaredMethods();
    for (Method method : declaredMethods) {System.out.println(method.getName());
    }
    System.out.println("--- getDeclaredMethods end ---");

复制代码
最初
如果你感觉此文对你有一丁点帮忙,点个赞。或者能够退出我的开发交换群:1025263163 互相学习,咱们会有业余的技术答疑解惑

如果你感觉这篇文章对你有点用的话,麻烦请给咱们的开源我的项目点点 star: https://gitee.com/ZhongBangKe… 不胜感激!

退出移动版