在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等横向编程来说,这个拦截器类似在更加细微的单元做更细微的横向处理。
正是这个缘故,在具体应用时,需要注意到特别重要的、特别容易出现错误可以打印日志或安全校验。如果普遍这些拦截器,会造成日志泛滥等问题。
网友评论