反射调用成员 | 带你学《Java语言高级特性》之八十七

简介: 本节需要了解反射调用成员的几种操作方法,熟练掌握Field类中获取成员类型的方法。了解反射与类的操作。

上一篇:反射调用方法 | 带你学《Java语言高级特性》之八十六
【本节目标】
本节需要了解反射调用成员的几种操作方法,熟练掌握Field类中获取成员类型的方法。了解反射与类的操作。

反射调用成员

类结构中的最后一个核心的组成就是成员(Field),大部分情况下都会将其称为成员属性,对于成员信息的获取也是通过Class类完成,在这个类中提供了如下两组操作方法:
获取本类全部成员:
public Field[] getDeclaredFields() throws SecurityException
获取本类指定成员:
public Field getDeclaredField​(String name) throws NoSuchFieldException, SecurityException
获取父类全部成员:public Field[] getFields() throws SecurityException
获取父类指定成员:public Field getField​(String name) throws NoSuchFieldException, SecurityException

范例:修改要操作的父类:
AbstractBase:

public abstract class AbstractBase {
    protected static final String BASE = "www.mldn.cn";
    private String info = "HELLO MLDN";
    public AbstractBase() {}
    public AbstractBase(String msg) {}
}

IChannelService:

public interface IChannelService {
    public static final String NAME = "mldnjava";
    public boolean connect();
}

范例:获取类中的成员

import java.lang.reflect.Field;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("cn.mldn.vo.Person");
        {    // 获取父类之中公共成员信息
             Field fields [] = cls.getFields();  //获取成员
             for (Field fie : fields) {
                System.out.println(fie);
             }
        }
        System.out.println("---------番茄酱与辣椒酱的分割线-------------");
        {  //获取子类中定义的成员
            Field fields [] = cls.getDeclaredFields();
            for (Field fie : fields){
                System.out.println(fie);
            }
        }
    }
}

执行结果:
image.png

但是在Field类中最为重要的操作形式并不是获取全部成员,而是如下三个方法:
设置属性内容:
public void set​(Object obj, Object value) throws IllegalArgumentException, IllegalAccessException
获取属性内容:
public Object get​(Object obj) throws IllegalArgumentException, IllegalAccessException
解除封装:
public void setAccessible(boolean flag)
所有成员是在对象实例化后进行空间分配的,所以此时一定要先有实例化对象后才可以进行成员的操作。

范例:直接调用Person类中的name私有成员

import java.lang.reflect.Field;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("cn.mldn.vo.Person");
        Object obj = cls.getConstructor().newInstance();  //实例化对象(分配成员空间)
        Field nameField = cls.getDeclaredField("name");  //获取成员对象
        nameField.setAccessible(true);  //对私有属性必须先解除封装,
        nameField.set(obj,"番茄强");  //等价于:Person对象.name = "番茄强"
        System.out.println(nameField.get(obj));
    }
}

通过一系列的分析可以发现,类中的构造、方法、成员属性都可以通过反射实现调用,但是对于成员的反射很少这样直接处理,大部分操作都应该setter和getter处理,所以对于以上的代码只能够说是反射的特色,但是不具备实际的使用能力,而对于Field类在实际开发中只有一个方法最为常用:
获取成员类型:
public Class<?> getType()
范例:获取Person类中name成员的类型

import java.lang.reflect.Field;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("cn.mldn.vo.Person");
        Field nameField = cls.getDeclaredField("name");
        System.out.println(nameField.getType().getName());  //获取完整的名称,包.类 java.lang.String
        System.out.println(nameField.getType().getSimpleName());  // 获取类名称 String
    }
}

在以后开发中进行反射处理的时候,往往会利用Field类和Method类实现类中的setter方法的调用。

image.png
反射与类操作

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:Unsafe工具类 | 带你学《Java语言高级特性》之八十八
更多Java面向对象编程文章查看此处

相关文章
|
9月前
|
JSON Java API
【干货满满】分享京东API接口到手价,用Java语言实现
本示例使用 Java 调用京东开放平台商品价格及优惠信息 API,通过商品详情和促销接口获取到手价(含优惠券、满减等),包含签名生成、HTTP 请求及响应解析逻辑,适用于比价工具、电商系统集成等场景。
|
7月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
447 18
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
406 5
|
7月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
284 4
|
8月前
|
存储 Java Apache
Java语言操作INI配置文件策略
以上步骤展示了基本策略,在实际项目中可能需要根据具体需求进行调整优化。例如,在多线程环境中操作同一份配置时需要考虑线程安全问题;大型项目可能还需考虑性能问题等等。
319 15
|
10月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
436 14
|
9月前
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
634 0
|
9月前
|
JSON Java API
【干货满满】分享拼多多API接口到手价,用Java语言实现
本方案基于 Java 实现调用拼多多开放平台商品详情 API,通过联盟接口获取商品到手价(含拼团折扣与优惠券),包含签名生成、HTTP 请求及响应解析逻辑,适用于电商比价、导购系统集成。
|
9月前
|
JSON Java API
【干货满满】分享淘宝API接口到手价,用Java语言实现
本文介绍了如何使用 Java 调用淘宝开放平台 API 获取商品到手价,涵盖依赖配置、签名生成、HTTP 请求与响应解析等核心实现步骤。
|
11月前
|
Java 编译器 应用服务中间件
为什么说 Java 语言编译与解释并存的原因
在编程语言的世界里,Java以其独特的“编译与解释并存”特性独树一帜。这一特性不仅赋予了Java强大的跨平台能力,还使其在性能和灵活性上达到了很好的平衡。接下来,我们将深入探讨Java语言这一特性的本质、原理以及在实际应用中的体现。
297 6