反射
1.反射的基本概述
反射是一个功能强大且复杂的机制,框架设计的灵魂,一般写应用程序时不会用到,当为其他java程序员构建工具时,他的作用就能体现出来。
反射作用:
- 将类的各个组成部分封装成其他对象
- 在运行时分析类的能力
- 在运行时检查对象
- 实现泛型数组操作代码
- 利用Method对象
反射优点:
- 可以在程序运行过程中,操作这些对象
- 可以解耦,提高程序的可扩展性
2.Class类
2.1 Class对象获取方式
2.1.1 Class.forName(包名.类名);
Class.forName("com.zk.fanshe.Person");
Class.forName("java.util.Random");
2.1.2 T.class
Class personClass = Person.class;
Class randomClass = Random.class;
Class aClass = int[].class;
Class intClass = int.class;
2.1.3 对象.getClass();
Random random = new Random();
random.getClass();
2.2 Class类常用方法
2.2.1 获取成员变量Field
Field[ ] getFields()
getFields()方法是获取本类或父类以public修饰的成员变量
Field[] fields1 = Random.class.getFields();
Field getField(String name)
getField(String name)方法获取本类或父类指定名称的public修饰的成员变量
Class personClass = Person.class;
Field s1 = personClass.getField("s1");
Field[] getDeclaredFields()
getDeclaredFields()方法获取本类所有的成员变量
Class personClass = Person.class;
Field[] declaredFields = personClass.getDeclaredFields();
Field getDeclaredField(String name)
getDeclaredField(String name)方法获取本类指定名称的成员变量
Class personClass = Person.class;
Field sm = personClass.getDeclaredField("gj");
Field对象简单使用
- Object get(Object obj) 获取所传递的对象所对应的成员变量的值
- void set(Object obj, Object value) 设置所传递的对象所对应的成员变量的值
- setAccessible(boolean flag) 忽略访问权限修饰符的安全检查,暴力反射,设置为ture时就可以对任何权限的变量进行获取和设置了
Class personClass = Person.class;
Field sm = personClass.getDeclaredField("gj");
Person person = new Person();
sm.setAccessible(true);
sm.set(person,"ss");
sm.get(person);
2.2.2获取构造方法Constructor
Constructor<?>[] getConstructors()
该方法获取类中所有的公开的构造方法
Class personClass = Person.class;
Constructor[] constructors = personClass.getConstructors();
Constructor getConstructor(Class<?>… parameterTypes)
该方法获取指定类型参数的公开的构造方法
Class personClass = Person.class;
Constructor constructor = personClass.getConstructor(String.class);
Constructor<?>[] getDeclaredConstructors()
该方法获取类中所有的构造方法
Class personClass = Person.class;
Constructor[] declaredConstructors = personClass.getDeclaredConstructors();
Constructor getDeclaredConstructor(Class<?>… parameterTypes)
该方法获取指定类型参数的构造方法
Class personClass = Person.class;
Constructor declaredConstructor = personClass.getDeclaredConstructor(String.class);
Constructor对象简单使用
- T newInstance(Object … initargs) 创建对象
- void setAccessible(boolean flag) 忽略访问权限修饰符的安全检查
Class personClass = Person.class;
Constructor declaredConstructor = personClass.getDeclaredConstructor(String.class,int.class,String.class,int.class);
declaredConstructor.setAccessible(true);
Object o = declaredConstructor.newInstance("11",12,"aa",15);
2.2.3 获取方法Method
Method[] getMethods()
该方法获取所有公开的方法包括父类的
Class personClass = Person.class;
Method[] methods = personClass.getMethods();
Method getMethod(String name, Class<?>… parameterTypes)
该方法获取指定的公开的方法包括父类的
Class personClass = Person.class;
Method method = personClass.getMethod("setFy", String.class);
Method[] getDeclaredMethods()
该方法获取本类所有的方法
Class personClass = Person.class;
Method[] declaredMethods = personClass.getDeclaredMethods();
Method getDeclaredMethod(String name, Class<?>… parameterTypes)
该方法获取本类的指定的方法
Class personClass = Person.class;
Method setGj = personClass.getDeclaredMethod("setGj", String.class);
Method的简单使用
- void setAccessible(boolean flag) 忽略访问权限修饰符的安全检查
- Object invoke(Object obj, Object… args) 执行方法
- String getName() 获取方法名
Class personClass = Person.class;
Method setGj = personClass.getDeclaredMethod("setGj", String.class);
setGj.setAccessible(true);
Person person = new Person();
setGj.invoke(person,"aaaa");
String name = setGj.getName();
2.2.4 Class,Metho,Field对象共有常用方法
getAnnotation(Class annotationClass)方法
获取指定注解
<A extends Annotation> A getAnnotation(Class<A> annotationClass)
Shi annotation = mainClass.getAnnotation(Shi.class);
isAnnotationPresent(Class<? extends Annotation> annotationClass)方法
判断是否有指定注解
boolean annotationPresent = mainClass.isAnnotationPresent(Shi.class);