反射(二)------类的属性获取

反射学习小笔记

目的

区分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();
        }
    }
}

运行结果

709915-20190111094025449-829726013.png

总结

(1)getField()和getFields()方法能够获取类本身以及其父类(包括Object)、父接口中的公共属性即使用public关键字修饰的属性;
(2)getDeclaredField()和getDeclaredFields()方法只能够获取类本身所有的属性,包括public,protected,默认和private修饰的;

转载于:https://www.cnblogs.com/SnailsRunning/p/10253633.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值