Java反射

主要参考这篇文章

https://blog.csdn.net/sinat_38259539/article/details/71799078

什么是反射?

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

反射就是把java类中的各种成分映射成一个个的Java对象:

例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象

类对象

每个类在第一次被调用时,都会被jvm创建类对象(因此只会有一个类对象),并加载到jvm内存.我们可以通过类对象来实现java反射的功能,即在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性

怎么获取类对象?

三种方法:

Student stu = new Student("张三");
//第一种, 通过getClass()方法
Class clz1 = stu.getClass();
//第二种,通过class属性
Class clz2 = Student.class;
//第三种,通过类的全名
Class clz3 = Class.forName("com.test.Student");

第一种 : 都有对象了,还要反射干什么

第二种 : 需要导包才能用,麻烦.

第三种 : 推荐使用

通过反射获取构造方法

public Constructor[] getConstructors() : 仅获取public的构造方法们

public Constructor[] getDeclaredConstructors() : 获取所有的构造方法们(public, protected, default, private)

public Constructor getConstructor(Class... parameterTypes) : 指定获取某个public构造方法,通过传入的参数类型的类对象确定

public Constructor getDeclaredConstructor(Class... parameterTypes) : 指定获取某个(4种权限)构造方法,通过传入的参数类型的类对象确定

Constructor-->newInstance(Object... initargs) : 用该构造函数创建对象,传如初始化参数.

获取成员变量

Field[] getFields() : 使用方法相似,不赘述

Field[] getDeclaredFields()

public Field getField(String fieldName) : 传入变量名来确定成员变量

public Field getDeclaredField(String fieldName)

Field --> public void set(Object obj,Object value) : 用Field对象调用set方法,形参1:赋值的对象, 形参2:赋的值  例 : fieldAge.set(person1, 22);

获取成员方法

public Method[] getMethods() : 不赘述

public Method[] getDeclaredMethods()

public Method getMethod(String name,Class<?>... parameterTypes) : 传入方法名以及方法参数的类对象们.

public Method getDeclaredMethod(String name,Class<?>... parameterTypes)

Method --> public Object invoke(Object obj,Object... args) : 参数1:要调用的方法的对象,  参数2:方法的参数们(形参)

其他

操作private属性或方法的前提 : 打开开关!(private属性或方法.setAccessible(true))

Constructor类, Field类, Metod类, Properties类等等的toString()方法都被重写过! 会打印出方法或属性的声明语句,而不是打印地址.

通过反射运行配置文件内容

看上边的链接

通过反射越过泛型检查

泛型会在类编译成class文件之后被擦除,所以你知道该怎么做了吧?

f

posted @ 2019-04-19 21:33  Kaneha  阅读(130)  评论(0编辑  收藏  举报