天天看点

Java 反射机制之获取成员变量、构造器及成员方法介绍及案例

(1)反射获取成员变量 

import java.lang.reflect.Field;

/*
    反射:
        (1) 获取Class类对象: Class class;
        (2) 获取成员变量
            Field[] getFields();获取用public修饰的成员变量
            Field getField(String name);获取用public修饰的指定方法名的成员变量

            Field[] getDeclaredFields();获取所有成员变量,包含private修饰的变量
            Field getDeclaredField(String name);获取指定变量名称的成员变量,可以获取private修饰的成员变量

            对成员变量进行赋值和取值
                void set(Object obj,Object value);对成员变量进行赋值
                get(Object obj);获取成员变量的值
            对私有成员变量进行操作时,需要忽略访问修饰符的安全检查。代码如下
                setAccessible(true);忽略暴力反射
 */
public class Demo {
    //反射机制获取成员变量的方法案例
    public static void main(String[] args) throws Exception {
        //获取person类的class对象
        Class<person> personClass = person.class;
        //获取public修饰的成员变量
        Field[] fields = personClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }

        //获取指定名称的成员变量
        Field a = personClass.getField("a");
        //对指定名称的成员变量进行操作,get和set方法中必须传入成员变量所在的对象
        person person = new person();
        a.set(person,"AA");//对person对象中的成员变量a进行赋值
        Object o = a.get(person);//获取person对象中成员变量a的值
        System.out.println(o);

        //获取所有的成员变量
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        //获取指定名称的成员变量(任何访问修饰符)
        Field name = personClass.getDeclaredField("name");
        //忽略访问修饰符安全权限
        name.setAccessible(true);
        name.set(person,"BB");//对person对象中的成员变量name进行赋值
        System.out.println(name.get(person));

    }

}
           

(2)反射获取构造器及成员方法

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/**
 * 反射
 *  获取构造方法
 *  (1)Constructor<?>[] getConstructors();获取类的字节码文件中所有的public修饰的构造器,之后调用newInstance获取对象
 *  (2)Constructor<T> getConstructor(类<?>... parameterTypes)获取类的字节码文件中指定的public修饰的构造器
 *
 *  (3)Constructor<?>[] getDeclaredConstructors();
 *  (4)Constructor<T> getDeclaredConstructor(类<?>... parameterTypes);
 *
 *  常用方法
 *  (1)newInstance();用于创建对象
 *
 *  获取成员方法
 *  (1)Method[] getMethods();获取类的字节码文件中的所有public修饰的成员方法
 *  (2)Method getMethod(String name,类<?>... parameterTypes);
 *
 *  (3)Method[] getDeclaredMethods();
 *  (4)Method getDeclaredMethod(String name,类<?>... parameterTypes);
 *
 *  常用方法
 *  (1)Object invoke(Object obj,Object... args);执行获取到的method方法
 *  (2)getName();获取方法名称
 */
public class Demo01 {
    public static void main(String[] args) throws Exception {
        //获取person的calss对象
        Class<person> personClass = person.class;

        //获取构造方法
        Constructor<person> constructor = personClass.getConstructor(String.class, int.class);
        //利用newInstance()方法获取一个对象
        person person = constructor.newInstance("AA", 18);
        System.out.println(person);

        //获取字节码文件中的成员方法
        Method eat = personClass.getMethod("eat");
        person p = new person();
        //执行invoke方法
        eat.invoke(p);

    }
}
           

person对象

package com.njau.day04;

import java.io.Serializable;
import java.util.Objects;

public class person implements Comparable<person>, Serializable {


    public String a;
    private String name;
    private int age;

    public person() {
    }

    public person(String name) {
        this.name = name;
    }

    public person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    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 boolean equals(Object o) {
        System.out.println(getClass());//通过反射获取当前类的类型,即person
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        person person = (person) o;
        return age == person.age &&
                Objects.equals(name, person.name);//使用Objects中的equals方法,可以避免空指针异常
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(person o) {
        return this.getAge()-o.getAge();//按年龄升序排序
    }
}