反射学习
1、学习主要内容
反射听着很玄乎,其实也是特别简单的,一句话概括 “利用Class类来操作对象”
2、利用Class类来操作对象
1、首先要知道如何获取class
第一种:根据对象获取class
Class objClass = new Objct().getClass();
第二种:根据类名获取class 这种不用new
Class ObjClass = Object.class;
第三种:根据Class类中的方法获取对象(主要学习)
Class ObjClass = Class.forName("对象的完整路径")
例如:Class ObjClass = Class.forName("java.util.ArrayList")
扫描二维码关注公众号,回复:
12719496 查看本文章

2、利用class操作对象
第一步有了class,就可以获取class中很多好用的方法啦!!!
方法一:利用.newInstance()获取对象
Object obj = (Object)objClass.newInstance();
方法二:利用获取构造方法获取对象,优点是可以直接传入值,例如调用的构造方法 public Object(Long id) {this.id = id;}
一、获取public修饰的构造方法 不建议使用
Constructor<?> constructor = objClass.getConstructor(Long.class);
二、暴力获取构造方法传入 常用 可以访问private修饰的和public修饰的构造方法
Constructor<?> constructor = objClass.getDeclaredConstructor(Long.class);
//开启暴力访问
constructor.setAccessible(true)
//利用构造方法创建对象
Object obj = (Object)constructor.newInstance(1L);
方法三:获取字段传值
//获取私有构造对象 给字段赋值
Field idField = objClass.getDeclaredField("id");
idField.setAccessible(true);
idField.set(obj,1);
System.out.println(obj);
方法四:调用直接调用方法
//调用对象中的setId方法
Method setId = objClass.getDeclaredMethod("setId");
setId.invoke(obj,1);
System.out.println(obj);
//调用对象中的getId方法
Method getId = objClass.getDeclaredMethod("getId");
Integer id = (Integer)getId.invoke(obj);
System.out.println( );
方法五:抹除泛型 利用list来测试
//泛型是可以擦除的 调用list中add方法 给一个Integer泛型传入String类型
Class<?> listClass = Class.forName("java.util.ArrayList");
ArrayList<Integer> list = (ArrayList)listClass.newInstance();
list.add(111);
Method addMethod = listClass.getDeclaredMethod("add", Object.class);
addMethod.invoke(list, "aaa");
System.out.println(list);