当前位置: 首页 > 知识库问答 >
问题:

在aspectj中访问私有字段

邓光赫
2023-03-14

我正在尝试获取对象的私有字段的名称。当我对包的公共字段使用相同的切点时,它正好工作。我的方面设置为特权。我想要更新类对象的字段。切入点:

pointcut priv(Object v): target (v)&& !(call(new(..)))  && set(private * *.*) 

建议:

after(Object v): priv(v)

我在我的切入点异常中得到这一行的异常:

Object dt = dts.getDeclaringType().getField(dts.getName());

共有1个答案

上官彬
2023-03-14

首先,您的切入点没有意义,因为set切入点永远不能与call切入点相同,所以您不需要排除它。如果您打算排除构造函数中的成员分配(我认为是这样),那么您需要类似于的东西!cflow(执行(*.new(..)) 以排除构造函数内的控制流。这只是一个例子,如果构造函数调用了一个成员发生更改的方法,您可能不想将其排除在外,那么您可能需要更精确地指定排除条件。

第二,我认为把一个绑定的目标称为v,是相当难看的,我宁愿把它称为targett,如果有的话。但是,如果要将值绑定到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所说,它使用反射。请参阅反射:违反所有规则并休眠:保留对象的合同。