Java AspectJ-使用反射实例化非公共类的对象
我试图在AspectJ中实例化非公共类的对象 我有这门课: 包ca1.1业务; 公共课条例草案{ int-id; 字符串运算符; 字符串idClient; Billint id,字符串idOperator,字符串idClient{/*…*/} 公共字符串到字符串{/*…*/} 公共布尔等式对象{/*…*/} public int getId{/*…*/} 公共字符串getOperator{/*…*/} 公共字符串getClient{/*…*/} } 在aspects课程中,我希望能够做到: 账单b=新账单发票、idOperator、idClient; 问题是我得到了一个错误: 构造函数Billint、String、String不可见 所以我调查并尝试使用反射,就像在文章中解释的那样 试一试{ 构造函数cons=Bill.class.getDeclaredConstructorFull; cons.setAccessibletrue; 账单发票=cons.newInstancenull; 发票编号=1; invoice.idOperator=foo; invoice.idClient=bar; //等等。。。 }捕获安全异常{ e、 打印跟踪; }捕获无此方法异常{ e、 打印跟踪; }捕获非法argumentException e{ e、 打印跟踪; }捕获实例化异常{ e、 打印跟踪; }捕获非法访问异常e{ e、 打印跟踪; }捕获调用targetException e{ e、 打印跟踪; } 但我在这几行中发现了一个错误: 发票编号=1; invoice.idOperator=foo; invoice.idClient=bar; 错误是: 字段Bill.X不可见。 有人知道是否有解决方法吗?为什么要使用反射 让我们假设Bill类如下所示: 包ca1.1业务; 公共课条例草案{ int-id; 字符串运算符; 字符串idClient; Billint id、字符串idOperator、字符串idClient{ this.id=id; this.idOperator=idOperator; this.idClient=idClient; } @凌驾 公共字符串toString{ 返回票据[id=+id+,idOperator=+idOperator+,idClient=+idClient+]; } 公共静态法案实例; 公共静态无效字符串[]args{ System.out.printlinstance; } } 我们希望方面在执行main之前填充静态成员,例如,仅用于演示: 选项A:特权方面 选项B:将方面放入包ca1.business中 构造函数是包私有的,即同一包中的其他类可以访问它 包ca1.1业务; 公共方面我的方面{ 之前:executionpublic静态无效主字符串[]{ Bill.instance=新账单11、操作员、客户; } } 选项C:将factory类作为助手放入受保护的包中 包ca1.1业务; 公营BillFactory{ 公共静态Bill createint id、字符串idOperator、字符串idClient{ 返回新的Billid、idOperator、idClient; } } 包de.scrum_master.aspect; 进口ca1.business.Bill; 进口ca1。商务。工厂;; 公共方面我的方面{ 之前:executionpublic静态无效主字符串[]{ Bill.instance=BillFactory.create11,操作员,客户端; } } 每个选项A、B、C的控制台日志 账单[id=11,idOperator=operator,idClient=client]Java AspectJ-使用反射实例化非公共类的对象,java,reflection,aspectj,Java,Reflection,Aspectj,我试图在AspectJ中实例化非公共类的对象 我有这门课: 包ca1.1业务; 公共课条例草案{ int-id; 字符串运算符; 字符串idClient; Billint id,字符串idOperator,字符串idClient{/*…*/} 公共字符串到字符串{/*…*/} 公共布尔等式对象{/*…*/} public int getId{/*…*/} 公共字符串getOperator{/*…*/} 公共字符串getClient{/*…*/} } 在aspects课程中,我希望能够做到: 账单
请提供一个包含aspectj源代码的示例。在类Bill中,您有一个包专用构造函数-它在另一个包中不可见,因此请将其公开并调用Bill b=new BillcurrInvoice,idOperator,idClient;不假思索。
package de.scrum_master.aspect;
import ca1.business.Bill;
public privileged aspect MyAspect {
before() : execution(public static void main(String[])) {
Bill.instance = new Bill(11, "operator", "client");
}
}