Java反射错误与抽象类别



使用java反射使用抽象类Poligono检索所有字段值,它创建的问题:第一个是getDeclaredFields()确实没有返回(数组的0个值,而不是三个值,而不是三个字段班级)和field.get(object)提高unreported exception IllegalAccessException

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);
    }
}

要访问超类属性,您可以做到这一点:

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

我看不到get()调用上的问题。(使用上述片段时)

最新更新