java反射知识点分享

92 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

反射机制

  • 程序在运行时,动态获取当前class的信息,比如方法的信息、注解信息、方法参数、属性

  • .java源代码 ->编译.class ->类加载器 ->jvm内存中

  • 目的:提供开发者能够更好地封装框架实现扩展功能

  • 缺点:在一个类中 定义了一个私有属性、方法,反射机制破解了这种似有属性

反射机制用途:

  1. 访问java对象的属性,方法,构造方法
  2. jdbc加载驱动连接class.forname
  3. spring容器IOC实例化对象
  4. 自定义注解
  5. 第三方核心框架 mybatis orm
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {

    //反射机制

    //获取class

    //.class文件

    Class userEntityClass = UserEntity.class;

    //默认执行无参构造函数

    UserEntity userEntity = (UserEntity)userEntityClass.newInstance();

    /**

     * 类的完整地址,包名+类名

     */

    //2、Class.forName

    Class<?> aClass = Class.forName("com.lijianb.jdk8.entity.UserEntity");

    System.out.println(aClass == userEntityClass);

    //3 new UserEntity().getClass()

    UserEntity userEntity1 = new UserEntity();

    Class<? extends UserEntity> aClass1 = userEntity1.getClass();

    System.out.println(aClass == aClass1);

}
//给私有属性赋值
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException {

    Class<?> aClass = Class.forName("com.lijianb.jdk8.entity.Users");

    Users users = (Users) aClass.newInstance();

    Field pubUeserName = aClass.getDeclaredField("userName");

    //可以访问私有属性

    pubUeserName.setAccessible(true);

    pubUeserName.set(users,"xx");

    System.out.println(users.getUserName());

    //获取当前类和父类的公共属性

    //Field[] fields = aClass.getFields();

    //全部属性

    Field[] fields = aClass.getDeclaredFields();

    for(Field field: fields){

        System.out.println(field);

    }

}
//获取方法
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {

    Class<?> aClass = Class.forName("com.lijianb.jdk8.entity.Users");

    Object o = aClass.newInstance();

    //只能拿到公共的方法

    //Method aaMethod = aClass.getMethod("aaMethod");

    //获取全部

    //Method aaMethod =aClass.getDeclaredMethod("aaMethod");

    Method bbMethod = aClass.getDeclaredMethod("bbMethod", Integer.class, Integer.class);

    bbMethod.setAccessible(true);

    //反射机制获取方法

    Integer invoke = (Integer) bbMethod.invoke(o, 1, 2);

    System.out.println(invoke);

}
//反射机制越过泛型检查
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {

    ArrayList<String> str = new ArrayList<>();

    Class<? extends ArrayList> aClass = str.getClass();

    Method add = aClass.getDeclaredMethod("add", Object.class);

    add.invoke(str,1);

    System.out.println(str);

}