关于反射时获取构造函数报NoSuchMethodException错误的问题

来源:5-6 无视反射和序列化攻击的单例

慕沐3053333

2021-01-20

如下是示例代码

package demo.pattern.singleton;

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

public class EnumStarvingSingleton {
    private EnumStarvingSingleton(){}
    public static EnumStarvingSingleton getInstance(){
        return ContainerHolder.HOLDER.instance;
    }
    private enum ContainerHolder{
        HOLDER;
        private EnumStarvingSingleton instance;
        ContainerHolder(){
            instance = new EnumStarvingSingleton();
        }
    }

    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class<ContainerHolder> clazz = ContainerHolder.class;
        Constructor<ContainerHolder> constructor = clazz.getDeclaredConstructor();
        constructor.setAccessible(true);
        ContainerHolder newInstance = constructor.newInstance();
    }
}

我的问题是:
ContainerHolder枚举类不是有一个无参的构造函数吗?

		ContainerHolder(){
            instance = new EnumStarvingSingleton();
        }

那为什么下面这行代码获取不到对应的构造函数呢?

        Constructor<ContainerHolder> constructor = clazz.getDeclaredConstructor();
写回答

1回答

翔仔

2021-01-20

没太明白同学的意思,可以提供下证明,证明为什么获取不到构造函数。这里主要是没法获取里面的ContainerHolder.HOLDER.instance 从而保证 ContainerHolder.HOLDER.instance的唯一

0
3
翔仔
回复
慕沐3053333
看看这个就明白了 https://www.jianshu.com/p/ec811fc70b08
2021-01-21
共3条回复

剑指Java自研框架,决胜Spring源码

快速入门Spring核心源码+从零开发自研框架

1499 学习 · 495 问题

查看课程