获取运行时类的属性结构及其内部结构
这里我们说的属性结构的内部结构就是这的属性的权限修饰符和属性的数据类型还有变量名等等
获取运行时类的属性结构有两个方法:
-
getFields();
- 获取当前运行时类及其父类中声明为public访问权限的属性
- 返回值类型为: Field []类型
- 这个Field就是我们java中来表示属性的API
-
getDeclaredFields();
- 获取当前运行时类中声明的所有权限的属性(不包括父类中声明的属性)
- 返回值类型为Field[]
我们获取到运行时类的属性结构之后如果要获取属性结构具体的内部结构,这个时候我们就可以通过如下的方法来获得:
-
int getModifiers()
- 获取属性的权限修饰符
- 注意 : 这个方法的返回值类型为int型,用不同的int值表示了不同的权限修饰符
- 0 为 default , 1 为 public , 2 为 private , 4 为 protected , 8 为 static ,16 为 final , 32 为 synchronized , 64 为 volatile
- 以上的这些常量被定义在了Modifiers类中,如果我们要输出对应的权限修饰符,我们就要通过调用Modifier类中的toString()静态方法,通过这个toString()静态方法我们就可以将我们得到的int型的返回值转换为对应的权限修饰符
-
Class getType();
- 获取属性的数据类型
- 返回值类型为Class类型
- 这里我们注意我们获得到Class类型的返回值之后我们可以直接输出,这个时候直接输出就会输出Class对应的运行时类的对应类的类名(但是不是全类名),如果我们想要输出为全类名,这个时候我们可以通过这个Class类型的对象调用getName()方法就会返回这个Class类型对象对应的全类名
-
String getName();
- 获取属性名(变量名)
- 返回值类型为String
这里我们通过一个例子来理解如何获得运行时类的属性结构以及内部结构
这个例子中我们使用到了一个自定义类Person,我们先给出自定义类Person
package 反射.获取运行时类的成员;
import 注解.类型注解.MyAnnotation;
public class Person {
public int age;
protected String sex;
String name;
private int tizhong;
public Person(){
}
public Person(int age ,String sex , String name , int tizhong){
this.age = age;
this.sex = sex;
this.name = name;
this.tizhong = tizhong;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", sex='" + sex + '\'' +
", name='" + name + '\'' +
", tizhong=" + tizhong +
'}';
}
public void eat() throws Exception{
System.out.println("人类吃饭");
System.out.println("人类吃饭");
}
@MyAnnotation
public String play(int x , int y , String z){
return z;
}
//注意: 这个注解我们并没有给定生命周期,这个时候这个注解就默认为"class保留"
@注解.自定义注解.MyAnnotation
protected void see(){
}
private void feel(){
}
}
然后这里我们再给出例子(也就是测试程序)
package 反射.获取运行时类的属性结构和内部结构;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class Demo {
public static void main(String[] args) {
/*
获取运行时类的属性结构,这个时候获得的属性结构都是我们在Person类和Person类的父类中声明为public权限的属性
这个时候我们只是在Person类中声明了一个public权限的属性
*/
Field [] fields = Person.class.getFields();
for (Field f:
fields) {
System.out.println(fields);
}
/*
这个时候我们通过getDeclaredFields()方法获得的就是Person类中声明的所有的权限的方法(包括私有方法),但是注意,这个时候不会获得Person类父类中
的属性
*/
Field [] fields1 = Person.class.getDeclaredFields();
for (Field f1:
fields1) {
System.out.println(f1);
/*
这里我们再通过调用Field类中的方法来获取到对应的属性结构中的内部结构
*/
//1. 获取属性的权限修饰符
int modifiers = f1.getModifiers();
System.out.println(Modifier.toString(modifiers));
//2. 获取属性的数据类型
Class clazz = f1.getType();
System.out.println(clazz.getName());
//3. 获取属性名(变量名)
String s = f1.getName();
System.out.println(s);
}
}
}