反射
概念:之前我们都是先设计一个类,然后通过这个类的实例来获取属性和方法,而其实我们还可以先得到p这个类的Class对象,然后再通过Class对象获取属性和方法,这样的好处是可以获取所有属性和方法,即使是private修饰的。
- 反射是java动态性的一种体现。
获取Class对象
概念:获取Class对象有三种方式:
- instance.getClass():要求必须得先有实例。
- 类名.class:很便捷,但是属于硬编码,对于DK中自带的类型,推荐使用这种。
- class.forName(qualifiedName)’:不是硬编码,对于自定义的类型,推荐使用这种。
获取构造方法
概念:Class常用API方法:
- 'Constructor<?>[ ] getConstluctors():获取类的所有public修饰的方法。
- Constructor<?> [] getDeclaredConstructors():获取类的所有方法。
- Constructor getConstructor():获取指定的一个public构造方法。
- ’ Constructor getDeclaredConstructor()`:获取指定的一个构造方法。
使用构造方法
- 使用Constructor类中的newInstance()方法就等同使用new来调用构造器的效果。
- setAccessible(true);:开启私有访问权限。
获取成员属性
概念:通过class获取成员属性的相关API方法:
- Field[] getFields():获取类的所有public修饰的属性。
- Field[] getDeclaredFields():获取类的所有属性。
- Field getField():获取指定的一个public属性。
- Field geTDeclaredField():获取指定的一个属性。
使用成员属性**
概念:Field类的常用API:
- set(实例,值):往哪个实例的对应属性中设置值。
- get(实例):从哪个实例中取出对应属性的值。
获取成员方法
概念:通过class获取成员方法的相关API方法:
- Method[ getMethods():获取类的所有public修饰的方法,包括继承下来的public方法。
- Method[] getDeclaredMethods()’:获取类的所有方法,不包括继承下来的public方法。
- Method getMethod():获取指定的一个public方法。
- Method getDeclaredMethod():获取指定的一个方法。
反射注解
概念:注解信息可以从类,属性或方法上获取,常用API方法如下:
- getAnnotations():获取类,属性或方法上的所有的注解,包括继承来的。
- getDeclaredAnnotations():获取类,属性或方法上的注解,不包括继承来的
- getAnnotation(注解名):获取类,属性或方法上的某个注解,包括继承来的。
- getDeclaredAnnotation(注解名):获取类,属性或方法上的某个注解,不包括继承来的。
数组的CLass对象
概念:判断数组的Class对象是否相同的时候,只比较它们的类型和维度。
/**
* @author liusichang
*/
public class ArrayClass {
@Test
public void arrayClass(){
//数组反射
Class<?> array01=new int[10].getClass();
Class<?> array02=new int[20].getClass();
Class<?> array03=new int[20][10].getClass();
Class<?> array04=new double[10].getClass();
Class<?> model=int[].class;
System.out.println(array01==array02);
System.out.println(array01==array04);
System.out.println(array01==array03);
}
}
代码j260.6