Java_MySwap

来源:互联网 发布:树莓派3b 网络配置 编辑:程序博客网 时间:2024/06/05 03:59
package com.tangguoqiang;import java.lang.reflect.Field;/** * 函数调用的值传递和引用传递 * 反射调用的可访问性 * Java编译器的自动装箱拆箱 * Integer自动装箱的缓存 * @author 唐国强 * */public class MySwap {    public static void main(String args[]) throws Exception{        //Java中的自动装箱,字节码中Intege a = Integer.valueOf(1);        Integer a = 1 , b = 2;        System.out.println("原始值:\na="+a+",b="+b);                swap(a,b);        System.out.println("不使用反射:");        System.out.println("a="+a+",b="+b);        swapByReflect(a,b);        System.out.println("使用反射");        System.out.println("a="+a+",b="+b);                //最终结果修改了Integer的对象缓存值        System.out.println("Integer类1的缓存值为"+Integer.valueOf(1));        System.out.println("Integer类2的缓存值为"+Integer.valueOf(2));    }    /**     * Java的传值     * Java中按值传递意味着,将一个参数传递给另外一个函数时,     * 函数接收到的是原始值的一个副本,因此,不管副本如何变化,     * 对于原始值没有任何影响。     * Java中按引用传递,它传递的是引用副本指向自己的地址,而不是自己的副本。     * @param a     * @param b     */    private static void swap(Integer a , Integer b){        Integer temp;        temp = a;        a = b;        b = temp;    }    /**     * Java的反射     * 私有成员属性不能直接通过反射赋值,f.setAccessible(true);,底层关闭了访问权限的验证机制。     *      * Java的自动装箱和拆箱     * Integer a = 1; JVM会自动装箱成为Integer a = Integer.valueOf(i); 。     * 如果i的值在IntegerCache.low到IntegerCache.high之间,那么就直接从IntegerCache里面去获取。     * 如果i超过了这个范围,那么就会新建一个Integer类型的对象,这个默认值是在-128到127之间。     * @param a     * @param b     * @throws SecurityException      * @throws NoSuchFieldException      */    private static void swapByReflect(Integer i1, Integer i2) {    try {Field field = Integer.class.getDeclaredField("value");field.setAccessible(true);//获取私有成员访问权限Integer temp = new Integer(i1.intValue());//int temp = i1.intValue();使用Integer默认缓存,错误结果field.set(i1, i2.intValue());//发生自动装箱field.set(i2, temp);//如果使用int类型传参会发生自动装箱} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {e.printStackTrace();}    }}

原创粉丝点击