一道编程题目

news/2024/5/19 4:01:07 标签: java, 值传递, reflect, 反射

昨天在微信群看到有人在讨论一个问题,
具体题目如下:
入参两个Intger,返回空,然后使这个两个值在调用函数后交换。打印交换后的值,比如你初始化两个变量a和b对应的值分别是3,4那么通过调用方法,传入这两个参数,然后再次打印,a和b的值应该就是4和3而不在是3,4.
在Java中我们都知道是值传递,所以刚看到题目时,你可能觉得没有值返回,怎么可以实现?其实我们可以利用反射的思想来进行修改对象的值,最后再打印对象的值。
具体的实现如下:

import java.lang.reflect.Field;

public class SwapTwoNumber {

	public static void main(String[] args) {
		Integer num1 = 3;
		Integer num2 = 4;
		System.out.println("交换前:");
		System.out.println("num1 = :" + num1 + " ===== " + "num2 = : "+ num2);
		swapTwoIntegerNoReturn(num1,num2);
		System.out.println("交换后:");
		System.out.println("num1 = :" + num1 + " ===== " + "num2 = : "+ num2);
	}

	/**
	 * 入参两个Intger,返回空,然后使这个两个值在调用函数后交换
	 * @param num1
	 * @param num2
	 */
	private static void swapTwoIntegerNoReturn(Integer num1, Integer num2) {
		try {
			//通过反射获取Integer对象中的私有域value
			Field field = Integer.class.getDeclaredField("value");
			field.setAccessible(true);
			int temp = num1.intValue();
			//调用set(obj,value)方法,obj表示要修改的对象,value 表示要给修改对象赋予的值
			field.set(num1, num2);
			field.set(num2, new Integer(temp));
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}

}

关于上述代码中我和需要使用value属性和set方法,你可以看看源码。
Integer的源码中有这样一段代码:


    /**
     * The value of the {@code Integer}.
     *
     * @serial
     */
    private final int value;

此处的私有域value表示的应该是Integer对象的值,所以需要使用value属性。
再看一下package java.lang.reflect.Field类中的set方法:

/**
     * Sets the field represented by this {@code Field} object on the
     * specified object argument to the specified new value. The new
     * value is automatically unwrapped if the underlying field has a
     * primitive type.
     * @param obj the object whose field should be modified
     * @param value the new value for the field of {@code obj}
     * being modified
     */
    @CallerSensitive
    public void set(Object obj, Object value)
        throws IllegalArgumentException, IllegalAccessException
    {
        if (!override) {
            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
                checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
            }
        }
        getFieldAccessor(obj).set(obj, value);
    }

通过上面的部分源码,我们可以参数来set方法的第一个参数obj代表对象需要修改的域。value表示需要修改的域的新值来替换原有的值。

在这里插入图片描述


http://www.niftyadmin.cn/n/749157.html

相关文章

[ASP.NET Core 3框架揭秘] Options[3]: Options模型[上篇]

通过前面演示的几个实例(配置选项的正确使用方式[上篇]、配置选项的正确使用方式[下篇]),我们已经对基于Options的编程方式有了一定程度的了解,下面从设计的角度介绍Options模型。我们演示的实例已经涉及Options模型的3个重要的接…

replace null or blank with 0 用空或者null来被0替换

在开发中遇到一个问题,在mysql中字段都为varchar型,但是有的没有值查出来是NULL,有的查出来是空。 先来看一下mysql中的NULL和empty String的区别: 1.A NULL value represents the absence of a value for a record in a field (…

rabbitmq系列(一)初识rabbitmq

为什么要使用消息中间件 无广告小说网 m.amini.net 案例:假如我们开发了一个商品抢购网站。这个网站的目的就是在某一时间点进行抢购商品,同时要求用户注册,在注册的时候会同时给用户电话和邮箱中发送验证码,以便完成信息注册。传…

Java Equals方法

Object类中有一个equals方法,该方法是用来检测两个对象是否相等,在Object类中,该方法的实现是对比两个对象的引用是否相等,而非对比内容是否相等,具体的实现如下: public boolean equals(Object obj) {retu…

.Net Core - AgileHttp

2020年新年将至,先预祝.Net Core越来越好。 做了这么多年一线开发,经常跟Http打交道。比如调用三方的Webservice,比如集成微信支付的时候服务端发起Prepay支付。特别是现在分布式、微服务大行其道,服务间通讯都离不开http调用。 多…

Java字符串String类学习笔记1

今天来学习一下String类的源码&#xff0c;首先看一下String类&#xff0c; public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence从String类的定义我们可以看出&#xff0c;该类是final修饰的不可变的类&#xff0c;它实现了序…

Vmware EXSI安装Unbuntu系统

1、上传镜像 2、创建虚拟机

Ceph日常运维管理和排错 -- lt;7gt;

Ceph日常运维管理 无弹窗小说网 m.amini.net 集群监控管理 集群整体运行状态 [rootcephnode01 ~]# ceph -s cluster:id: 8230a918-a0de-4784-9ab8-cd2a2b8671d0health: HEALTH_WARNapplication not enabled on 1 pool(s)services:mon: 3 daemons, quorum cephnode01,ce…