繁体   English   中英

使用公共构造函数 Java 声明一个私有 static 嵌套 class?

[英]Declare a private static nested class with a public constructor Java?

如何使用公共构造函数创建 static 私有内部 class 的实例?

public class outerClass<E> {
private static class innerClass<E> {
    E value;
    
    public innerClass(E e) {
        value = e;
    }
}}

我已经尝试过了,它给出了一个错误,即 out package 不存在

outerClass<Integer> out = new outerClass<Integer>();
out.innerClass<Integer> = new out.innerClass<Integer>(1);

我已经尝试过了,它给出了一个错误,即内部 class 是私有的并且无法访问。

outerClass<Integer>.innerClass<Integer> = new 
outerClass<Integer>.innerClass<Integer>(1)

new out.innerClass<Integer>(1);

但这没有意义。 innerClass声明为static ,表示 innerClass 与outerClass 它只是出于命名空间的目的而位于其中(并且,也许外部和内部可以访问private成员),但这就是它的终点。 所以, out ,作为outerClass的一个实例,没有业务存在。

new outerClass<Integer>.innerClass<Integer>(1)

这也没有任何意义 - 这里提到的外层类只是为了命名空间:告诉 java 你的意思是什么 class 。 因此,上面的<Integer>没有意义。

那我该怎么做呢?

new outerClass.innerClass<Integer>(1);

你没有提到约束,所以....

反思救援!

package com.example;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

import org.junit.Test;

import static org.junit.Assert.assertEquals;

public class ReflectionTest {

    public static class OuterClass<E> {
        private static class InnerClass<E> {
            E value;

            public InnerClass(E e) {
                value = e;
            }
        }
    }

    @Test
    public void should_instantiate_private_static_inner_class_w_reflection()
            throws ClassNotFoundException, NoSuchMethodException, NoSuchFieldException,
                   IllegalAccessException, InvocationTargetException, InstantiationException {

        Class<?> innerCls = Class.forName("com.example.ReflectionTest$OuterClass$InnerClass");
        Constructor<?> ctor = innerCls.getConstructor(Object.class);

        Object instance = ctor.newInstance(10);
        Field valueField = innerCls.getDeclaredField("value");
        valueField.setAccessible(true);
        Object value = valueField.get(instance);

        assertEquals(value, 10);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM