-
@className : Demo2
-
@date : 2021/4/7 23:39
-
@description : Class 对象的使用
*/
public class Demo2 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
Class class1 = Class.forName(“com.cunyu.Person”);
Field field1 = class1.getField(“id”);
System.out.println(field1);
Field field2 = class1.getField(“age”);
System.out.println(field2);
Field field3 = class1.getField(“rank”);
System.out.println(field3);
}
}
从上面的结果分析可知,该方法只能用于获取类中指定名称的 public
所修饰的成员变量,对于 protected
、private
所修饰的成员变量,该方法是无法获取的(包括父类)。而获取或设置成员变量值时,可以通过 get/set
方法来操作,具体操作方法如下。
// 假设我们获取到的 Field 为上面的 id,获取和设置 id 的值就可以通过如下操作来进行
// 1. 获取
Field idField = personClass.getField(“id”);
Person person = new Person();
Object idValue = idField.get(person);
System.out.println(“id:” + idValue);
// 2. 设置
idField.set(person, “1312120”);
System.out.println(“person:” + person);
Field[] getDeclaredFields()
package com.cunyu;
import java.lang.reflect.Field;
/**
-
@author : cunyu
-
@version : 1.0
-
@className : Demo2
-
@date : 2021/4/7 23:39
-
@description : Class 对象的使用
*/
public class Demo2 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
Class class1 = Class.forName(“com.cunyu.Person”);
Field[] fields = class1.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
}
}
观察上面的结果可知,该方法可用于获取所有的成员变量,不用考虑修饰符的限制(不包括父类)。
Field getDeclaredField(String name)
package com.cunyu;
import java.lang.reflect.Field;
/**
-
@author : cunyu
-
@version : 1.0
-
@className : Demo2
-
@date : 2021/4/7 23:39
-
@description : Class 对象的使用
*/
public class Demo2 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
Class class1 = Class.forName(“com.cunyu.Person”);
Field field1 = class1.getDeclaredField(“id”);
System.out.println(field1);
Field field3 = class1.getDeclaredField(“rank”);
System.out.println(field3);
Field field2 = class1.getDeclaredField(“age”);
System.out.println(field2);
}
}
观察上面的结果可知,该方法可用于获取指定的成员变量,不用考虑成员变量修饰符的限制(不包括父类)。但是在利用 set
、get
方法来获取和设置 private
、protected
修饰的成员变量时,需要利用 setAccessible()
来忽略访问全新啊修饰符的安全检查,否则程序将会报错。
获取构造方法
| 方法 | 说明 |
| :-- | :-- |
| Constructor<?>[] getConstructors()
| 返回包含一个数组 Constructor
对象反射由此表示的类的所有公共构造类对象 |
| Constructor<T> getConstructor(类<?>... parameterTypes)
| 返回一个 Constructor
对象,该对象反映 Constructor
对象表示的类的指定的公共类函数 |
| Constructor<?>[] getDeclaredConstructors()
| 返回一个反映 Constructor
对象表示的类声明的所有 Constructor
对象的数组类 |
| Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
| 返回一个 Constructor
对象,该对象反映 Constructor
对象表示的类或接口的指定类函数 |
package com.cunyu;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
-
@author : cunyu
-
@version : 1.0
-
@className : Demo3
-
@date : 2021/4/8 13:28
-
@description : 构造对象获取
*/
public class Demo3 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class personClass = Class.forName(“com.cunyu.Person”);
// 1. 获取所有构造方法
System.out.println(“所有构造方法”);
Constructor[] constructors = personClass.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
// 2. 获取指定构造方法
// 空参构造方法
System.out.println(“空参构造方法”);
Constructor constructor1 = personClass.getConstructor();
System.out.println(constructor1);
// 带参构造方法
System.out.println(“带参构造方法”);
Constructor constructor2 = personClass.getConstructor(int.class, String.class, long.class, long.class, float.class, int.class);
System.out.println(constructor2);
// 获取构造方法后,可以利用它来创建对象
System.out.println(“空参创建对象”);
// 第一种方法
Object person = constructor1.newInstance();
System.out.println(person);
// 第二种方法
Object person1 = personClass.newInstance();
System.out.println(person1);
System.out.println(“带参创建对象”);
Object object = constructor2.newInstance(20, “村雨遥”, 1312020, 3, 99.0F, 2);
System.out.println(object);
}
}
Constructor<?>[] getConstructors()
类似于通过 Class
实例来获取成员变量,该方法用于获取所有 public
所修饰的构造方法(包括父类);
Constructor<T> getConstructor(类<?>... parameterTypes)
该方法用于获取某一指定参数类型后的 public
所修饰的构造方法(包括父类);
Constructor<?>[] getDeclaredConstructors()
该方法用于获取所有 public
所修饰的构造方法(不包括父类);
Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
该方法用于获取某一指定参数类型后的 public
所修饰的构造方法(不包括父类);
而获取到构造方法之后,我们就可以利用 newInstance()
方法来创建类的实例。特殊的,如果我们的构造方法是无参的,此时则可以直接利用 Class.newInstance()
来构造实例。
获取成员方法
| 方法 | 说明 |
| :-- | :-- |
| Method[] getMethods()
| 返回包含一个数组 方法对象反射由此表示的类或接口的所有公共方法 类对象,包括那些由类或接口和那些从超类和超接口继承的声明 |
| Method getMethod(String name, 类<?>... parameterTypes)
| 返回一个方法对象,它反映此表示的类或接口的指定公共成员方法 类对象 |
| Method[] getDeclaredMethods()
| 返回包含一个数组方法对象反射的类或接口的所有声明的方法,通过此表示 类对象,包括公共,保护,默认(包)访问和私有方法,但不包括继承的方法 |
| Method getDeclaredMethod(String name, 类<?>... parameterTypes)
| 返回一个方法对象,它反映此表示的类或接口的指定声明的方法类对象 |
package com.cunyu;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
-
@author : cunyu
-
@version : 1.0
-
@className : Demo4
-
@date : 2021/4/8 13:51
-
@description : 成员方法获取
*/
public class Demo4 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class personClass = Class.forName(“com.cunyu.Person”);
// 获取所有 public 成员方法
System.out.println(“获取所有成员方法”);
Method[] methods = personClass.getMethods();
for (Method method : methods) {
System.out.println(method);
}
// 获取指定名称的方法
System.out.println(“获取指定名称的方法”);
Method getAgeMethod = personClass.getMethod(“getAge”);
System.out.println(getAgeMethod);
// 执行方法
Person person = new Person(20, “村雨遥”, 1312020, 3, 99.0F, 2);
int age = (int) getAgeMethod.invoke(person);
System.out.println(age);
}
}
Method[] getMethods()
用于获取当前类的所有 public
所修饰的成员方法(包括父类)。
Method getMethod(String name, 类<?>... parameterTypes)
用于获取当前类的某一个指定名称 public
所修饰的成员方法(包括父类)。
Method[] getDeclaredMethods()
用于获取当前类的所有 public
所修饰的成员方法(不包括父类)。
Method getDeclaredMethods(String name, 类<?>... parameterTypes)
用于获取当前类的某一个指定名称 public
所修饰的成员方法(不包括父类)。
而当我们获取到类的成员方法后,如果要执行某一个方法,可以使用 invoke()
方法来执行该方法。
获取类名
package com.cunyu;
/**
-
@author : cunyu
-
@version : 1.0
-
@className : Demo5
-
@date : 2021/4/8 14:06
-
@description : 获取类名
*/
public class Demo5 {
public static void main(String[] args) throws ClassNotFoundException {
Person person = new Person();
Class personClass = person.getClass();
String className = personClass.getName();
System.out.println(className);
}
}
String getName()
从上述程序的结果可知,当我们获取到 Class
对象之后,如果不知道类的全名,就可以使用 getName()
来获取该类的全名。
假设我们有如下需求:在不改变类的代码的前提下,我们能够创建任意类的对象,并执行其中的方法。
此时,我们可以通过 配置文件 + 反射 的方式来实现这一效果,而这也就是我们现在所用框架中的基础,当我们使用反射后,只需要通过修改配置文件中的内容就能够不用去改代码就实现对应的功能。
假设我们有两个类,一个 Student
,一个 Teacher
,两者的定义如下;
package com.cunyu;
/**
-
@author : cunyu
-
@version : 1.0
-
@className : Teacher
-
@date : 2021/4/8 15:15
-
@description : 教师类
*/
public class Teacher {
private String name;
private int age;
public void teach() {
System.out.println(“教书育人……”);
}
}
package com.cunyu;
/**
-
@author : cunyu
-
@version : 1.0
-
@className : Student
-
@date : 2021/4/8 15:16
-
@description : 学生类
*/
public class Student {
private String name;
private float score;
public void study() {
System.out.println(“好好学习,天天向上……”);
}
}
要实现我们的需求,通常需要如下步骤:
- 将要创建对象的全类名和要执行的方法都配置在配置文件中;
定义的配置文件 prop.properties
,其中主要内容包括 className
和 methodName
两个属性,分别代表类的全类名和要调用方法的名字。一个具体实例如下,分别代表名为 Student
的类和名为 study
的方法。
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
要实现我们的需求,通常需要如下步骤:
- 将要创建对象的全类名和要执行的方法都配置在配置文件中;
定义的配置文件 prop.properties
,其中主要内容包括 className
和 methodName
两个属性,分别代表类的全类名和要调用方法的名字。一个具体实例如下,分别代表名为 Student
的类和名为 study
的方法。
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-aXRuC5LV-1710876697643)]
[外链图片转存中…(img-M3qstLIa-1710876697644)]
[外链图片转存中…(img-fJ52iYUX-1710876697645)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-s0b0nNA0-1710876697645)]