繁体   English   中英

抽象类的Java反射错误

[英]Java reflection errors with abstract class

使用Java反射使用抽象类Poligono检索所有字段值会产生问题:首先是getDeclaredFields()确实不返回任何值field.get(object)该类为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()调用上看到问题。 (使用以上代码段时)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM