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

使用Java访问私有成员中的私有成员,java,class,private,Java,Class,Private,所以我想成为一个好朋友,帮助我认识的人学习Java课程,因为我有编写一些网络应用程序的经验。Java不是我的第一语言,所以他给了我一个额外的任务,他想得到帮助。其他一切我们似乎都做得很好,但交给我朋友的奖金分配几乎与我在任何编程语言中的想法背道而驰。显然,如果用任何编程语言扩展一个类。C++、java、php,只有在保护或公开时才访问子类变量。显然,如果你试图访问任何私人物品或试图违反规则,你需要退后一步。。。对吧? 显然,分配是这样的:您需要修改名为InvoicePrinter的程序,以便可以

所以我想成为一个好朋友,帮助我认识的人学习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初学者或其他什么人,但我看到的唯一能够从发票中提取数据的方法是扩展InvoiceFormatter并使用Super,但您仍然需要访问发票数据,例如地址等。。。那么,除了int-main或InvoiceFormatter之外,如何在不更改任何代码的情况下执行此操作呢


。。。我承认,这让我有点疯狂,因为它听起来像是《盗梦空间》中的一件事,或者是一个悖论。。。lol

根据定义,您不能访问除内部类或封闭类之外的其他类的私有字段,但这里的情况并非如此

让我详细说明一下:Invoice类中似乎没有m_location和m_products字段的访问器,因此您实际上有三个选项:

尝试从格式输出中解析回这些字段,这就像作弊一样 使用反射API在运行时更改私有字段的可访问性这更像是作弊 说服分配者,正确的方法是修改Invoice类
您可以使用获取私有类信息。反射允许您获取有关类的信息,如可用的方法和字段。但它也允许您获取字段的值,或者在发现字段存在后调用该方法

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

因此,以下问题和公认的答案可能会帮助您解决您的问题:

关于反射的更多信息也由


请注意,我怀疑这是您的老师想要的解决方案。。。从教学的角度来看,还允许您修改发票似乎更有意义,因为在这些简单的任务中使用反射添加setter和getter是一种巨大的过度使用

任务似乎自相矛盾;您说过InvoicePrinter是您可以修改的唯一类,但是Invoice.format和InvoiceFormatter.format方法要求您实现它们。Google java反射。您的直觉是正确的,这个赋值看起来毫无意义。例如,Address类在编写时是完全无用的。唯一明智的方法是修改现有的类。这段代码中也有很多垃圾,比如int main,它不是Java,还有/。。。这不是一个合适的java或C++或C++评论。我同意你的观点,Veger,这有点疯狂,特别是对于java 101。我会告诉我的朋友这个信息包含了老师告诉他的是真的,或者我的朋友把他的指示弄混了,尽管我问了他很多次。