【问题标题】:Dealing with `Array.clone()` not showing up via reflection处理 `Array.clone()` 未通过反射显示
【发布时间】:2016-02-18 05:20:18
【问题描述】:

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

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.Method 的功能与Array#clone 一起使用?我可以想象一个内置的或自写的 Proxie,让我在这种特殊情况下保留 Method 的功能。

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

【问题讨论】:

    标签: java arrays reflection clone


    【解决方案1】:

    作为一个类,数组类有点奇怪,它们自己没有很多有用的方法,依赖于辅助类,因为它们没有任何扩展手段而不改变语言。

    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(),使其可访问。

    【讨论】:

      猜你喜欢
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多