2017-03-15 1 views
0

AspectJ에서 비공개 클래스의 객체를 인스턴스화하려고합니다.AspectJ - 공개 클래스가 아닌 객체를 반성하기 위해 리플렉션을 사용합니다.

The constructor Bill(int, String, String) is not visible 
:

Bill b = new Bill(currInvoice, idOperator, idClient); 

문제는 내가 오류가 발생한다는 것입니다 : 내가 할 수 있기를 원 측면 클래스에서

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() { /* (...) */ } 
} 

:

나는이 클래스가

그래서 조사를하고 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. 
어떤 해결 방법이있는 경우

사람이 알고 있나요?

+0

로 보호 된 패키지에 넣어 팩토리 클래스하시기 바랍니다 ** 귀하의 aspectj 소스를 포함하는 [mcve]를 제공하십시오. – GhostCat

+0

클래스 빌에서는 패키지 전용 생성자가 있습니다. 다른 패키지에서 볼 수 없으므로 public으로 만들고 Bill을 호출하십시오. b = new Bill (currInvoice, idOperator, idClient); 반사없이. – DontPanic

답변

1

왜 리플렉션을 사용합니까?

우리가 Bill 클래스는 다음과 같습니다 가정 해 봅시다 :

우리는 main이 (바보 예를 들어, 단지 데모)을 실행하기 전에 우리의 측면은 정적 멤버를 채우려
package ca1.business; 

public class Bill { 
    int id; 
    String idOperator; 
    String idClient; 

    Bill(int id, String idOperator, String idClient) { 
    this.id = id; 
    this.idOperator = idOperator; 
    this.idClient = idClient; 
    } 

    @Override 
    public String toString() { 
    return "Bill [id=" + id + ", idOperator=" + idOperator + ", idClient=" + idClient + "]"; 
    } 

    public static Bill instance; 

    public static void main(String[] args) { 
    System.out.println(instance); 
    } 
} 

:

옵션 A : 권한 양태

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"); 
    } 
} 

옵티오 n B : aspect를 패키지에 넣기 ca1.business

생성자는 패키지 전용입니다. 즉, 같은 패키지의 다른 클래스가 패키지에 액세스 할 수 있습니다.

package ca1.business; 

public aspect MyAspect { 
    before() : execution(public static void main(String[])) { 
    Bill.instance = new Bill(11, "operator", "client"); 
    } 
} 

옵션 C : 도우미

package ca1.business; 

public class BillFactory { 
    public static Bill create(int id, String idOperator, String idClient) { 
    return new Bill(id, idOperator, idClient); 
    } 
} 
package de.scrum_master.aspect; 

import ca1.business.Bill; 
import ca1.business.BillFactory;; 

public aspect MyAspect { 
    before() : execution(public static void main(String[])) { 
    Bill.instance = BillFactory.create(11, "operator", "client"); 
    } 
} 

각 옵션 A에 대한 콘솔 로그, B, C

Bill [id=11, idOperator=operator, idClient=client] 
관련 문제