[英]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.