精华内容
下载资源
问答
  • Java 通过反射修改类的常量值、静态变量值、属性值

    实体对象

    @Data
    @AllArgsConstructor
    public class Entity {
        // 常量
        public static final Integer MODEL_NAME = 1024;
    
        // 静态变量
        public static int nums = 100;
    
        // 属性值
        private String name;
    }
    

     

    测试案例

    public class AnswerApp {
    	public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {
            System.out.println("修改前...");
            System.out.println(Entity.MODEL_NAME);
            System.out.println(Entity.nums);
            Entity entity = new Entity("Answer");
            System.out.println(entity.getName());
            System.out.println();
    
            Field[] fields = Entity.class.getDeclaredFields();
            for (Field field : fields) {
                // 通过反射修改常量值
                if ("MODEL_NAME".equals(field.getName())) {
                    Field modifiers = Field.class.getDeclaredField("modifiers");
                    modifiers.setAccessible(true);
                    modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
                    field.set(null, 520);
                }
    
                // 通过反射修改静态变量值
                else if ("nums".equals(field.getName())) {
                    field.set(null, 98);
                }
    
                // 通过反射修改对象属性值
                else if ("name".equals(field.getName())) {
                    field.setAccessible(true);
                    field.set(entity, "AnswerAIL");
                }
    
                else {
                    System.out.println(field.getName());
                }
             }
    
            System.out.println("修改后...");
            System.out.println(Entity.MODEL_NAME);
            System.out.println(Entity.nums);
            System.out.println(entity.getName());
        }
    }
    

     

    程序运行结果

    修改前...
    1024
    100
    Answer
    
    修改后...
    520
    98
    AnswerAIL
    
    展开全文
  • 在jetty debug模式下修改static静态变量值不会重新Load因为jetty是嵌入式web容器,static静态变量是全局的,如果想生效,就必须重启jetty在热部署的时候tomcat会重启服务器 jetty则不然...

    在jetty debug模式下修改static静态变量值不会重新Load

    因为jetty是嵌入式web容器,static静态变量是全局的,如果想生效,就必须重启jetty

    在热部署的时候tomcat会重启服务器 jetty则不然
    展开全文
  • 有的时候,我们需要修改一个变量,但变量也许存在于 Jar 包中或其他位置,导致我们不能从代码层面进行修改,于是我们就用到了下面的场景,通过反射来进行修改变量。 定义一个实体类 class Bean{ ...

    前言

    有的时候,我们需要修改一个变量的值,但变量也许存在于 Jar 包中或其他位置,导致我们不能从代码层面进行修改,于是我们就用到了下面的场景,通过反射来进行修改变量的值。

    定义一个实体类

    class Bean{  
        private static final Integer INT_VALUE = 100;  
    }  
    

    利用反射修改私有静态常量方法

    System.out.println(Bean.INT_VALUE);  
    Field field = Bean.class.getField("INT_VALUE");  
    //将字段的访问权限设为true:即去除private修饰符的影响  
    field.setAccessible(true);  
    //去除final修饰符的影响,将字段设为可修改的 
    Field modifiersField = Field.class.getDeclaredField("modifiers");  
    modifiersField.setAccessible(true);  
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);  
    //把字段值设为200  
    field.set(null, 200);  
    System.out.println(Bean.INT_VALUE);  
    

    修改私有静态常量测试结果

    100
    200
    

    看到测试结果说明我们的反射修改成功了。

    利用反射修改共有静态变量方法

    class Bean{  
        public static int nums = 100;
    }  
    
    
     

    System.out.println(Bean.nums);
    Field field = Bean.class.getField("nums");
    field.set(null, 200);
    System.out.println(Bean.INT_VALUE);

    
     

    测试结果修改成功。

    100
    200
    

    奇怪的地方

    注意到上述代码的中的静态常量类型是Integer,但是我们项目中实际需要修改的字段类型并不是包装类型Integer,而是java的基本类型int。
    当把常量的类型改成int之后。

    class Bean{  
        private static final int INT_VALUE = 100;//把类型由Integer改成了int  
    }
    

    在其他代码都不变的情况下,代码输出的结果竟然变成了诡异的:

    100
    100
    

    而且在调试的过程中发现,在第二次输出的时候,内存中的Bean.INT_VALUE是已经变成了200,但是System.out.println(Bean.INT_VALUE)输出的结果却依然时诡异的100?!
    是反射失效了吗?
    又试了其他几种类型,发现这种貌似失效的情会发生在int、long、boolean以及String这些基本类型上,而如果把类型改成Integer、Long、Boolean这种包装类型,或者其他诸如Date、Object都不会出现失效的情况。

    奇怪的原因

    对于基本类型的静态常量,JAVA在编译的时候就会把代码中对此常量中引用的地方替换成相应常量值。
    参考:Modifying final fields in Java
    即对于常量 public static final int maxFormatRecordsIndex = 100

    if( index > maxFormatRecordsIndex   ){  
        index  =  maxFormatRecordsIndex ;  
    }  
    

    这段代码在编译的时候已经被java自动优化成这样的:
    if( index > 100){
    index = 100;
    }
    所以在INT_VALUE是int类型的时候。

    System.out.println(Bean.INT_VALUE);  
    

    编译时会被优化成下面这样:
    System.out.println(100);
    所以,自然,无论怎么修改Boolean.INT_VALUE,System.out.println(Bean.INT_VALUE)都还是会依然固执地输出100了。
    这本身是JVM的优化代码提高运行效率的一个行为,但是就会导致我们在用反射改变此常量值时出现类似不生效的错觉。

     

    展开全文
  • <?php class Test{ public static $static_var = 20; } echo Test::$static_var;exit;  
    <?php
    class Test{
        public static $static_var = 20;
    }
    echo  Test::$static_var;exit;

     

    展开全文
  • 在springboot项目中,经常会将controller层、...前面简单说了一下项目之间的引用,接下来要说下如何实现多环境的配置信息作为静态变量在项目之间的注入,对于application.properties在多环境下的配置可以参照 此文htt
  • androidManifest中指定不同的进程,application中静态变量值问题,每次onCreate , hasDataServerInit 值都为fasle,估计原因是每次都是在不同的虚拟机中,而不同的虚拟机中静态变量也不是共享的
  • springboot引用静态资源static中变量常用方法,经常用到的是非静态变量,在需求类方法中引入比较容易配置,当遇到静态变量时常出现错误,本文档为手动操作样例与结构展示
  • 静态变量与非静态变量获取配置文件application中变量值的区别 在项目配置文件application.yml或者application.properties中添加两个变量并赋值 value: 127.0.0.1:8081 staticvalue: 127.0.0.1:8081 在controller...
  • SpringBoot使用@Value给静态变量注入

    万次阅读 多人点赞 2018-07-17 21:34:52
    SpringBoot中使用@Value()只能给普通变量注入,不能直接给静态变量赋值 例如,application-dev.properties 配置文件有如下配置: 给普通变量赋值时,直接在变量声明之上添加@Value()注解即可,如下所示: ...
  • 如果是非静态变量,field.get(obj),obj必须是当前类的实例对象,返回实例对象obj的变量值。 2.field是一个静态变量时,field.set(null,string)会修改当前类中该静态变量的值为string; field是非静态变量,则需要...
  • 下面小编就为大家带来一篇利用反射获取Java类中的静态变量名及变量值的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 利用反射获取Java类中的静态变量名及变量值. JAVA可以通过反射获取成员变量和静态变量的名称,局部变量就不太可能拿到了
  • static关键字修饰的变量是静态变量 使用类名.变量直接访问 当虚拟机启动时即加载变量到内存中不需要创建对象 static关键字修饰的方法是静态方法 使用类名.方法直接访问 静态方法中不能访问成员变量 类变量(静态变量...
  • 在调试Windows程序时,发现局部静态变量并没给初始。通过调试并且查询资料,得知 1、除了静态变量外,所有局部变量没有缺省; 2、静态
  • 相同点 定义在静态变量区,生命周期都与进程相同 不同点 全局静态变量可以被整个...局部静态变量只能在被定义的函数内调用,并且第二次调用该函数时,静态变量为上次被调用最后的,不为重新定义初始化的。 ...
  • 静态变量的初始为0。4.当多次调用一个函数且要求在调用之间保留某些变量的时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。...
  • Spring无法直接给静态变量注入,因为静态变量不属于对象,只属于类,也就是说在类被加载字节码的时候变量已经初始化了,也就是给该变量分配内存了,导致spring忽略静态变量。所以如下这种写法就是错误的,这样是...
  • springboot 给静态变量赋值/给静态方法注入springboot常规注入方法 @Valuespringboot无法通过@Value给静态变量赋值springboot也可通过@PostConstruct给静态变量赋值 springboot常规注入方法 @Value 同时生成...
  • 1局部变量,全局变量 局部变量,作用域从定义位置开始,到代码块结束。 全局变量,定义在类中,方法外的变量叫做全局变量。全局变量所有方法均能够访问。 ------(自我理解)-----局部...类变量(静态变量):定...
  • 一个程序里面有静态变量,我想执行好几遍该程序,每次的变量值都从外面获取,我的静态变量应该写成什么样? 是不是不能用静态的了?
  • @Component public class ProxyUtils { public static String PROXY_HOST; public static String PROXY_SECRET; public static String PROXY_OA_SERVER_HOST; @Value("${proxy.host}") public void...
  • 查看静态变量

    2011-04-06 10:32:00
    VC6.0中,无法直接看到静态变量,可以这样做:可以这样: static i = 0; int *p = &i; <br />然后就可以在Watch窗口中,通过*p的形式查看函数内部静态变量了。 <br />VC6.0中这种...
  • C#中的静态变量与非静态变量

    千次阅读 2020-01-29 16:38:55
    一:为什么要有静态变量 C#中没有全局变量的概念,所有的变量必须由该类的实例进行操作,这样做是为了...——静态变量是全局变量,被所有类所共享,即一个类中改变了这个静态变量后,其他类读到的就是变化后的...
  • 目录1 成员变量、局部变量和静态变量2 静态变量的特点及注意事项1 特点2 注意事项3 什么情况下使用静态变量3 总结 1 成员变量、局部变量和静态变量 成员变量:在类中且在方法外定义的变量称为成员变量; 局部变量:...
  • SpringBoot 给静态变量注入配置

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,050
精华内容 6,420
关键字:

静态变量值