`
lylegend13
  • 浏览: 82768 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

使用反射修改final属性

    博客分类:
  • Java
阅读更多

情型1:static final属性,无法修改其值。

package m5.d7;

import java.lang.reflect.Field;

public class FieldTest {
	public static void main(String[] args) {
		try {
			A a = new A();

			Field field = a.getClass().getDeclaredField("a");

			field.setAccessible(true);

			field.set(a, 2);

			System.out.println(field.get(a));
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
}

class A {
	private static final int a = 1;
}

 运行结果:

java.lang.IllegalAccessException: Can not set static final int field m5.d7.A.a to java.lang.Integer
	at sun.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(Unknown Source)
	at sun.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(Unknown Source)
	at sun.reflect.UnsafeQualifiedStaticIntegerFieldAccessorImpl.set(Unknown Source)
	at java.lang.reflect.Field.set(Unknown Source)
	at m5.d7.FieldTest.main(FieldTest.java:16)

 
情型2:final属性,可以修改其值。

package m5.d7;

import java.lang.reflect.Field;

public class FieldTest {
	public static void main(String[] args) {
		try {
			A a = new A();

			Field field = a.getClass().getDeclaredField("a");

			field.setAccessible(true);

			field.set(a, 2);

			System.out.println(field.get(a));
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
}

class A {
	private final int a = 1;
}

 运行结果:

2

  

2
3
分享到:
评论
2 楼 yuanliangding 2016-03-30  
有没有办法改呢。
1 楼 风雪木易 2015-02-25  
a并没有改变,用a.getter访问,别用field.get(a)

相关推荐

    Java反射如何有效的修改final属性值详解

    Java反射机制是Java语言提供的一种...由于Java编译器的内联优化,只有在特定条件下,反射修改的`final`属性值才会在运行时被正确地使用。在实际开发中,谨慎使用这种技巧,因为这可能会破坏代码的预期行为和安全性。

    finaldata数据恢复好帮手

    通过反射,开发者可以动态地访问和修改类的属性、方法,甚至可以调用私有方法和访问私有变量。这在某些场景下非常有用,比如在测试、框架开发或需要动态操作对象的情况下。 以下是一个简单的Java反射示例: ```java...

    JAVA 反射机制应用

    - 避免反射调用敏感方法,如修改final字段或私有成员,除非明确知道这样做是安全的。 总之,Java反射机制为开发者提供了强大的工具,使得程序在运行时能够对自身进行深入的探索和操作。然而,使用时也需谨慎,权衡...

    Hibernate配置文件加载后修改配置信息

    利用反射修改配置 通过反射机制,我们可以获取到`Environment`类中的属性,进而修改`Properties`对象中的配置信息。具体实现方式如下: ```java // 获取Environment类的Class对象 Class<?> envClass = Class.for...

    java反射机制详解

    - **获取类的修饰符**:通过`getModifiers()`方法可以获取类的修饰符(如`public`、`final`等),并使用`Modifier`类的相关方法解析。 ```java int modifiers = c.getModifiers(); if (Modifier.isPublic...

    Java反射大全

    反射机制使得Java程序在运行时能够获取关于自身的信息,如类、接口、字段和方法等,并能在运行时动态地创建对象、调用方法、修改属性。这使得Java具备了一定的动态性,虽然在传统的分类中它被归为静态类型语言。 1....

    反射:java知识中的重点

    反射是Java编程语言的一个核心特性,它允许程序在运行时动态地访问、检测和修改自身结构与行为的能力。这种能力对于许多开发框架(如Spring)来说至关重要。本文将通过几个具体的示例来深入探讨Java反射的多个方面。...

    Java面试-反射机制.doc

    反射机制的应用非常广泛,例如在 JavaBean 的开发中,反射机制可以用来动态地设置和获取 JavaBean 的属性。在框架和库的开发中,反射机制也可以用来实现动态的方法调用和参数传递。 二、IO 流 IO 流是 Java 中的一...

    java概述课件24反射.ppt

    这些功能使得Java程序具有很高的灵活性,能够在运行时检查类的结构,创建对象,调用方法,修改字段值等,广泛应用于插件系统、动态代理、序列化、框架开发等多个领域。 总的来说,Java反射提供了强大的能力,让...

    6wave_final.rar_6wave_LEDIT绘制微纳_ledit_波导

    这个数据库文件是6wave软件的专用格式,包含了所有设计的几何形状、材料属性和电气属性,是将设计转换为实际物理芯片前的关键步骤。 在进行设计时,LEDIT支持与仿真工具的无缝集成,例如与RSoft的Bandstructure或...

    Tomcat中一种半通用回显方法 - 先知社区1

    5. **利用反射修改私有final变量**: Java的反射API允许程序在运行时检查和修改类、接口、字段和方法的属性。在本例中,通过`Class.getDeclaredField()`获取私有常量`WRAP_SAME_OBJECT`的Field对象,然后使用`Field...

    PHP的反射类ReflectionClass、ReflectionMethod使用实例

    例如,你可以通过传递类名来创建一个`ReflectionClass`对象,然后调用其方法来获取类的常量、属性、方法、命名空间、是否为final或abstract类,以及类是否实现特定的接口。 - `newInstanceArgs()`方法用于创建类的...

    PHP反射基础知识回顾

    - 反射API允许在运行时动态地创建对象、调用方法、修改属性的访问权限等。例如,`ReflectionProperty::setValue()` 方法可以更改对象的私有或保护属性值。 - 反射还可以用于实现依赖注入、AOP(面向切面编程)、...

    详解php中反射的应用

    PHP反射技术是指在PHP代码运行时,程序能够访问、检查和修改对象、类、方法和属性等内部信息的一种机制。在面向对象编程中,反射通常被用来动态地分析和访问程序的元数据,而不直接依赖这些元数据的具体内容。利用...

    JAVA的反射机制与动态代理.pdf

    - 不能代理final类和final方法。 #### 五、Spring AOP Spring框架提供了AOP的支持,其中就包括动态代理的实现。Spring AOP支持两种代理模式:JDK动态代理和CGLIB动态代理。 1. **Spring AOP的工作原理**: - ...

    java 程序设计笔记

    - 编程者可以把用于完成特定功能的若干属性组织成相对独立的属性集合,凡是需要实现这种特定功能的类,都可以继承这个属性集合并在类内使用它,这种属性集合就是接口。 8. 深入理解 Java 语言: - 域变量与局部...

    深入理解持久化对象

    4. **使用非final类**:虽然不是硬性规定,但是推荐使用非final类,以便于框架通过继承等方式进行扩展和操作。 5. **重写equals()和hashCode()方法**:这有助于在集合中比较对象的相等性和唯一性,对于缓存管理和...

    实例介绍PHP的Reflection反射机制

    2. **属性 Property Names**: 使用`ReflectionClass::getProperties()`可以获取类的所有属性。这个方法默认会返回包括私有(private)和受保护的(protected)在内的所有属性。如果只想获取特定访问类型的属性,可以...

    ListDialog不带RadioButton的单选按钮对话框

    本文将详细介绍如何通过反射修改`SingleChoiceDialog`的布局,以创建一个不带内置RadioButton的`ListDialog`。 首先,我们需要理解`Dialog`和`ListDialog`的基本概念。`Dialog`是Android中一种用来显示临时信息或与...

Global site tag (gtag.js) - Google Analytics