反射的使用
1、获取类的三种方式
1、 Class.forName("com.yyds.reflect.entity.User"); 2、 User.class 3、 New User().getClass();
2、获取构造函数
1、 getDeclaredConstructors(); //获取所有的构造函数 2、 getDeclaredConstructor(Class<?>... parameterTypes); // 获取一个所有的构造函数, 参数为构造方法的参数类型 3、 getConstructors(); //获取所有公开的构造函数 4、 getConstructor(Class<?>... parameterTypes); //获取单个公开的构造函数, 参数为构造方法的参数类型
3、 获取修饰符
getModifiers(); //获取所有修饰符, 返回整数类型,如果有两个类型,则返回两个类型之和, 整数定义: 0 - 默认不写 1–public 2–private 4–protected 8–static 16–final 32–synchronized 64–volatile 128–transient 256–native 512–interface 1024–abstract
4、 获取名字
1、 getName(); // 返回全限定类名, 2、 getSimpleName(); //返回类名
5、获取包
Package package = clz.getPackage();
6、获取接口
Class[] interfaces = clz.getInterfaces();
7、 获取父类/超类
Class superclass = clz.getSupperclass();
8、获取方法
Method[] methods = clz.getMethods(); //获取所有公开的方法 for(Method method: methods){ system.out.println(method.getName()); }
Method method = clz.getMethod("earnMoney"); //获取单个的公开方法 method.invoke(clz.newInstance(), null);
Method[] methods = clz.getDeclaredMethods(); //获取所有方法 for(Method method:methods) { System.out.println(method.getName(); }
Method method = clz.getDeclaredMethod("earnMoney"); //获取当个所有的方法 Systemctl.out.println(method.getName());
9、 获取公开字段
1、 clz.getFields(); //获取所有公开字段 2、 clz.getField(String name); //参数可以指定字段,获取单个public 字段 3、 clz.getDeclaredFields(); // 获取所有的字段 4、clz.getDeclareField(String name): //获取单个字段,参数可以指定字段
10、 实例化对象
1、cl.newInstance(); //创建一个无参User对象 2、clz.getDeclaredConstructor().newInstance(); //创建一个User对象
11、 设置访问属性
1、 clz.setAccessible(true); //可以访问 2、 clz.setAccessible(false); //不可以访问 3、 Field name = clz.getField("userName"); //userName字段 name.setAccessible(true); //设为可访问 name.setAccessible(false); //设为不可访问
12、 使用方法
1、 Method method = clz.getMethod("earnMoney"); 2、 method.invoke(clz.newInstance(), null); //使用方法,null可不写
示例:
@SpringBootTest @Slf4j public class ClassTest { @Test public void classTest() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { // 获取class 对象的三种方式 log.info("根据类名: " + User.class); log.info("根据对象: " + new User().getClass()); log.info("根据全限定类名: " + Class.forName("com.yyds.reflect.entity.User")); // 常用方法 Class userClass = User.class; log.info("获取全限定类名: " + userClass.getName()); log.info("获取类名: " + userClass.getSimpleName()); log.info("实例化: " + userClass.newInstance()); log.info("有参构造实例化: " + userClass.getConstructor(String.class, String.class, String.class).newInstance("admin", "123456", "beijing"));; log.info("有参构造的修饰符" + userClass.getConstructor(String.class, String.class, String.class).getModifiers()); log.info("获取所有方法" + userClass.getMethods()); log.info("获取所有字段" + userClass.getFields()); } }
结果: