初识Java反射概念和使用

简介: 初识Java反射概念和使用

前言


  开始正题吧,今天聊一聊反射吧,在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 ---");


结语


  好了,以上就是反射的简单介绍


目录
相关文章
|
5天前
|
存储 安全 Java
Java面试题:深入探索Java内存模型,Java内存模型中的主内存与工作内存的概念,Java内存模型中的happens-before关系,volatile关键字在Java内存模型中的作用
Java面试题:深入探索Java内存模型,Java内存模型中的主内存与工作内存的概念,Java内存模型中的happens-before关系,volatile关键字在Java内存模型中的作用
11 1
|
6天前
|
Java 开发者
【Java探索之旅】初识多态_概念_实现条件
【Java探索之旅】初识多态_概念_实现条件
30 16
|
6天前
|
Java 程序员
【Java探索之旅】继承概念_语法_父类的成员访问
【Java探索之旅】继承概念_语法_父类的成员访问
26 10
|
5天前
|
监控 Java 调度
Java面试题:描述Java线程池的概念、用途及常见的线程池类型。介绍一下Java中的线程池有哪些优缺点
Java面试题:描述Java线程池的概念、用途及常见的线程池类型。介绍一下Java中的线程池有哪些优缺点
18 1
|
7天前
|
Java 程序员 测试技术
解析Java中的反射机制及其应用场景
解析Java中的反射机制及其应用场景
|
5天前
|
Java API
Java面试题:说明Lambda表达式在Java中的应用,以及函数式接口的概念和作用。
Java面试题:说明Lambda表达式在Java中的应用,以及函数式接口的概念和作用。
11 0
|
5天前
|
Java API
Java面试题:解释死锁的概念,给出避免死锁的常见策略。你能给我一个具体的例子吗?
Java面试题:解释死锁的概念,给出避免死锁的常见策略。你能给我一个具体的例子吗?
6 0
|
5天前
|
存储 设计模式 Java
Java面试题:解释代理模式的概念,并举例说明其应用场景。
Java面试题:解释代理模式的概念,并举例说明其应用场景。
6 0
|
5天前
|
druid Java 数据库连接
Java面试题:解释数据库连接池的概念及其作用,讨论常见的连接池实现。
Java面试题:解释数据库连接池的概念及其作用,讨论常见的连接池实现。
12 0
|
5天前
|
消息中间件 Java 中间件
Java面试题:解释分布式事务的概念,讨论常见的分布式事务解决方案。
Java面试题:解释分布式事务的概念,讨论常见的分布式事务解决方案。
10 0