有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java有没有办法在没有反射的情况下访问方面的目标对象字段(给定getter切入点)?

我正试图用AspectJ解决以下问题

给定一个带有null@Embedded field的实体类,当试图使用getter访问该字段时,如果该字段为null,则首先实例化它。ie:这将确保getXXXX永远不会返回空值

例如:

@Entity
public class MyClass {

        @Id
    private long id;

    @Embedded
    private Validity validity;
}


And Validity:

@Embeddable
public class Validity{
    private long from;
    private long to;
}

然而,我很难想出如何最好地写出before()建议。理想情况下,我会尽量避免使用反射,以免减慢速度,但到目前为止,我能想到的最好办法是:

// define a pointcut for any getter method of a field with @Embedded of type Validity with any name in com.ia.domain package
pointcut embeddedGetter() : get( @javax.persistence.Embedded com.ia.domain.Validity com.ia.domain..* );

before() : embeddedGetter(){
    String fieldName = thisJoinPoint.getSignature().getName();
    Object obj = thisJoinPoint.getThis();

    // check to see if the obj has the field already defined or is null
    try{
        Field field = obj.getClass().getDeclaredField(fieldName);
        field.setAccessible(true);
        if( field.get(obj) == null )
            field.set(obj, new com.ia.domain.Validity() );
    }
    catch( IllegalAccessException | NoSuchFieldException e){}
}

但我的建议是使用反射来访问字段值。有没有办法做到这一点而不反思


共 (1) 个答案

  1. # 1 楼答案

    根据around建议,您可以仅在需要初始化时进行反射:

    Object around(): embeddedGetter() {
        Object value = proceed();
        if (value == null) {
            String fieldName = thisJoinPoint.getSignature().getName();
            Object obj = thisJoinPoint.getThis();
    
            try{
                Field field = obj.getClass().getDeclaredField(fieldName);
                field.setAccessible(true);
                field.set(obj, value = new Validity() );
            }
            catch( IllegalAccessException | NoSuchFieldException e){e.printStackTrace();}           
        }
        return value;
    }