ArrayList 객체에 문자열을 추가하려면 어떻게 해야 합니까?

3807 단어 java 집합
다음과 같이 자바 파일을 작성합니다.
package org.danni.reflect_1;

import java.util.ArrayList;

public class ArrayListDemo {
    public static void main(String[] args) {
        // 
        ArrayList array = new ArrayList();

        array.add(10);

        System.out.println(array);
    }
}

xJad 역컴파일 파일을 사용하여 컴파일된 class 파일을 열면 다음과 같은 내용의 대응하는 class 바이트 코드 파일을 발견할 수 있습니다.
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi space 
// Source File Name:   ArrayListDemo.java

package org.danni.reflect_1;


import java.util.ArrayList;

public class ArrayListDemo
{

    public ArrayListDemo()
    {
    }

    public static void main(String args[])
    {
        ArrayList array = new ArrayList();
        array.add(Integer.valueOf(10));
        System.out.println(array);
    }
}

Class 파일에서dd 방법에서 강제 형식 변환이 진행되었음을 알 수 있습니다.Array List의 범주형은 사라졌다.이 범주형은 컴파일러에게만 보이는 것을 알 수 있다.이제 dd () 방법의 원본 코드를 다시 봅시다:dd 방법에서 전달하는 것은 반드시 E 형식이어야 합니다. 즉, 이곳의 Integer 형식입니다.
 public boolean add(E e) {
    ensureCapacity(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

따라서 우리는 Array List 대상에 문자열을 삽입하려면 그의class 바이트 파일을 얻으면 된다고 생각할 수 있다. 바이트 파일에서dd 방법에서 강제 형식 변환이 이루어졌기 때문에 우리는 어떤 종류의 매개 변수를 전달해도 된다.class 바이트 파일을 얻으려면 반사를 사용해야 한다는 생각이 자연스레 떠올랐다. 이 문제의 해결 답은 다음과 같다.
public class ArrayListDemo {
    public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
        // 
        ArrayList array = new ArrayList();

        // array , Class 
        Class c = array.getClass();

        // :( , class)
        //add(E e) : E, Object 
        Method m = c.getMethod("add", Object.class);

        m.invoke(array, " ");        // array add , 
        m.invoke(array, " ");
        System.out.println(array);
    }
}

출력:
[ ,  ]

좋은 웹페이지 즐겨찾기