反射学习小笔记
目的
区分getField()和getDeclaredField(),以及getFields()和getDeclaredFields()的获取的属性范围。
代码
Creatrue类(父类)
package day19;
public class Creature <T>{
public double weight;
private double height;
int id ;
protected String alias;
public Creature() {
super();
}
private Creature(double weight, double height, int id, String alias) {
super();
this.weight = weight;
this.height = height;
this.id = id;
this.alias = alias;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public void breath() {
System.out.println("breath");
}
void sleep() {
System.out.println("sleep");
}
private void eat() {
System.out.println("eat");
}
protected void running() {
System.out.println("running");
}
}
MyAnnotation注解类
package day19;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value();
}
MyInterface类
package day19;
import java.io.Serializable;
public interface MyInterface extends Serializable {
int t = 100;
}
Person类
package day19;
@MyAnnotation(value ="com")
public class Person extends Creature<String> implements MyInterface,Comparable{
public String name;
private int age;
protected double k; //测试;
float m; //测试;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
}
private Person(String name, int age, double k, float m) {
super();
this.name = name;
this.age = age;
this.k = k;
this.m = m;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@MyAnnotation(value="abc")
void show() throws Exception{
System.out.println("This is a person");
}
private void display() {
System.out.println("调用display");
}
protected void m() { //测试;
System.out.println("调用m");
}
public void show1(String a) {
System.out.println(a);
}
public static void show2() {
System.out.println("调用show3");
}
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
return 0;
}
}
测试代码
package day19;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import org.junit.Test;
public class TestFiled {
@Test
public void method0() throws ClassNotFoundException, NoSuchFieldException, SecurityException {
Class clazz = Class.forName("day19.Person");
System.out.println("--------------测试父类(包括接口)及类本身公共属性(public)--------------");
// 返回父类(接口)及其本身的public修饰的属性;
Field field1 = clazz.getField("weight");
System.out.println(field1);
Field[] field1s = clazz.getFields();
for (Field field : field1s) {
System.out.println(field);
}
System.out.println("--------------测试类本身所有属性(public,protected,默认,private)--------------");
Field field2 = clazz.getDeclaredField("age");
System.out.println(field2);
Field[] field2s = clazz.getDeclaredFields();
for (Field field : field2s) {
System.out.println(field);
}
System.out.println("--------------单独获取属性的修饰符、类型和名称--------------");
Field[] field3s = clazz.getDeclaredFields();
for (Field field : field3s) {
//需要转换一下;
System.out.print("权限修饰符:"+Modifier.toString(field.getModifiers()));
System.out.print("类型:"+field.getType().getName());
System.out.print("名称:"+field.getName());
System.out.println();
}
}
}
运行结果
总结
(1)getField()和getFields()方法能够获取类本身以及其父类(包括Object)、父接口中的公共属性即使用public关键字修饰的属性;
(2)getDeclaredField()和getDeclaredFields()方法只能够获取类本身所有的属性,包括public,protected,默认和private修饰的;