这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战
1 | java复制代码package reflecttest; |
获取Class的实例的三种方式
Class的实例就是运行时的类
- 通过类字面常量
Class.class
获取
1 | java复制代码 Class clazz = Person.class; |
- 通过
Object
类中的getClass()
方法返回一个Class
类型的实例
1 | java复制代码 Person person = new Person(); |
- 通过静态方法
Class.forName("全类名")
获取类名对应的Class
对象
1 | java复制代码 Class clazz = Class.forName("reflecttest.Person"); |
通过反射创建对象
反射创建类对象主要有两种方式,通过Class
对象的newInstance()
方法、通过Constructor
对象的 newInstance()
方法。
- 第一种:通过
Class
对象的newInstance()
方法。
1 | java复制代码 // 获取类的 Class 对象实例 |
- 第二种:通过
Constructor
对象的newInstance()
方法
1 | java复制代码 // 获取类的 Class 对象实例 |
通过Constructor
对象创建类对象可以选择特定构造方法,而通过 Class
对象则只能使用默认的无参数构造方法。
示例:(调用有参构造方法进行类对象的初始化)
1 | Java复制代码 // 获取类的 Class 对象实例 |
通过反射调用对象属性
获取属性
获取所有属性的两种方式
getFields()
1 | java复制代码 // 通过getFields()获取Person.class及父类中所有 public 修饰的属性 |
getDeclaredFields()
1 | java复制代码 // 通过getDeclaredFields()获取Person.class中所有的属性 |
注:
getFields()
可以获取本类及父类中所有 public 修饰的属性getDeclaredFields()
可以获取本类所有的属性。包括 public、private、protected、default 修饰的属性,不包括父类中的属性
获取指定属性的两种方式
getField(String name)
1 | java复制代码 // 通过getField()获取Person.class中的age属性 |
getDeclaredField(String name)
1 | java复制代码 // 通过getDeclaredField()获取Person.class中的name属性 |
注:
getField(String name)
可以获取本类及父类中的 public 修饰的属性getDeclaredField(String name)
可以获取本类的属性。包括 public、private、protected、default 修饰的属性,不包括父类中的属性
对属性的操作
设置属性值
1 | java复制代码 // 通过getDeclaredField()获取Person.class中的name属性 |
注:如果属性是private修饰的,则需要设置
setAccessible(true)
才能赋值
获取属性值
1 | java复制代码 //通过get(Object obj)获取person对象的field属性 |
获取属性的类型
1 | java复制代码 //通过getType()获取属性的类型 |
获取属性名
1 | java复制代码 //调用getName()获取属性名 |
获取修饰类型
1 | java复制代码 //调用getModifiers()获取修饰类型, |
注:0-
default
、1-public
、2-private
、4-protected
示例
1 | java复制代码 // 获取类的 Class 对象实例 |
输出:public int age = 12;
通过反射调用对象方法
获取方法
获取所有方法的两种方式
getMethods()
1 | java复制代码 //通过getMethods()获取Person类及父类中所有的public修饰的方法 |
getDeclaredMethods()
1 | java复制代码 //通过getDeclaredMethods()获取Person类中所有的方法 |
注:
getMethods()
可以获取本类及父类中所有 public 修饰的方法getDeclaredMethods()
可以获取本类所有的方法。包括 public、private、protected、default 修饰的方法,不包括父类中的方法
取指定方法的两种方式
用方法名和形参列表来确定获取的方法
getMethod(String name, class<?>... parameterTypes)
1 | java复制代码 //获取Person类中的show方法,参数为方法名,show()的形参列表 |
getDeclaredMethod(String name, 类<?>... parameterTypes)
1 | java复制代码 //获取Person类中的fly方法,参数为方法名,fly()无形参列表 |
注:
getMethod()
可以获取本类及父类中的 public 修饰的属性getDeclaredMethod()
可以获取本类的属性。包括 public、private、protected、default 修饰的属性,不包括父类中的属性
对方法的操作
调用方法
1 | java复制代码 //获取Person类中的fly方法,参数为方法名,fly()无形参列表 |
注:invoke()方法的返回值和调用的方法的返回值一样
获取方法的参数列表
1 | java复制代码 //获取形参列表 |
获取方法名
1 | java复制代码 //获取方法名 |
获取方法的修饰类型
1 | java复制代码 //获取方法修饰符 |
获取方法的返回值类型
1 | java复制代码 //获取返回值类型 |
示例
1 | java复制代码 public static void main(String[] args) throws Exception, IllegalAccessException { |
输出:private java.lang.String Work(java.lang.String,int);
通过反射调用对象构造方法
获取构造方法
获取所有构造方法的两种方式
getConstructors()
1 | java复制代码 //获取所有public修饰的构造方法,不包括父类 |
getDeclaredConstructors()
1 | java复制代码 //获取所有构造方法,包括public、private、protected、default 修饰,不包括父类 |
注:
getConstructors()
可以获取本类中所有 public 修饰的构造方法,不包括父类getgetDeclaredConstructors()
可以获取本类所有的构造方法。包括 public、private、protected、default 修饰的方法,不包括父类
获取指定构造方法的两种方式
对构造器的选择是依赖于形参列表的类型
clazz.getConstructor()
1 | java复制代码 //获取无参数的构造方法 |
getDeclaredConstructor()
1 | java复制代码 //获取形参为(String,int)类型的构造方法 |
注:
getConstructor()
只可以获取本类 public 修饰的构造方法,不包括父类getDeclaredConstructor()
可以获取本类所有的构造方法。包括 public、private、protected、default 修饰的方法,不包括父类
对构造方法的操作
创建对象
对构造器的选择是依赖于形参列表的类型
1 | java复制代码 //获取空参的构造器 |
获取构造方法的参数列表
1 | java复制代码 //获取构造方法形参列表 |
获取构造方法名
1 | java复制代码 //获取构造方法名 |
获取构造方法的修饰类型
1 | java复制代码 //获取构造方法的修饰符 |
示例
1 | java复制代码public static void main(String[] args) throws Exception, IllegalAccessException { |
输出:private test1.Person(java.lang.String,int);
本文转载自: 掘金