Загрузить внутренний класс Java - PullRequest
0 голосов
/ 18 ноября 2011

У меня есть этот класс на Java (это из проекта JaCoCo):

public class MemoryMultiReportOutput implements IMultiReportOutput {

    private final Map<String, ByteArrayOutputStream> files = new HashMap<String, ByteArrayOutputStream>();

    private final Set<String> open = new HashSet<String>();

    private boolean closed = false;

    public OutputStream createFile(final String path) throws IOException {
        assertFalse("Duplicate output " + path, files.containsKey(path));
        open.add(path);
        final ByteArrayOutputStream out = new ByteArrayOutputStream() {
            @Override
            public void close() throws IOException {
                open.remove(path);
                super.close();
            }
        };
        files.put(path, out);
        return out;
    }

    public void close() throws IOException {
        closed = true;
    }

    public void assertEmpty() {
        assertEquals(Collections.emptySet(), files.keySet());
    }

    public void assertFile(String path) {
        assertNotNull(String.format("Missing file %s. Actual files are %s.",
                path, files.keySet()), files.get(path));
    }

    public void assertSingleFile(String path) {
        assertEquals(Collections.singleton(path), files.keySet());
    }

    public byte[] getFile(String path) {
        assertFile(path);
        return files.get(path).toByteArray();
    }

    public InputStream getFileAsStream(String path) {
        return new ByteArrayInputStream(getFile(path));
    }

    public void assertAllClosed() {
        assertEquals(Collections.emptySet(), open);
        assertTrue(closed);
    }
}

Когда я собираю этот класс, Eclipse создает MemoryMultiReportOutput.class и MemoryMultiReportOutput$1.class.

Первый вопрос: почему Eclipse создает MemoryMultiReportOutput$1.class? Eclipse считает ByteArrayOutputStream out InnerClass?

Но моя проблема в том, что когда я загружаю MemoryMultiReportOutput.class, как я могу загрузить все внутренние классы, присутствующие в родительском классе?

Ответы [ 2 ]

3 голосов
/ 18 ноября 2011

Чтобы ответить на ваш первый вопрос:

final ByteArrayOutputStream out = new ByteArrayOutputStream() {
        @Override
        public void close() throws IOException {
            open.remove(path);
            super.close();
        }
    };

Здесь вы создаете подкласс ByteArrayOutputStream на лету, то есть анонимно. Вот почему у вас есть другой файл .class.

Чтобы ответить на ваш второй вопрос:

Вы можете загружать только родительские внутренние классы, видимые для подкласса, через объект экземпляра суперкласса:

Superclass s = new Superclass();
Superclass.Subclass sub = s.new Subclass();

Если внутренний класс является статическим, то есть вложенный класс верхнего уровня (поскольку не существует такого понятия, как внутренний статический класс), может быть создан следующим образом:

Superclass.Subclass s = new Superclass.Subclass();

и для него не требуется экземпляр объекта суперкласса.

Надеюсь, это поможет!

1 голос
/ 18 ноября 2011

Вы создаете анонимный внутренний класс с

new ByteArrayOutputStream()

Вот почему вы видите файл MemoryMultiReportOutput$1.class.

Вам не нужно ничего делать для загрузки внутренних классов. Это произойдет автоматически.

Если вы спрашиваете, как получить доступ к внутреннему классу из другого класса, это немного отличается. Вам нужно будет пометить его public или предоставить метод доступа, который будет возвращать экземпляр класса. Это то, что вы спрашивали?

...