Java的FieldAccess和FieldInterceptor

在Java中,有私有(private)、受保护(protected)和公开(public)属性三种。其中,在反射中并不能直接修改私有属性和受保护属性。

如若需要修改私有和受保护属性,则需要将属性的FieldAccess属性设置为true。如下例所述:

例如,XXClass xclass = new XXClass();

xclass.getClass().getField("xx").setAccessable(true);

如果在反射访问实例的类属性时,需要对反射操作进行日志记录,安全校验等工作。则需要自己实现自定义FieldInterceptor,例如:

class TracingInterceptor implements FieldInterceptor {

Object set(FieldAccess fa) throws Throwable {

System.out.println("field "+fa.getField()+" is set with value "+

fa.getValueToSet());

Object ret=fa.proceed();

System.out.println("field "+fa.getField()+" was set to value "+ret);

return ret;

}

Object get(FieldAccess fa) throws Throwable {

System.out.println("field "+fa.getField()+" is about to be read");

Object ret=fa.proceed();

System.out.println("field "+fa.getField()+" was read; value is "+ret);

return ret;

}

}。

从上可知,主要是在get和set方法上进行日志记录,安全校验等操作。

相比较于Spring的AOP等横向编程来说,这个拦截器类似在更加细微的单元做更细微的横向处理。

正是这个缘故,在具体应用时,需要注意到特别重要的、特别容易出现错误可以打印日志或安全校验。如果普遍这些拦截器,会造成日志泛滥等问题。

你可能感兴趣的:(Java的FieldAccess和FieldInterceptor)