请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

如下是示例代码

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();

正在回答 回答被采纳积分+3

1回答

翔仔 2021-01-20 23:37:12

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

0 回复 有任何疑惑可以回复我~
  • 提问者 慕沐3053333 #1
    我的意思是上述代码运行到        
    Constructor<ContainerHolder> constructor = clazz.getDeclaredConstructor();
    会报NoSuchMethodException错误,翻译过来不就是获取不到无参的构造函数吗?但是枚举类里你自己不是定义了一个无参的构造函数吗,为什么会获取不到?
    回复 有任何疑惑可以回复我~ 2021-01-21 00:28:11
  • 提问者 慕沐3053333 #2
    是不是因为反编译之后的class文件没有了无参的构造函数,变成了参数是String和int的构造函数?
    回复 有任何疑惑可以回复我~ 2021-01-21 00:30:05
  • 翔仔 回复 提问者 慕沐3053333 #3
    看看这个就明白了 https://www.jianshu.com/p/ec811fc70b08
    回复 有任何疑惑可以回复我~ 2021-01-21 22:10:31
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信