2017-03-06 82 views
0

使用Java反射檢索所有字段值使用抽象類Poligono它創建的問題:第一個是getDeclaredFields()確實沒有返回任何內容(一個0值的數組而不是三個字段內的類)和field.get(object)引發unreported exception IllegalAccessException抽象類的Java反射錯誤

import java.lang.reflect.*; 
import java.util.ArrayList; 

abstract class Poligono 
{ 
    int numVertici; 
    double base; 
    double altezza; 

    int getNumeroVertici() 
    { 
     return numVertici; 
    } 

    abstract double getArea(); 
    abstract double getPerimetro(); 
} 
class Triangolo extends Poligono 
{ 
    public Triangolo(double lato) 
    { 
     numVertici = 3; 
     base = lato; 
    } 

    public double getArea() 
    { 
     return ((base * base)/4) * Math.sqrt(3); 
    } 

    public double getPerimetro() 
    { 
     return base * 3; 
    } 
} 
class Rettangolo extends Poligono 
{ 
    public Rettangolo(double base_p, double altezza_p) 
    { 
     numVertici = 4; 
     base = base_p; 
     altezza = altezza_p; 
    } 

    public double getArea() 
    { 
     return (base * altezza)/2; 
    } 

    public double getPerimetro() 
    { 
     return 2 * (base + altezza); 
    } 
} 
class Geometrie 
{ 
    ArrayList<Poligono> lista; 

    public Geometrie() 
    { 
     lista = new ArrayList<Poligono>(); 
    } 

    public void aggiungi(Poligono p) 
    { 
     lista.add(p); 
    } 

    public int numeroPoligoni() 
    { 
     return lista.size(); 
    } 

    public boolean checkPoligono(Poligono p) 
    { 
     for (Poligono q : lista) 
     { 
      if (q.getClass().equals(p.getClass())) 
      { 
       Field[] fields = p.getClass().getDeclaredFields(); 

       System.out.println(fields.length); // length is 1 
       for (Field field : fields) { 
        field.setAccessible(true); //Additional line 
        System.out.println("Field Name: " + field.getName()); 
        System.out.println("Field Type: " + field.getType()); 
        System.out.println("Field Value: " + field.get(p)); // IllegalAccessException 
       } 
      } 
     } 
     return true; 
    } 
} 
public class Main 
{ 
    public static void main(String [] args) 
    { 
     Geometrie g = new Geometrie(); 
     Rettangolo r = new Rettangolo(2, 3); 
     Rettangolo r2 = new Rettangolo(2, 3); 

     g.aggiungi(r); 
     g.checkPoligono(r2); 
    } 
} 
+0

添加完整的堆棧跟蹤請 – Jens

+0

對於'IllegalAccessException',您可能需要'field.setAccessible(true);'在調用get之前。 –

+0

我在代碼中使用它 – user6542453

回答

3

要訪問超屬性,你可以這樣做:

p.getClass().getSuperclass().getDeclaredFields(); 

我沒有看到在get()通話問題。 (使用上面的代碼片段時)