java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java反射

Java使用反射获取字段属性

作者:按时交作业

这篇文章主要为大家详细介绍了Java如何利用反射实现获取字段属性值,文中的示例代码讲解详细,具有很好的参考价值,希望对大家有所帮助

反射的使用

获得类的字段属性

下面是大Class提供的方法:

public class Main {
    public static void main(String[] args) throws Exception {
        Class stdClass = Student.class;
        // 获取public字段"score":
        System.out.println(stdClass.getField("score"));
        // 获取继承的public字段"name":
        System.out.println(stdClass.getField("name"));
        // 获取private字段"grade":
        System.out.println(stdClass.getDeclaredField("grade"));
    }
}
class Student extends Person {
    public int score;
    private int grade;
}
class Person {
    public String name;
}

分析

输出:

public int Student.score
public java.lang.String Person.name
private int Student.grade

通过getField()方法可以获得类的属性,传入参数(需要被查找的属性名),获得的是一个Field对象。

然后该Field对象里又有很多方法。

一个Field对象包含了一个字段的所有信息:

当使用getModifiers():返回字段的修饰符的值,当想要进一步判断时,需要使用Modifier类。

可以使用Modifier类中的相应方法来判断:

Field score = stdClass.getField("score");
int modifiers = score.getModifiers();
System.out.println(Modifier.isFinal(modifiers));

·····

上面是获得类的属性信息,下面介绍获得实例的属性值。

获得实例的字段值

Field类还有一个方法get(),参数:要获得属性值的对象。

public class Main {
    public static void main(String[] args) throws Exception {
        Object p = new Person("Xiao Ming");
        Class c = p.getClass();
        Field f = c.getDeclaredField("name");
        f.setAccessible(true);
        Object value = f.get(p);
        System.out.println(value); // "Xiao Ming"
    }
}
class Person {
    private String name;
    public Person(String name) {
        this.name = name;
    }
}

分析

大家可能看到我新加了一行f.setAccessible(true);

去试试去掉会怎么样,大家应该会出现class thread.Main cannot access a member of class thread.Person with modifiers "private", 这种情况表明我们没有权限去访问该字段的值。

默认情况下,由于私有字段有私有访问权限修饰,所以即使通过反射获得 Field 对象,只能获得它的一些字段信息。但是无法读取其值,

同理,获得属性值使用Field的get()方法,当为其设置值时可以使用set()方法,

参数为: 需要被设置属性的对象 传入的值。

比如: f.set(p, "guagua");

到此这篇关于Java使用反射获取字段属性的文章就介绍到这了,更多相关Java反射内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文