- 两年前写过一篇 Java 反射修改 final 属性值, 在这里重新温习一下,假设有个类
class Person {
这里声明 name 为非静态的属性只是为了说明反射修改 final 属性无关乎静态不静态,静态只是表现在它是一个类属性,在一个类加载器空间只会有一份拷贝,仅此而已。
public final String name = "Mike";
}
创建一个通用方法进行反射修改属性值1public static void modify(Object object, String fieldName, Object newFieldValue) throws Exception { 2 Field field = object.getClass().getDeclaredField(fieldName); 3 4 Field modifiersField = Field.class.getDeclaredField("modifiers"); 5 modifiersField.setAccessible(true); //Field 的 modifiers 是私有的 6 modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); 7 8 if(!field.isAccessible()) { 9 field.setAccessible(true); 10 } 11 12 field.set(object, newFieldValue); 13}
调用 modify(...) 方法试图修改 person 的 name 属性 Read More - ReflectASM 使用字节码生成的方式实现了更为高效的反射机制。执行时会生成一个存取类来 set/get 字段,访问方法或创建实例。一看到 ASM 就能领悟到 ReflectASM 会用字节码生成的方式,而不是依赖于 Java 本身的反射机制来实现的,所以它更快,并且避免了访问原始类型因自动装箱而产生的问题。
下面三个图是 ReflectASM 与 Java 自身反射机制的性能对比,表现很不错的。


测试代码包含在项目文件中. 上面图形是在 Oracle 的 Java 7u3, server VM 下测试出的结果。
下面我们自己来做个测试,测试环境是 Mac OS X 10.8, 2.4G Core 2 Duo, 4G RAM, 64 位 JDK 1.6. Read More - 先看下面的代码,看看程序执行会是什么样的结果:
1import java.lang.reflect.Method; 2/** 3 * @author Unmi 4 */ 5public class ExceptionTest { 6 7 public static void main(String[] args) { 8 try{ 9 foo1(); 10 }catch (MyException me) { 11 System.out.println("Exception Type: MyException"); 12 }catch (Exception e) { 13 System.out.println("Exception Type: Exception"); 14 } 15 } 16 17 public static void foo1() throws Exception{ 18 Method method = ExceptionTest.class.getDeclaredMethod("foo2",new Class[]{}); 19 20 //注意调用foo2时,foo2方法会抛出MyException异常 21 method.invoke(null,new Object[]{}); 22 } 23 24 public static void foo2() throws Exception{ 25 throw new MyException(); //foo2方法直接抛出异常 26 } 27} 28 29//一个自定义的异常 30class MyException extends Exception{ 31 32}
Read More