java通过反射访问Integer构造函数

yonutix

我有这段代码。为什么它不起作用?(工作时它显示3)如何解决?

public class Main {
    public static<V> V copy(V var){
        try{ 
            return (V) var.getClass().getConstructor(var.getClass()).newInstance(var);
        }
        catch(Exception e){
            System.out.println("Copy faield " + e.getMessage() + " ");
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        Integer a = new Integer(3);
        Integer b = copy(a);

        System.out.println(a);
        System.out.println(b);


    }
}

这是输出:

 Copy faield java.lang.Integer.<init>(java.lang.Integer) 
    java.lang.NoSuchMethodException: java.lang.Integer.<init>(java.lang.Integer)
        at java.lang.Class.getConstructor0(Class.java:2818)
        at java.lang.Class.getConstructor(Class.java:1723)
        at Main.copy(Main.java:7)
        at Main.main(Main.java:19)
    3
    null

谢谢!

波希米亚风格

这里的问题是两者之间的区别:

Integer.class
int.class

对于整数的构造函数的int参数,不是一个Integer

为了使魔术方法起作用,您需要对类型进行特殊检查,如果它是包装器类,则实际上要查找其参数为对应的原始类型的构造函数。

AFAIK没有内置的方法可以从包装器类中获取primatove类-您可以使用映射并使用映射填充它:

private static final Map<Class<?>, Class<?>> MAP = new HashMap<>() {{
    put(Integer.class, int.class);
    put(Long.class, long.class);
    // etc
}};

然后在您的方法中:

Class<?> type = MAP.containsKey(var.getClass()) ? MAP.get(var.getClass()) : var.getClass();
return (V) var.getClass().getConstructor(type).newInstance(var);

可以在参数值中将传递intInteger-至少可以自动取消装箱。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

通过反射从抽象基类访问构造函数

如何通过反射在Java中调用构造函数?

通过反射调用构造函数的性能

尝试通过反射访问内部类构造函数的参数注释时出现 ArrayIndexOutOfBoundsException

在构造函数中传递java.lang.Integer的参数时,发生NoSuchMethodException(反射)

有没有办法通过反射识别 Java 16 记录的规范构造函数?

如果类引用原始类型,则所有访问通过ASM生成的类的构造函数的反射方法都将引发NoClassDefFoundError。

Java:无法通过反射访问注释

如何在Dart中通过反射获取构造函数的参数?

通过Kotlin的反射来调用类的构造函数

如何通过反射获取原始包装器类构造函数?

使用构造函数通过反射实例化对象

Java反射调用具有原始类型的构造函数

java - 在构造函数中使用反射设置最终字段

来自 Java 超类构造函数访问的 Kotlin 构造函数

反射找不到构造函数

Java:通过构造函数调用构造函数,有什么意义?

Java:通过反射(行为)访问私有字段

Java:通过反射访问对象的bean类型方法

为什么允许通过反射访问Java私有字段?

通过反射访问Java中的私有变量

通过Java中的反射访问私有继承的字段

Java通过反射访问私有财产

Java-通过反射访问非静态属性

访问Java中受保护的构造函数

Java测验只访问构造函数

子类中的Java静态构造函数访问

Java | 从构造函数内部访问对象变量?

如何限制开发人员使用反射来访问Java中的私有方法和构造函数?