反射在框架中运用的非常多,想深入框架或者读框架源码必须懂反射。
优点:可以动态创建对象和编译,灵活性很高。
缺点:效率比较低。
Class类常用方法
三种通过反射获取类的Class对象的方法
1.通过类名.class获得。
Class<User> clazz = User.class;
2.通过Class.forName(" ")获得。
Class<?> clazz = Class.forName("com.test.model.User");
3.通过对象.getClass()获得。
User user = new User();
Class<? extends User> clazz = user.getClass();
常用方法总结
User user = new User();
Class<?> clazz = Class.forName("com.test.model.User");
/*Class<User> clazz = User.class;
Class<? extends User> clazz = user.getClass();*/
//获取类的名字
clazz.getName();
//获取类的包名+类名
clazz.getSimpleName();
//获取类的public属性,
Field[] fields = clazz.getFields();
//获取类的全部属性
Field[] declaredFields = clazz.getDeclaredFields();
//获取类的指定属性
Field name = clazz.getDeclaredField("name");
//关闭安全检测,能操作private属性
name.setAccessible(true);
//如果直接set或报错误,权限不足
name.set(user,"wocao");
//获取本类及其父类的全部public方法
Method[] methods = clazz.getMethods();
//获取本类的所有方法
Method[] declaredMethods = clazz.getDeclaredMethods();
//获取本类指定的public方法,可以是父类的
Method setName = clazz.getMethod("setName", String.class);
//通过获取的方法给对象设置值
setName.invoke(user, "niu");
//获取本类指定的public方法,
Method test = clazz.getDeclaredMethod("setName", String.class);
test.invoke(user, "test");
//获取全部构造器
Constructor[] constructors = clazz.getConstructors();
//获取指定的构造器
Constructor constructor = clazz.getConstructor(Integer.class, String.class);
User user1 = (User) constructor.newInstance(1, "niu");
//获取类的全部注解
Annotation[] annotations = clazz.getAnnotations();
//获取类的指定注解
Service annotation = clazz.getAnnotation(Service.class);
//获取该注解的value
String value = annotation.value();
//获取该类的属性
Field id = clazz.getDeclaredField("id");
//获取该属性的所有注解
Annotation[] annotations1 = id.getAnnotations();
//获取该类的指定注解
Value annotation1 = id.getAnnotation(Value.class);
//获取该注解的value
String value1 = annotation1.value();