处理`Array.clone()`没有通过反射显示

时间:2015-11-16 23:49:37

标签: java arrays reflection clone

我正在编写一个库,我想在特定类中查找具有特定名称的方法,并将其保存以供日后使用。我是通过反思这样做的:

public static Method findMethod(Class<?> instance_c, String name, Class<?> ... args_cs) {
    return instance_c.getMethod(name, args_cs);
}

现在问题如下:

    Class<?> c = int[].class;
    // int[] i = new int[2].clone();
    System.out.println(findMethod(c, "clone")); // Throws an exception

这是记录在案的行为:

  

方法java.lang.Class.getMethod(String name,Class ... parameterTypes):

     

[剪断]

     

如果此Class对象表示数组类型,则此方法找不到clone()方法。

有什么方法可以让我以某种方式使用java.lang.reflect.MethodArray#clone的功能?我可以想象一个内置或自写的Proxie,让我在这个特例中保留Method的功能。

如果我要进一步解释我特别使用Method的内容,请发表评论。我们的目标是尽可能地保持。

1 个答案:

答案 0 :(得分:3)

作为一个类,数组类有点奇怪,并且没有很多有用的方法依靠辅助类,因为它们没有任何扩展方式而不改变语言。

Object.clone()方法可用。

public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
    for(Method m : int[].class.getDeclaredMethods())
        System.out.println(m);
    for(Method m : int[].class.getSuperclass().getDeclaredMethods())
        System.out.println(m);
    Method clone = int[].class.getSuperclass().getDeclaredMethod("clone");
    clone.setAccessible(true);
    int[] ints = { 1,2,3 };
    int[] ints2 = (int[]) clone.invoke(ints);
    System.out.println(Arrays.toString(ints2));
}

打印

protected void java.lang.Object.finalize() throws java.lang.Throwable
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
private static native void java.lang.Object.registerNatives()
[1, 2, 3]

更简单地说,您可以在任何对象可访问后使用Object.clone()