Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AspectJ-使用反射实例化非公共类的对象_Java_Reflection_Aspectj - Fatal编程技术网

Java AspectJ-使用反射实例化非公共类的对象

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中实例化非公共类的对象

我有这门课:

包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]
请提供一个包含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");
  }
}