2014-12-15 5 views
-2

몇 가지 네트워킹 애플 리케이션을 작성한 경험이 있기 때문에 좋은 친구가되어 내가 알고있는 사람을 돕고 싶었습니다. (Java가 나의 모국어가 아님) 그래서 그는 도움을 원했던 보너스 지정을 나에게 건네주었습니다. 우리가 잘 못 박힌 것처럼 보이지만, 내 친구에게 전해지는 보너스 할당은 프로그래밍 언어에서 생각한 모든 것을 거스르는 결과를 낳았습니다. 분명히 어떤 프로그래밍 언어로 클래스를 확장한다면 말이다. C++, Java, PHP의 경우 하위 클래스 변수는 보호되거나 공용 인 경우에만 액세스 할 수 있습니다. 분명히 개인적인 일이나 규칙을 어기려는 시도를하는 경우 분명히 조치를 취해야합니다. ... 권리? 여기 방법입니다 당신은 HTML에서 송장을 인쇄 할 수 있도록이 프로그램은 "InvoicePrinter을"이라고 수정해야하고 당신은 InvoiceFormatter자바를 사용하는 비공개 회원에 비공개 멤버 액세스

의 클래스 ECXEPT 중 하나를 수정할 수 없습니다 :

은 분명히 할당이 같았다 프로그램 요약.

//Address.java 
class Address 
{ 
    private String m_name; 
    private String m_street; 

    Address(String name, String street) 
    { 
    m_name = name; 
    m_street = street; 
    } 

} 

//Invoice.java 
class Invoice 
{ 
    private Address m_location; 
    private Products m_products; 

    Invoice(Address addr) 
    { 
     m_location = addr; 
    } 

    public void format() 
    { 
      //Print data here... 
    } 
} 

//InvoicePrinter 
class InvoicePrinter 
{ 
    int main(//...) 
    { 
     Invoice myInvoice = new Invoice(new Address("My company", "12345 n Street Way")); 
     myInvoice.addProduct(new Product("box", 1.20)); 
     myInvoice.addProduct(new Product("glasses", 5.00)); 


     //Print Invoice on screen... 
     myInvoice.format(); 


     //Add your invoice printer here here... 
    } 

} 

//InvoiceFormater.java 
class InvoiceFormater 
{ 
    private Invoice myInv; 

    InvoiceFormater(Invoice invoice) 
    { 
      myInv = invoice; 
    } 


    public static void format() 
    { 
     //Print your HTML formatter here. 

    } 

} 

나는 천천히 "InvoiceFormatter"를 확장하고 슈퍼를 사용하는 자바 초보자라도,하지만 난 송장에서 데이터를 추출 할 수있는 방법을 볼 수있는 유일한 일에 돌리겠다,하지만 당신은 여전히 ​​필요 그래서하지 않는 한 주소와 같은 "Invoice"데이터에 대한 액세스 등 ... 그렇다면 int main 또는 InvoiceFormatter를 제외한 코드를 변경하지 않고 어떻게이 작업을 수행 할 수 있습니까? 이 셉션 또는 역설에서 일 같은 소리 때문에

는 ... 내가 인정한다,이

+2

과제는 자기 모순되는 것처럼 보입니다. 당신은'InvoicePrinter' 만 수정할 수있는 클래스이지만'Invoice.format'과'InvoiceFormatter.format' 메쏘드는 여러분에게 그것들을 구현할 것을 요구하고 있습니다. –

+0

Google 자바 리플렉션. – javaHunter

+1

본 지정이 무의미하다고 본 당신의 본능이 맞습니다. 예를 들어'Address' 클래스는 쓰여진 것처럼 완전히 쓸모가 없습니다. 기존 클래스를 수정하는 것이 현명한 방법 일뿐입니다. 이 코드에는 Java가 아닌'int main'과 적절한 Java (또는 C 또는 C++) 주석이 아닌'(// ...)'같은 많은 쓰레기도 있습니다. –

답변

0

'Reflection'을 (를) 사용하여 개인 클래스 정보를 얻을 수 있습니다. Reflection을 사용하면 사용 가능한 메소드 및 필드와 같은 클래스에 대한 정보를 얻을 수 있습니다. 그러나 필드의 값을 얻거나 메소드가 존재하는 것을 발견 한 후에 메소드를 호출 할 수도 있습니다.

리플렉션 및 일부 자습서에 대한 자세한 내용은 오라클 Reflection tutorials을 참조하십시오.

그래서 거기에

다음과 같은 질문 및 허용 대답은 문제의 specfific 예와 함께 당신을 도울 수 있습니다 How do I read a private field in Java?

반사에

더 자세한 정보도 What is reflection and why is it useful?


주의 acceptedanswer에 의해 제공됩니다 이게 네 선생님의 의도 된 해결책이 아닌지 ...교습의 관점에서 볼 때,이 간단한 작업 (세터 광고 게터 추가)에 반사를 사용하면 거대한 잔인한 일이므로 Invoice을 수정하는 것이 더 바람직하다는 생각이들 것입니다.

+1

나는 Veger에 동의한다. 그것은 Java 101을 위해 특별히 약간 미쳤다. 선생님이 그에게 말하고있는 정보를 내 친구에게 알릴 것이다. 또는 ether 내 친구는 그가 혼란 스럽다. 그에게 여러 번 물었다. – ajm113

0

할 수 있습니다하지, 정의에 의해 롤 ..., 나에게 미친 그냥이 어떻게 작동하는지 경우 생각 비트를 몰았다 다른 클래스의 private 필드에 액세스합니다 (내부 클래스 또는 포함 클래스는 제외하지만 여기서는 그렇지 않습니다).

나 정교하게하자 다시 format()의 출력에서 ​​해당 필드를 (구문 분석

  • 시도 : 당신이 정말 세 가지 옵션이 있습니다, 그래서 필드 m_locationm_products에 대한 Invoice 클래스에는 접근 할 수없는 것으로 보인다 이이 올바른 방법은 Invoice 클래스를 수정하는 것입니다, 더
  • 가 할당 기 설득) 부정 행위와 같다 (반사 API를 사용하여 시간 운영하는 민간 분야의
  • 변경 접근성) 부정 행위처럼