【问题标题】:Java- How to get private data from a class in the same packageJava-如何从同一包中的类中获取私有数据
【发布时间】:2015-12-05 03:42:39
【问题描述】:

我在同一个包下有两个类。
A 类有一个private hashmap _books = new ConcurrentHashMap<String,Book>(); 字符串标题是关键。
在 B 类中,我想从 A 类的私有映射中通过其标题检索某个 Book 对象。

我尝试在 A 类中添加公共方法

public Book getBookFromMap(String title ){
    return _books.get(title);
} 

在 B 类中,我尝试调用该方法,但没有成功。 Eclipse 说“getBookFromMap 方法未定义”。在课堂上我尝试这样做:

Book bookFromMap= getBookFromMap(booktitle);

那时红线出现在 B 类的 getBookFromMap 下。我想我可能没有正确调用它?我该如何解决这个问题?非常感谢!

【问题讨论】:

  • @user3735871 什么方法未定义?
  • 请显示完整的代码和堆栈跟踪。
  • @Tunaki 他明确表示他添加了包含私有地图的方法 do class A。这应该有效。
  • 你是怎么调用这个方法的?可以把方法调用代码贴在这里吗?
  • 您说您尝试在 A 中调用公共方法。我看不出它是如何工作的。能否请您发布您的整个代码?

标签: java class methods package private


【解决方案1】:

_books更改为

ConcurrentHashMap<String,Book> _books;

(只需删除行首的私有)。

或者使用反射访问字段,见How do I read a private field in Java?

【讨论】:

  • 为什么需要这样做?他正在尝试访问 public 方法,而不是 private 字段。
【解决方案2】:

您可以使用 Java 反射 API,但在大多数情况下不建议这样做。 Here's example

【讨论】:

  • 不要使用反射,这是简单的错误或对编码的不理解。就像从大炮射向麻雀一样。但是你说(通常)trye,在某些情况下反射可以访问“私人”。所以upwote这个答案是错误的。我放弃了
【解决方案3】:
Book bookFromMap= aObjectOfClassA.getBookFromMap(booktitle);

【讨论】:

  • 我的 A 类只包含处理传入 http 请求的方法。我正在使用 JAX-RS。在这种情况下,我怎样才能拥有一个类的对象?
  • 我的A类是这样的public class StoreImpl { @POST @Consumes("application/xml") Response createBook( Book book );...}我不知道如何获取这个类的对象
  • instance.method() 的问题非常简单,是 Java 的基础。我无法帮助您处理带有 Web 服务的小段代码。
【解决方案4】:

您不能直接访问在另一个类中定义的方法。

您需要做的是使用其构造函数初始化类 A 的实例,例如:

A myInstance = new A();

那么你就可以通过使用来访问A类中的方法了

Book myBook = myInstance.getBookFromMap(booktitle);

An Alternative solution

通过使用static:通常最好不要使用static,但在这种情况下,它可能更简单。 (尽量避免静态,但必要时使用它)

所以你需要将共享的东西定义为static:

在 A 类中你将拥有:

private static hashmap _books = new ConcurrentHashMap<String,Book>();


public static Book getBookFromMap(String title ){
    return _books.get(title);
} 

在 B 类中:

Book bookFromMap= A.getBookFromMap(booktitle); //accessing getBookFromMap method in class A

【讨论】:

  • 谢谢!我知道问题出在哪里。但是我的A类只包含处理传入http请求的方法,类是这样的public class StoreImpl { @POST @Consumes("application/xml") Response createBook( Book book );...} 我不知道在这种情况下如何获取这个类的对象。我的意思是我不想每次都有一个新的 A 类。
  • @user3735871 我刚刚编辑了如何在不创建实例的情况下调用方法的答案。
  • @nafas 在 Map 周围包裹一个静态方法似乎完全没有意义,因为除了 get 之外没有其他任何东西
  • @NickHolt 关于解决方案我无法指定更多不使用static,但它是一个快速而肮脏的解决方案。在它旁边创造简单
  • @nafas imho,调用代码执行map.getA.get 更简单,然后调用map.get
【解决方案5】:

您需要创建一个 A 类的实例,并通过该实例引用其getBookFromMap

这是A 类的样子:

public class A
{
  private Map<String, Book> booksByTitle;

  public A(Book... books)
  {
    this.booksByTitle = new ConcurrentHashMap<>();

    for (Book book : books)
    {
      this.booksByTitle.put(book.getTitle(), book);
    }
  }

  public Book getBookForTitle(String title) throws BookNotFoundException
  {
    Book book = booksByTitle.get(title);

    if (book == null)
    {
      throw new BookNotFoundException("Book not found for title: " + title);
    }

    return book;
  }
}

虽然测试可能如下所示:

@Test
public void testGetBookForTitle() throws Exception
{
  Book warAndPeace = new Book("War & Peace")

  A a = new A(warAndPeace);

  assertEquals(warAndPeace, a.getBookForTitle(warAndPeace.getTitle));
}

@Test(expected = BookNotFoundException.class)    
public void testGetBookForInvalidTitle() throws Exception
{
  A a = new A();
  a.getBookForTitle("invalid");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-09
    • 2013-05-13
    • 1970-01-01
    • 2019-09-26
    • 2012-01-16
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    相关资源
    最近更新 更多