持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
反射机制
-
程序在运行时,动态获取当前class的信息,比如方法的信息、注解信息、方法参数、属性
-
.java源代码 ->编译.class ->类加载器 ->jvm内存中
-
目的:提供开发者能够更好地封装框架实现扩展功能
-
缺点:在一个类中 定义了一个私有属性、方法,反射机制破解了这种似有属性
反射机制用途:
- 访问java对象的属性,方法,构造方法
- jdbc加载驱动连接class.forname
- spring容器IOC实例化对象
- 自定义注解
- 第三方核心框架 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);
}