【背景】
在研究SpEL表达式漏洞官方推出的增强方案时发现,官方推出的SimpleEvaluationContext.java对比StandardEvaluationContext.java修改了一些东西。其中一个就是修改了getBeanResolver()方法的实现,将其返回置为空。分析源码以后,我猜测:SimpleEvaluationContext.java重写getBeanResolver()方法的实现,目的是为了禁止在bean中使用表达式。getBeanResolver()方法调用图如下(虚线表示接口或抽象类的方法):
【问题描述】
为了验证这个猜想,我写了一个使用bean中使用SpEL的demo,但是发现demo运行时,并没有构造BeanReference类的实例,更没有调用到BeanReference.getValueInternal()方法以及EvaluationContext.getBeanResolver()方法。因此,BeanReference类的作用是什么呢?在什么情况下才能触发这个类的构造以及BeanReference.getValueInternal()方法的执行呢?
我用来测试的demo如下:
Inventor.java(Bean的java对象)
package com.power.bean;
import java.util.Date;
import java.util.GregorianCalendar;
/**
* @author power
* @date 2018/10/8 下午2:34
*/
public class Inventor {
private String name;
private Date birthday;
private String nationality;
private Object random;
public Inventor() {}
public Inventor(String name, Date birthday, String nationality) {
this.name = name;
this.birthday = birthday;
this.nationality = nationality;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;