【发布时间】:2017-03-15 19:46:57
【问题描述】:
我正在尝试在 AspectJ 中实例化一个非公共类的对象。
我有这门课:
package ca1.business;
public class Bill {
int id;
String idOperator;
String idClient;
Bill(int id, String idOperator, String idClient) { /* (...) */ }
public String toString() { /* (...) */ }
public boolean equals(Object o) { /* (...) */ }
public int getId() { /* (...) */ }
public String getOperator() { /* (...) */ }
public String getClient() { /* (...) */ }
}
在方面类中我希望能够做到:
Bill b = new Bill(currInvoice, idOperator, idClient);
问题是我得到一个错误:
The constructor Bill(int, String, String) is not visible
所以我调查并尝试使用反射,就像 this 帖子中解释的那样。
try {
Constructor<Bill> cons = Bill.class.getDeclaredConstructor(null);
cons.setAccessible(true);
Bill invoice = cons.newInstance(null);
invoice.id = 1;
invoice.idOperator = "foo";
invoice.idClient = "bar";
// etc...
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
但我在行中遇到错误:
invoice.id = 1;
invoice.idOperator = "foo";
invoice.idClient = "bar";
错误是:
The field Bill.X is not visible.
有谁知道有什么解决方法吗?
【问题讨论】:
-
请提供一个minimal reproducible example,其中包含您的aspectj来源。
-
在 Bill 类中,您有一个包私有构造函数 - 它在另一个包中不可见,因此将其公开并调用 Bill b = new Bill(currInvoice, idOperator, idClient);没有反射。
标签: java reflection aspectj