我正在尝试获取对象的私有字段的名称。当我对包的公共字段使用相同的切点时,它正好工作。我的方面设置为特权。我想要更新类对象的字段。切入点:
pointcut priv(Object v): target (v)&& !(call(new(..))) && set(private * *.*)
建议:
after(Object v): priv(v)
我在我的切入点异常中得到这一行的异常:
Object dt = dts.getDeclaringType().getField(dts.getName());
首先,您的切入点没有意义,因为set
切入点永远不能与call
切入点相同,所以您不需要排除它。如果您打算排除构造函数中的成员分配(我认为是这样),那么您需要类似于的东西!cflow(执行(*.new(..))
以排除构造函数内的控制流。这只是一个例子,如果构造函数调用了一个成员发生更改的方法,您可能不想将其排除在外,那么您可能需要更精确地指定排除条件。
第二,我认为把一个绑定的目标称为
v
,是相当难看的,我宁愿把它称为target
或t
,如果有的话。但是,如果要将值绑定到v
,而不是目标,则必须使用args(v)
。
现在你的实际问题是:正如Javadoc明确指出的,
getField
只适用于公共字段。因此,如果您需要访问私有字段,请使用getDeclaredField
。
问题内容: 众所周知,私有字段不会在类之间继承。令我着迷的是它如何用于内部静态类。考虑以下代码: 您能否解释一下如何访问其他内部类的私有字段?如果合法,为什么只能通过“ super.XXX”构造实现? 问题答案: 内部类是Java的较晚入门。添加它们时,它们仅作为编译器扩展添加,对JVM不变。 语言规范指出,内部类被允许访问在其内声明的类的私有成员。包括其他内部类。 为了使其工作,编译器会生成桥接
问题内容: 我有一个类,该类具有一个命名的字段(它与我的类具有相同的类型并具有修饰符): 在该类中,我定义了一个名为的方法,该方法具有一个类型为type的参数。我想知道为什么我可以直接访问实例字段?我的意思是该字段是,不是通过实例受害者无法访问的吗? 问题答案: 隐私不是针对每个实例的,而是针对每个班级的。 该类可以访问所有实例的私有字段。 例如,该方法可以将o(如果适用)转换为相同类型,并将其私
我试图理解Java8中引入的新日期和时间API。 我在日志文件中有一个unix时间戳,我需要对它进行处理,以确定它属于今天或昨天的哪个小时。 我遇到了一个不寻常的错误在Android Studio,想更好地理解它。
我知道如何访问私有变量,但我正在尝试测试以下类: ProcessStatusResult: 在我的测试中,我需要在ProcessStatusBody中获取ProcessStatus来验证它,但我不知道如何做到这一点。 有没有一种方法可以使用反射(或其他方法)来访问它,而不必仅仅为了测试而在ProcessStatusResult中添加getter?
问题内容: hibernate如何访问java类的私有字段/方法,例如设置@Id? 谢谢 问题答案: 就像Crippledsmurf所说,它使用反射。请参阅反射:违反所有规则并hibernate:保留对象的合同。
问题内容: 休眠如何访问java类的私有字段/方法,例如设置@Id? 谢谢 问题答案: 就像Crippledsmurf所说,它使用反射。请参阅反射:违反所有规则并休眠:保留对象的合同。