java中的反射机制是java语言的一个很重要的特性,是java “动态性” 的重要体现。
java反射机制让我们在程序运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能调用他的任意一个方法。这种动态获取属性以及动态调用对象方法的功能就是“java的反射机制”。
在使用一个类之前必须先加载它,而当虚拟机加载完一个类后,就会在方法区创建一个这个类对应的class对象(一个类只有一个class对象),这个对象包含了类完整的结构信息。这个对象就像一面镜子,通过他可以“看到”整个类的结构,因此很形象的被称为“反射”。“class对象”就是反射机制的核心。
class类实现反射(reflection)的基础,任何想实现动态加载、运行的类都必须先获得其相应的class对象。
java.lang.calss类十分特殊,它表示java中的所有类型(类、接口、枚举、注解、数组、原始数据类型(基本数据类型)以及void)
class类没有公共的构造器,class对象由虚拟机自行创建。
1.运用 class.froname(包名+类名); (常用)
2.运用 .class 语法
3.运用 getclass()方法
1.动态加载类,动态获取类的信息(属性、方法、构造器等)
2.动态构造对象
3.动态调用类和对象的方法
4.动态调用及处理属性
5.获取泛型信息
6.处理注解
class类 代表类的结构信息
method类 代表方法的结构信息
field类 代表属性的结构信息
construction类 代表构造器的结构信息
annotation类 代表注解的结构信息
1.getclassloader() 返回类的类加载器。
2.getname() 返回class对象表示的实体的名称(包含包名)
3.getsimplename() 返回class对象表示的实体的简单名称(不含包名)
4.newinstance() 创建此class对象表示的类的新对象。
获取属性(字段):
1.getfield(string name) 返回一个 field对象,反射class对象表示的类或接口的指定公共字段。
2.getfields() 返回一个field数组对象,反射class对象表示的类或接口的所有可访问的公共字段 。
3.getdeclaredfield(string name) 返回一个 field对象,它反射此class对象表示的类或接口中指定的声明字段。
4.getdeclaredfields() 返回一个field数组对象反射此class对象表示的类或接口中声明的所有字段。
获取方法:
1.getmethod(string name, 类<?>... 参数(列表)类型)
返回一个 method对象,它反射此表示的类或接口的指定公共方法。
2.getmethods() 返回一个method对象数组 反射class对象表示的类或接口中所有公共方法,包括那些由类或接口和那些从父类和父接口继承的方法。
3.getdeclaredmethod(string name, 类<?>... 参数(列表)类型)
返回一个 method对象,它反射此表示的类或接口中声明的指定方法。
4.getdeclaredmethods()
返回一个method对象数组 反射class对象表示的类或接口中声明的所有方法,包括公共,受保护,默认(包)访问和私有方法,但不包括继承的方法。
1.getname() 返回此 field对象表示的字段的名称。
2.gettype() 返回此 field对象表示的字段的类型(class)
3.get(object obj) 返回此field对象所表示的字段的值 。
4.set(object obj, object value)
将指定对象参数上的此 field对象表示的字段设置为指定的新值。
set方法无法直接访问private属性,需要“禁用安全检查”,即setacceessible(true)。
5.getmodifiers() 以整数形式(int)返回由该 field对象表示的字段的java语言修饰符
1.getname() 返回由此method对象表示的方法的名称
2.getreturntype() 返回一个class对象,表示method对象表示的方法的返回值类型。
3.getparametertypes()
返回一个class对象的数组, 以声明顺序表示method对象表示的方法的形式参数类型。
4.getmodifiers() 返回method对象表示的方法的修饰符
5.invoke(object obj, object... args) args 参数列表
调用指定对象的method对象表示的方法 args为实参
如对本文有疑问, 点击进行留言回复!!
荐 深入理解Java中的BigInteger和 BigDecimal,再也不怕面试了
tomact正常启动,但是在日志文件报错java.lang.NoClassDefFoundError: java/util/logging/Logger
servlet整合quartz:servlet中使用quartz,服务器启动时加载任务
荐 Java——集合中的Map接口通过HashMap类实现一些常用的方法
SpringBoot整合mybatis访问时报错Invalid bound statement (not found)
网友评论