Java值传递(swap失效原因)

Java值传递与对象引用
本文探讨了Java中值传递的特性,通过一个swap的例子展示了当交换对象引用时,原始对象值不变的原因。同时,解释了为何修改对象的属性会直接影响到原始引用的原因。

JAVA值传递:JAVA方法传递的是调用者提供的一份copy的值。

在对对象进行swap的时候,我们可以发现,两对象修改后的值还是原来的值如下

Public static void main(String[] args){

       Student target1 = new Student ("张伟",23);

       Student target2 = new Student ("吴天",24);

       swap(target1,target2);

       System.out.println(target1+":"+target2);//输出后,仍然target1的name和age还是张伟23;target2的name和age还是吴天24

}

public void swap(Student s1,Student s2){

       Student s3 = new Student();

       s3 = s1;

       s1 = s2;

       s2 = s3;

}起初swap实线调用

Swap实际只是把s1和s2断开并交换(如虚线)

 


可是,为什么如果我调用s2的引用的属性,做改变时,target1的属性引用也会改变呢。原因如下:

Public static void main(String[] args){

       Student target1 = new Student ("张伟",23);

       Student target2 = new Student ("吴天",24);

       swapII(target1,target2);

       System.out.println(target1+":"+target2);//输出后,仍然target1的name和age还是张伟23;target2的name和age还是吴天24

}

public void swapII(Student s1,Student s2){

       Student s3 = new Student();

       s3 = s1;

       s1.setAge (s2.getAge);

       s2.setAge(s3.getAge);

}

SwapII实际只是把末端tartget1(copy)和tartget2(copy)的age引用给互调互调了。由于这是target1和target2引用的各自new Student()的地址,所以,改变引用对象内属性的引用的时候也会影响到,调用target1和target2所new出来对象的调用者。

 

 

 

 

 

<think>嗯,用户问的是IntelliJ IDEA热部署失效的解决方法。这个问题很典型,很多开发者都遇到过。从用户语气看,ta可能已经尝试过一些方法但没解决,有点着急。 用户提供的引用资料很有价值,主要集中在五个方面:热部署原理(仅在debug模式生效)、spring-boot-devtools依赖配置、maven插件配置、新版本IDEA的特殊设置、以及JRebel插件方案。需要把这些零散信息整合成系统解决方案。 热部署失效的核心矛盾点在于:IDEA的自动编译机制和Spring Boot的热加载机制需要协同工作。用户可能忽略了以下关键点: 1. 基础设置:比如没开自动编译,或者错误使用了run模式而非debug模式 2. 依赖冲突:某些库会覆盖devtools的类加载器 3. 新版本特性:2020.3之后IDEA改了热交换机制 应该按排查难度分阶梯解决: 第一梯队是立即见效的(检查debug模式/自动编译) 第二梯队是配置层面的(devtools依赖和maven插件) 第三梯队是深层次问题(缓存/冲突/新版本适配) 特别要注意引用[3]和[4]提到的<fork>true配置,这是很多教程遗漏的关键点。对于新版本IDEA,还要关注引用[1]强调的Build Project自动编译替代方案。 用户可能是Java后端开发者,正在开发Spring Boot项目。ta没提具体IDEA版本,但根据引用[5]提到的JRebel版本限制,推测可能在使用较新版本IDEA。可以准备版本适配说明。 最后要考虑用户可能的操作失误点:比如修改了方法签名或配置文件,这些情况热部署本身就不支持,需要明确说明边界条件。</think>以下是解决IntelliJ IDEA热部署失效的完整方案,结合官方文档和常见实践整理: ### 一、核心原理 1. **热部署依赖两个机制**: - IDEA的**自动编译**(仅Debug模式生效) - Spring Boot的**类加载隔离**(通过`spring-boot-devtools`实现) 2. **热部署限制**: - 仅支持方法体内的代码修改 - 不生效场景:增删类/方法/字段、修改配置文件等[^1][^3] --- ### 二、必做基础配置 #### 步骤1:启用IDEA自动编译 ```markdown [File] → [Settings] → [Build,Execution,Deployment] → [Compiler]: ✅ Build project automatically ✅ Compile independent modules in parallel ``` ![](https://example.com/auto-compile-setting.png) *图:IDEA自动编译设置[^1]* #### 步骤2:开启运行时热交换 ```markdown [Settings] → [Advanced Settings] → ✅ Allow auto-make to start even if developed application is running ``` > ⚠️ 此选项在2020.3+版本中更名为 **"Build project automatically" 需与步骤1同时开启**[^1] #### 步骤3:强制使用Debug模式启动 ```markdown [Run] → [Edit Configurations] → ✅ 选择目标配置 → 右上角切换为"Debug"图标启动 ``` > 原理:热部署仅在Debug模式激活JVM的HotSwap机制[^1][^3] --- ### 三、Spring Boot专项配置 #### 1. 添加devtools依赖 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> <!-- 防止依赖传递 --> </dependency> ``` [^2][^3] #### 2. 关键Maven插件配置 ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> <!-- 强制启用独立进程 --> <addResources>true</addResources> <!-- 资源文件热加载 --> </configuration> </plugin> </plugins> </build> ``` [^3][^4] --- ### 四、高级问题排查 | 现象 | 解决方案 | |---------------------|----------------------------| | 修改后无自动编译 | 按`Ctrl+F9`手动触发编译 | | 静态资源未更新 | 清除浏览器缓存或`Ctrl+Shift+R`强制刷新 | | Lombok失效 | 安装`Lombok`插件并启用`Enable annotation processing` | | 新版本IDEA不生效 | 改用`Ctrl+Shift+F9`重新编译当前文件 | --- ### 五、替代方案:JRebel插件 当官方热部署不稳定时推荐: 1. 安装插件:`Plugins` → 搜索`JRebel`安装 2. 激活(社区方案): ```markdown Team URL: https://jrebel.qekang.com/ + GUID ``` [G生成器](https://www.guidgen.com/) 3. 启动:点击🟢**JRebel按钮**代替Debug按钮[^5] > 💡 实测数据:JRebel可使重载速度提升5-8倍,但需注意版本兼容性(2022.4.2+需特殊配置) --- ### 六、终极检测清单 1. ✅ 使用**Debug模式**启动 2. ✅ `spring-boot-devtools`依赖存在且未冲突 3. ✅ IDEA的**自动编译**已开启 4. ✅ Maven插件中`<fork>true</fork>` 5. ✅ 未修改类/方法签名等不支持热部署的结构 > 若仍失效,尝试删除`target`目录后重启IDEA,并检查是否有多个JVM进程残留需手动结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值