使用Java访问私有成员中的私有成员

时间:2014-12-15 15:50:57

标签: java class private

所以我想成为一个好朋友并用他们的Java课程帮助我认识的人,因为我有编写一些网络应用程序的经验。 (Java不是我的第一语言)所以他递给我一份他想要帮助的奖金。我们似乎所有其他的东西都很好,但递给我朋友的奖金分配几乎违背了我在任何编程语言中的想法。显然,如果你用任何编程语言扩展一个类。 C ++,Java,PHP,只有受到保护或公开的子类变量才能访问它们。显然,如果您尝试访问任何私有或试图破坏规则的东西,您需要退后一步。 ......对吗?

显然,作业是这样的:你需要修改这个名为" InvoicePrinter"的程序。这样您就可以用HTML打印发票,而且您无法修改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.

    }

}

因此,除非我慢慢变成Java初学者或其他什么,但我唯一能看到如何从Invoice中提取数据的是扩展" InvoiceFormatter"并使用超级,但你仍然需要访问"发票"数据,例如Address等等......那么如果不改变除int main或InvoiceFormatter之外的任何代码,怎么会这样做呢?

......我承认,这让我有点疯狂,只是想想它是如何起作用的,因为它听起来像起源或悖论...... LOL

2 个答案:

答案 0 :(得分:0)

根据定义,您不能访问另一个类的私有字段(内部或封闭类除外,但这不是这种情况)。

让我详细说明:Invoice类中的字段m_locationm_products似乎没有访问者,因此您有三个选项:

  • 尝试从format()的输出中解析这些字段(这就像作弊)
  • 使用反射API更改私有字段运行时的可访问性(这更像是作弊)
  • 说服分配者,正确的方法是修改Invoice

答案 1 :(得分:0)

您可以使用' Reflection'获取私人课程信息。 Reflection允许您获取有关类的信息,例如可用的方法和字段。但它也允许您获取字段的值,或者在您发现它们存在后调用该方法。

有关反射的更多信息以及一些教程,您可以访问Oracle的Reflection tutorials

这样,以下问题和接受的答案可能会帮助您解决问题的具体示例:How do I read a private field in Java?

What is reflection and why is it useful?

的接受者也提供了有关反思的更多信息

请注意,我怀疑这是您老师的预期解决方案......从教学的角度来看,似乎更有意义的是您也可以修改Invoice,因为使用反射这些简单的任务(添加setter ad getters)是一个巨大的过度杀伤!