2014-01-19 2 views
-3

Я хочу отразить объект MyRow, а затем получить объект MyTable, как мне это сделать?Использование отражения в Java для создания нового экземпляра?

Это мой Java-код:

import java.util.*; 
import java.text.*; 
import java.util.concurrent.*; 
import java.lang.reflect.*; 

class MyTable { 
    private MyRows rows; 
    private List columns; 

    public List getColumns(){return this.columns;} 
} 

class MyRows extends ArrayList<MyRow> {//... 
} 

class MyRow { 
    protected MyTable table; 
    private List<Object> data; 

    private MyRow(MyTable p_table) { 
     this.table = p_table; 
     this.data = Collections.synchronizedList(new ArrayList(this.table.getColumns().size())); 
    } 
} 

public class Test2 { 
    public static void main(String args[]){ 
     try{ 
     MyTable myTable = new MyTable();   
     MyRows myRows = new MyRows(); 

     Constructor ctor = MyRow.class.getDeclaredConstructor(MyTable.class); 
     ctor.setAccessible(true); 
     MyRow myRow = (MyRow)ctor.newInstance(myTable); // Error: ava.lang.reflect.InvocationTargetException ??? how should I do here 
     System.out.println(myRow); 
     myRows.add(myRow); 
     // myTable.rows = myRows; 
     }catch(Exception e){ e.printStackTrace();} 
    } 
} 

И я не знаю, почему эту Exception, который может помочь мне, пожалуйста :(

F: \ Java> JAVAC test2. Java ...

F: \ Java> Java Test2 java.lang.reflect.InvocationTargetException в sun.reflect.NativeConstructorAccessorImpl.newInstance0 (Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 

    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou 

RCE) в java.lang.reflect.Constructor.newInstance (Unknown Source) в Test2.main (Test2.java:34) Вызванный:. Java.lang.NullPointerException в MyRow (Test2.java : 22) ... 5 более

F: \ Java

+3

Я думаю, вы найдете то же самое исключение, которое будет выброшено, если вы попытаетесь создать экземпляр 'MyRow', как правило, без отражения. – yshavit

ответ

6

MyTable не инициализирует переменную rows, поэтому при попытке вызвать метод на него, вы получите InvocationTargetException. Если вы посмотрите на дно, вы увидите, что это вызвано NullPointerException.

+0

Потому что 'columns' имеет значение null в' this.table.getColumns(). Size() '. – Radiodef

+0

О, я вижу сейчас. Ты прав. Почему я не подумал об этом. если бы я мог уйти, чтобы позволить java рассказать мне больше деталей, таких как «NullPointerException» .. Это моя ошибка. Это была самая большая ошибка – liango

Смежные вопросы

 Смежные вопросы