Java关于 反射 的一些整理
2017-08-31 14:17
429 查看
关于反射
反射的功能:
可以在运行期间获取任意对象的类型的信息
创建在编译期间完全位置的类的对象
编写一些通用的工具类
原来是通过类名创建对象,现在可以通过对象获取到类的信息
反射的根源: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)
反射的功能:
可以在运行期间获取任意对象的类型的信息
创建在编译期间完全位置的类的对象
编写一些通用的工具类
原来是通过类名创建对象,现在可以通过对象获取到类的信息
反射的根源: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)
相关文章推荐
- 关于Java反射的一些事
- 整理关于java开发工具使用过程中一些小技巧来提高开发效率
- 关于java web的一些框架知识整理
- java的反射技术功能十分强大,整理一些资料!!
- CodeReview是开发中的重要一个环节,整理了一些关于jupiter for java
- Java基础知识 十七 (关于反射一些方法的总结)
- 关于java tcp socket的一些笔记待整理
- 关于javaweb中遇到的一些错误整理
- 关于java基础的一些整理!
- 关于java锁的一些知识整理
- 关于java反射的一些代码
- 关于java反射的一些理解
- 关于java的一些细节问题,笔试可能会问到,整理一下
- 关于Java中Http下载的一些整理
- Java的一些高级特性(三)——关于反射
- 关于Java的一些基础细节(整理)
- 关于java内存说明的一些帖子整理(待研究)
- java的反射技术功能十分强大,整理一些资料!!
- 关于java反射的一些小栗子
- java的反射技术功能十分强大,整理一些资料!!