Java反射基础

Java反射基础

Class对象功能:

  • 获取功能:
  1. 获取成员变量们
  • Field[] getFields() :获取所有public修饰的成员变量
  • Field getField(String name):获取指定名称的 public修饰的成员变量
  • Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符
  • Field getDeclaredField(String name)
  1. 获取构造方法们
  • Constructor<?>[] getConstructors()
  • Constructor getConstructor(Class<?>… parameterTypes)
  • Constructor getDeclaredConstructor(Class<?>… parameterTypes)
  • Constructor<?>[] getDeclaredConstructors()
  1. 获取成员方法们:
  • Method[] getMethods()
  • Method getMethod(String name, Class<?>… parameterTypes)
  • Method[] getDeclaredMethods()
  • Method getDeclaredMethod(String name, Class<?>… parameterTypes)
  1. 获取全类名
  • String getName()

Field:成员变量

  • 操作:
  1. 设置值
  • void set(Object obj, Object value)
  1. 获取值
  • get(Object obj)
  1. 忽略访问权限修饰符的安全检查
  • setAccessible(true):暴力反射

Constructor:构造方法

  • 创建对象:
  • T newInstance(Object… initargs)
  • 如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法

Method:方法对象

  • 执行方法:
  • Object invoke(Object obj, Object… args)
  • 获取方法名称:
  • String getName:获取方法名

Person类

public class Person {
    private String name;
    private int age;
    public String a;
    protected String b;
    String c;
    private String d;

    public Person() {
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", a='" + a + '\'' +
                ", b='" + b + '\'' +
                ", c='" + c + '\'' +
                ", d='" + d + '\'' +
                '}';
    }

    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;
    }

    public void eat(){
        System.out.println("eat...");
    }

    public void eat(String food){
        System.out.println("eat..." + food);
    }
}

获取class对象

获取class对象有三种方式

public class ReflectDemo01 {
    /*
        获取Class对象方式:
            1.Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
            2.类名.class:通过类名的属性class获取
            3.对象.getClass():getClass()方法在Object类中定义着
     */
    public static void main(String[] args) throws Exception {
        //1.Class.forName("全类名")
        Class cls1 = Class.forName("demo02.domain.Person");
        System.out.println(cls1);

        //2.类名.class
        Class cls2 = Person.class;
        System.out.println(cls2);

        //3.对象.getClass()
        Person p = new Person();
        Class cls3 = p.getClass();
        System.out.println(cls3);

        //== 比较三个对象
        System.out.println(cls1 == cls2);
        System.out.println(cls1 == cls3);

        Class c= Student.class;
        System.out.println(c == cls1);
    }
}

获取成员变量

/**
 * Class对象功能:
 *  获取功能:
 *   1.获取成员变量们
 *      Field[] getFields()
 *      Field getField(String name)
 *
 *      Field[] getDeclaredFields()
 *      Field getDeclaredField(String name)
 */
public class ReflectDemo02 {
    public static void main(String[] args) throws Exception {
        //0.获取Person的Class对象
        Class personClass = Person.class;
        //Field[] getFields() 获取所有的public修饰的成员方法
        Field[] fields = personClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }

        System.out.println("--------------");
        //2.Field getField(String name) 获取指定的public修饰的成员变量
        Field a = personClass.getField("a");
        System.out.println(a);
        //获取成员变量a的值
        //Object get(Object obj) 返回该所表示的字段的值 Field ,指定的对象上。
        Person p = new Person();
        Object value = a.get(p);
        System.out.println(value);
        //设置a的值
        //void set(Object obj, Object value)将指定对象参数上的此 Field对象表示的字段设置为指定的新值。
        a.set(p,"张三");
        System.out.println(p);

        System.out.println("=======================");

        //Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        //Field getDeclaredField(String name)
        Field d = personClass.getDeclaredField("d");
        //忽略访问权限修饰符的安全检查
        d.setAccessible(true);
        Object value2 = d.get(p);
        System.out.println(value2);
        d.set(p,"赵六");
        System.out.println(p);
    }
}

获取构造函数

/*
    Class对象功能:
        获取构造方法们
            Constructor<?>[] getConstructor()
                返回包含一个数组 Constructor对象反射由此表示的类的所有公共构造 类对象。
            Constructor<T> getConstructor<Class<?>... parameterTypes>
                返回一个 Constructor对象,该对象反映 Constructor对象表示的类的指定的公共 类函数。
                参数:
                    Class<?>... parameterTypes:指定的构造器变量类型的class
            Constructor<T> getDeclaredConstructor<Class<?>... parameterTypes>
                返回一个 Constructor对象,该对象反映 Constructor对象表示的类或接口的指定 类函数。
            Constructor<T>[] getConstructor()
                返回一个反映 Constructor对象表示的类声明的所有 Constructor对象的数组 类 。
    Constructor对象功能
        T newInstance(Object... initargs)创建对象
            使用此 Constructor对象表示的构造函数,使用指定的初始化参数来创建和初始化构造函数的声明类的新实例。
            如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法
 */
public class ReflectDemo03 {
    public static void main(String[] args) throws Exception {
        //0.获取Person的Class对象
        Class personClass = Person.class;
        //Constructor<T> getConstructor<Class<?>... parameterTypes>
        //获取带有String,int类型的构造器
        Constructor constructor = personClass.getConstructor(String.class,int.class);
        System.out.println(constructor);
        //创建对象
        Object person = constructor.newInstance("张三", 23);
        System.out.println(person);

        System.out.println("-------------------");

        //获取无参数的构造器
        Constructor constructor1 = personClass.getConstructor();
        System.out.println(constructor1);
        //创建对象
        Object person1 = constructor1.newInstance();
        System.out.println(person1);

       	//创建对象的简化
       	Object o = personClass.newInstance();
        System.out.println(o);
    }
}

获取成员方法

/*
    Class对象功能:
        获取成员方法们:
            Method[] getMethods()
            Method getMethod(String name,Class<?>... parameterTypes)

            Method[] getDeclaredMethods()
            Method getDeclaredMethod(String name,Class<?>... parameterTypes)
                Object invoke(Object obj, Object... args)
                    在具有指定参数的 方法对象上调用此 方法对象表示的底层方法。
 */
public class ReflectDemo04 {
    public static void main(String[] args) throws Exception {
        //0.获取Person的Class对象
        Class personClass = Person.class;

        //获取指定名称的方法
        Method eat_method = personClass.getMethod("eat");
        Person p = new Person();
        //执行方法
        eat_method.invoke(p);

        Method eat_method1 = personClass.getMethod("eat",String.class);
        //执行方法
        eat_method1.invoke(p,"饭");

        System.out.println("---------------------");

        //获取所有public修饰的方法
        Method[] methods = personClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
            //获取方法名
            String name = method.getName();
            System.out.println(name);
        }

        //获取类名
        String className = personClass.getName();
        System.out.println(className);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值