Java关于 反射 的一些整理

来源:互联网 发布:eve online for mac 编辑:程序博客网 时间:2024/06/05 23:00
关于反射

反射的功能:
可以在运行期间获取任意对象的类型的信息
创建在编译期间完全位置的类的对象
编写一些通用的工具类

原来是通过类名创建对象,现在可以通过对象获取到类的信息

反射的根源:Class对象

所有的类具有共同的特征,那么就可以吧这些抽象成一个Java类描述它,用这个类,来描述所有类的特征,这个类就是Class类

每一个类都是Class类的对象
任意类型的对象,又都是Object的对象
比如String类型就是一个Class的对象


有四种方式可以拿到Class对象
1、类名.class      编写工具类时使用比较多
2、对象.getClass()
3、Class.forName("包名.类名")
4、ClassLoader.getSystemClassLoader().loadClass("包名.类名")
        得到了类加载器
5、通过自定义类加载器,类加载器对象.loadClass("包名.类名")
类型可以在编译期间未知,但是在运行期间必须存在可以找到

反射的步骤:
1、获取Class对象
2、通过Class对象,可以:
创建Class对象对应的类型的实例
获取所有的信息(包、类名、属性。。。)
访问定义的实例的属性
设置实例的属性值
调用任意一个方法
eg:
获取包名,是个Package类型,意思就是所有的包也都具有相同的特征,于是就可以抽象成一个类
修饰符的获取,会返回数字,会吧多个修饰符一起返回
Modifier.toString(数字) 就能得到修饰符了

Java中所有类的属性,也都具有相同的一些特征,就可以抽象成一个类Filed,每个属性都是Field的对象
getFiled:获取公共属性
getDeclaredField:获取所有声明的属性

clazz.newInstance() 可以创建一个对象,仅仅用于无参的公共的构造器
否则,要先取到构造器getDeclaredConstructor(形参列表)
然后就可以 构造器.newInstance(实参列表)

私有的属性如果访问的时候,要避免安全检查
setAccessible(true)
get(obj) 获取某个对象的属性
set(obj,value) 把某个对象的属性设置成value

Java的方法也都具有一些共同的特征,于是就可以抽象成Method类,每一个方法也都是Method对象
getMethod(名称,形参列表的类型) 从所有公共的方法中找
getDeclaredMethod() 在声明的方法中找
在类中找一个方法:就是方法名称+形参列表
method.invoke(obj ,args) 要传实参列表了

泛型父类
Type type = clazz.getGenericSuperClass()  Type类型
ParameterizedType p =(..)type;
Type[] array = p.getActualTypeArguments();
获取到带的泛型信息

获取注解信息(注解配置参数的值)
MyField ann = 有配置参数的属性.getAnnotation(MyField.class)
然后获取值 ann.columnName()
    类似于直接调用方法一样
注解在声明时,要注意生命周期的设置@Retetion(RetetionPolicy.RUNTIME)

原创粉丝点击