上文讲述了获取Class的四种方式,今天谈一谈如何通过反射类获取类的完整属性。
类的属性一般包括类的权限修饰符、属性的类型、属性名称以及方法等等,下面是我做的一个例子:
1.新建一个注解和接口
package tgb.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER,ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
String value();
}
package tgb.service;
import java.io.Serializable;
public interface MyInterface extends Serializable{
}
2.建立需要的类Creature和Person
package tgb.domain;
public class Creature<T> {
public int age;
}
package tgb.domain;
import tgb.annotation.MyAnnotation;
import tgb.service.MyInterface;
public class Person extends Creature<String> implements Comparable,MyInterface {
// 年龄
private String name;
// 身高
public int height;
public int compareTo(Object o){
return 0;
}
@MyAnnotation(value="tgb")
public void show(){
System.out.println("welcome to tgb");
}
}
上面的Person类继承了一个Creature,并实现了两个接口。下面介绍一下如何获取它们的有关属性结构。
获取属性的结构
我们经常写public int age;这样的声明,那么如何分开各自获取呢?
-----------------------------------------------------------------------------------------------------
1.获取类及其父类中声明为public的属性
<span style="font-family:KaiTi_GB2312;font-size:18px;"> //获取对应的运行时类的属性
@Test
public void test1(){
Class clazz =Person.class;
//1. getFields():只能获取到运行时类中及其父类中声明为public的属性
Field[] fields = clazz.getFields();
for(int i =0;i<fields.length;i++){
System.out.println(fields[i]);
}
}</span>
运行后的结果为:
-----------------------------------------------------------------------------------------------------
2.获取类本身声明的属性
//2.getDeclaredFields():获取运行时类本身声明的所有的属性
Field[] fields1 = clazz.getDeclaredFields();
for(Field f : fields1){
System.out.println(f.getName());
}
运行后的结果是:
-----------------------------------------------------------------------------------------------------
3.获取本类中完整属性
//权限修饰符 变量类型 变量名
// 获取属性的各个部分的内容
@Test
public void test2(){
Class clazz =Person.class;
Field[] fields1 =clazz.getDeclaredFields();
for(Field f : fields1){
//1.获取每个属性的权限修饰符
int i =f.getModifiers(); //public代表1
String str1 = Modifier.toString(i);
System.out.println(str1);
//2.获取每个属性的变量类型
Class type = f.getType(); // int类型什么的
System.out.println(type.getName() + "");
//3.获取属性名
System.out.println(f.getName());
System.out.println();
}
}
运行结果为:
这些都是反射的基础,是我们要了解的内容,这里只是介绍了如何获取类中声明的属性,而方法中也有这些,不过获取方法的完整结构方法比较多,我们在下篇介绍...