美文网首页
Java的FieldAccess和FieldIntercepto

Java的FieldAccess和FieldIntercepto

作者: 冥泷 | 来源:发表于2017-02-19 22:42 被阅读0次

在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和FieldIntercepto

      本文链接:https://www.haomeiwen.com/subject/zhajwttx.html