java的反射机制相关方法(未完)
首先了解java程序的几个过程:
1.java源码阶段(通过javac编译)==>2.class字节码阶段(jvm类加载器)==>3.runtime阶段
反射: java反射机制是在运行中,对任意一个实体,能够知道这个类所有的属性和方法,对于任意一个实体,都能够调用它的属性和方法.这种动态获取信息和动态调用对象方法的功能成为java语言的反射机制.
一句话,在程序运行过程中去操作类和对象.
Class
Class代表类的实体, 在java运行是代表类和接口,在这个类中提供了很多的方法,
其相关的方法
方法 |
用途 |
asSubClass(Class<T> clazz) |
把传递的类的对象转换成代表其子类的对象 |
getClassLoader() |
获得类的加载器 |
getClasses |
返回一个数组,包含该类中所有公共类和接口对象 |
getDeclaredClasses |
返回一个数组,数组中包含该类中所有类和接口的对象 |
forName(String className) |
根据类名返回类的对象 |
getName() |
获得类的全限定名字(全类名) |
newInstance() |
创建类的实例 |
getPackage() |
获得类的包 |
getSimpleName() |
获得类的名字 |
getSuperclass() |
获得当前类继承的父类的名字 |
getInterfaces() |
获得当前类实现的类或是接口 |
.class |
获得当前对象的类 |
|
|
获取类中相关字段的方法
getField(String name) |
获得某个共有字段对象 |
getFields() |
获得所有共有字段对象 |
getDeclaredField(String name) |
获得某个字段对象 |
getDeclaredFields() |
获得所有字段对象 |
获得类中注解相关方法
getAnnotation(Class<A> annontationClass) |
返回改类中与参数类型匹配的公有注解对象 |
|
|
获得类中构造器相关方法
getConstructor(Class…<?> parameterTypes) |
获得该类中与参数类型匹配的公有构造方法 |
getConstructors() |
获得该类的所有公有构造方法 |
getDeclaredConstructor(Class…<?> parameterTypes) |
获得该类中于参数类型匹配的构造方法 |
getDeclaredConstructors() |
获得该类所有构造方法 |
获得类中方法相关的方法
getMethod(String name,Class<?> parameterTypes) |
获得该类某个共有方法 |
getMethods() |
获得该类所有共有方法 |
getDeclaredMethod(String name,Class<?> parameterTypes) |
得该类某个方法 |
getDeclaredMethods() |
获得该类所有方法 |
类中其他重要的方法:
isAnnotation() |
如果是注解类型则返回true |
isAnnontationPresent(Class<? extends Annontation annotationClass>) 判断这个Class是否有指定注解 |
如果是指定注解类型则返回true |
isArray() |
如果是数组类型则返回true |
isEnum() |
如果是枚举类型则返回true |
isInstance(Object obj) |
如果obj是该类实例则返回true |
isInterface |
如果是接口类型返回true |
Field类:
Field代表类的成员变量,成员变量(字段)和成员属性是两个概念,比如,当一个User类中有一个name变量,那么这个时候,我们就说它有name这个字段.但是如果没有getName和setName这两个方法,那么这个类就没有name属性.反之,如果这个类拥有getAge和setAge这两个方法,不管有没有age字段,我都认为它有age这个属性.
方法 |
用途 |
get(Object obj) |
获得obj中对应的属性值 |
set(Object obj,Object value) |
设置obj 中对应属性值 |
setAccessible |
暴力反射,忽略权限访问限制符 |
Method类
Method代表类的方法(不包括构造方法)
Invoke(Object obj,Object ... args) |
传递Object对象及参数调用该对象对应的方法 |
setName |
获取方法名 |
setAccessible |
暴力反射,忽略权限访问限制符 |
Invoke方法的用处:SpringAop在切面方法执行的前后进行某些操作,就是使用的invoke方法.
Constructor类(用的比较少)
Constructor代表类的构造方法
方法 |
用途 |
newInstance(Object.. initargs) |
根据传递的参数创建类的对象 |
Constructor类在实际开发中使用极少,几乎不会使用Constructor,因为:Constructor违背了java的一些思想,比如:私有构造不让用户去new对象:单例模式保证全局只有一个该类的实例,而Constructor则可以破坏这个规则.
案例:写一个小工具,可以帮助我们创建任意的对象,并且执行其中任意方法.
案例:通过反射,验证运行中泛型会被插除.