什么是反射?
反射是在java程序运行过程中,对于任意的类,都能获取类的属性和方法,可以调用他的任意方法和构造函数,对属性进行赋值,这种机制我们称之为反射。 
反射理解
理解反射之前,我们需要了解类的基本信息
一个类有:名称,包路径,修饰符,成员属性,构造函数以及普通函数等。
java反射是基于类的class 来获取类的信息。所以了解反射前了解以类class几中获取方式。

public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        /**
         * class 的四种获取方式
         */
        Class  clazz1 = User.class;
        Class  clazz2 = Class.forName("com.cui.reflect.User");
        Class  clazz3 = new User().getClass();
        Class  clazz4 = ReflectDemo.class.getClassLoader().loadClass("com.cui.reflect.User");
    }
}

我们说反射可以动态获取类对象信息并且对类中属性动态赋值,反射到底怎么做到的,通过下面一个简单的例子感受一下

    //常规创建一个对象并且赋值
    User user1 = new User();
    user1.setName("zhangsan");
    
    //使用反射
    Class clazz = User.class;
    //反射创建对象
    User user2 = (User) clazz.newInstance();
    //获取指定字段
    Field name = clazz.getDeclaredField("name");
    //因为字段是私有的 需要设置强制访问
    name.setAccessible(true);
    //设置字段值
    name.set(user2, "zhangsan");
    System.out.println(user2.getName());
    
反射常用API以及理解
  1. 获取类名和包路径

        //获取类的名称 ->User
        String simpName = clazz.getSimpleName();
        //类的全名称  com.cui.reflect.User
        String fullName = clazz.getName();
  2. 获取类的修饰符

        //类修饰符  返回int 类型  1:public  2:private 4:protected 8: static
        // 16:final 32: syncharonized 64:volatie 128: transient  256: native
        clazz.getModifiers();
  3. 获取类的构造函数

        //无参构造器
        Constructor<User> constructor = clazz.getConstructor();
        User o1 = constructor.newInstance();//构建对象
        //有参构造器
        Constructor<User> constructor1 = clazz.getConstructor(String.class, int.class);
        User o2 = constructor1.newInstance("zhangsan", 2);//构建对象

崔厚民
2 声望0 粉丝