1.反射
通过照镜子(Class)后可以得到的信息:
比如能看到属性,方法,构造器,继承某个类,实现某些接口
方法上的注解,都可以通过反射获取到
Reflection(反射)是Java被视为动态语言的关键,
反射机制允许程序在执行期借助于Reflection API取得任何类的內部信息,并能直接操作任意对象的内部属性及方法。
2.Class类
Class是描述类的。包含信息如方法,构造器,属性...
Class 对象只能由系统建立对象
一个类在 JVM 中只会有一个Class实例
每个类的实例都会记得自己是由哪个 Class 实例所生成
3.获取Class的3中方式
//1.可以通过类的.class静态属性获取
Class clazz = String.class;
//2.可以通过对象的getClass方法获取
Class clazz = "AA".getClass();
//3.可以通过Class类的静态方法forName获取
//全类名:包名+类名.如果找不到,会抛出ClassNotFoundException
Class clazz = Class.forName("java.lang.String");
4.可以使用反射给类创建对象
Class类中方法
newInstance() :为类创建对象.注意点:要求类下需要提供一个空参的构造器
如:
Class clazz = Person.class;
Object obj = clazz.newInstance();
5.类加载器
系统类的加载器,负责加载用户自定义的类。就是classpath下类
那么也可以加载classpath下的资源文件
如:
在src下建立文件test.properties
对应着在bin下也存在该文件
//this.getClass().getClassLoader():系统类加载器
//getResourceAsStream("test.properties"):加载文件作为输入流
InputStream in = this.getClass().getClassLoader().getResourceAsStream("test.properties");
6.使用反射获取方法&调用方法
Class下的方法:
getMethods() :返回类中的可见的方法(包含父类的)的Method数组
* getMethod(String name, Class<?>... parameterTypes) :
* 获取指定方法。 name:方法的名字 Class:方法的参数类型
* getDeclaredMethods() :获取类中声明的方法(不包含父类的),可以获取私有的
* getDeclaredMethod(String name, Class<?>... parameterTypes)
* 获取指定方法。 name:方法的名字 Class:方法的参数类型
Method类
代表方法的类
getName():得到方法的名字
invoke(Object obj, Object... args) :调用方法.obj代表哪个对象,args:方法需要传入的参数
对于私有方法需要在调用之前设置可访问的
method.setAccessible(true);
7.使用反射获取属性和调用属性
Class下的方法
* getFields():获取类下所有的可见的属性
* getField(String name):获取指定的属性
* getDeclaredFields():获取类下声明的属性(包括私有的属性)
* getDeclaredField(String name):获取指定属性,包括私有的属性
*
* Field类
* 代表着属性的类
* getName():获取属性的名字
* set(Object obj, Object value):设置属性的值。obj:哪个对象 value:给属性设置的值
* get(Object obj):获取属性的值。obj代表哪个对象
*
在操作私有属性的时候,需要在之前设置可访问
* field.setAccessible(true);
8.使用反射获取和调用构造器(了解)
Class下的方法:
* getConstructors():获取所有的构造器组成Constructor数组
* getConstructor(Class... parameterTypes):获取指定的构造器
*
Constructor类
* 代表着构造器的类
* newInstance(Object... initargs) :调用构造器,创建对象
9.通过反射提取注解信息
getAnnotation(Class<T> annotationClass) :获取指定注解
getAnnotations() :获取所有的注解
10.反射与泛型结合使用
Class类下的方法
getSuperclass() :得到父类的Class
getGenericSuperclass() :得到带泛型的父类
Type:
所有类型的接口
Class类实现了此接口
子接口:
ParameterizedType:代表着带泛型的类型
方法:
getActualTypeArguments() :返回所有的泛型类型的Type数组
java 反射
最新推荐文章于 2024-10-01 18:51:18 发布