您的位置:首页 > 编程语言 > Java开发

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: