Class类中有很多方法,今天我们就来介绍几个在面试中经常被问到并且非常容易混淆的方法。
1.getFields()和getDeclaredFields()的区别
Class类中getFields()和getDeclaredFields()都是用来获取成员变量的方法,那么它们之间有什么区别呢?
我们首先使用代码来进行演示,然后我们再根据运行结果进行分析。
1.1定义一个实体类Person
public class Person {
public String name; //最大范围public
protected int age; //受保护类型
int height; //默认的访问权限
private String adress; //私有类型
public Person() {
}
protected Person(String name, int age) {
this.name = name;
this.age = age;
}
Person(String name, int age, int height) {
this.name = name;
this.age = age;
this.height = height;
}
private Person(String name, int age, int height, String adress) {
this.name = name;
this.age = age;
this.height = height;
this.adress = adress;
}
public void eat(){
System.out.println("eat...");
}
protected void drink(){
System.out.println("drink...");
}
void play(){
System.out.println("play...");
}
private void happy(){
System.out.println("happy...");
}
}
1.2再定义一个实体类Student继承Person
public class Student extends Person{
public String school; //最大范围public
protected String grade; //受保护类型
String classes; //默认的访问权限
private String score; //私有类型
public Student() {
}
protected Student(String school) {
this.school = school;
}
Student(String school, String score) {
this.school = school;
this.score = score;
}
private Student(String school, String grade, String classes, String score) {
this.school = school;
this.grade = grade;
this.classes = classes;
this.score = score;
}
public void study(){
System.out.println("study...");
}
protected void read(){
System.out.println("read...");
}
void write(){
System.out.println("write...");
}
private void examination(){
System.out.println("examination...");
}
}
1.3使用getFields()方法获取成员变量
public class getFieldDemo {
public static void main(String[] args) throws Exception {
Class cls = Class.forName("zzuli.edu.test.Student");
//使用getFields()方法获取成员变量
Field[] fields = cls.getFields();
for(Field field : fields){
System.out.println(field);
}
}
}
运行结果
由运行结果可以看出,getFields()方法不仅会获取本类中的成员变量,而且会获取父类中的成员变量,并且获取的都是public修饰的成员变量。由此可以得出一个结论:getFields()方法会获取所有public修饰的成员变量,包括父类。
1.4使用getDeclaredFields()方法获取成员变量
public class getFieldDemo2 {
public static void main(String[] args) throws Exception {
Class cls = Class.forName("zzuli.edu.test.Student");
//使用getDeclaredFields()方法获取成员变量
Field[] fields = cls.getDeclaredFields();
for(Field field : fields){
System.out.println(field);
}
}
}
运行结果
由运行结果可以看出,getDeclaredFields()方法只会获取本类中的成员变量,不会获取父类中的成员变量,并且会获取本类中所有的成员变量,不考虑修饰符。由此可以得出一个结论:getDeclaredFields()方法会获取本类中所有的成员变量,不考虑修饰符,不包括父类。
2.getConstructors()和getDeclaredConstructors()的区别
Class类中getConstructors()和getDeclaredConstructors()都是用来获取构造函数的方法,那么它们有之间有什么区别呢?
我们还是按照同样的方法,首先使用代码来进行演示,然后我们再根据运行结果进行分析。
我们还是继续使用1.1和1.2中的实体类Person和Student来进行演示。
2.1使用getConstructors()方法获取构造函数
public class getConstructorDemo {
public static void main(String[] args) throws Exception {
Class cls = Class.forName("zzuli.edu.test.Student");
//使用getConstructors()方法获取构造函数
Constructor[] constructors = cls.getConstructors();
for(Constructor constructor : constructors){
System.out.println(constructor);
}
}
}
运行结果
由运行结果可以看出,getConstructors()方法只会获取本类中的构造函数,并不会获取父类中的构造函数,而且只会获取本类中所有public修饰的构造函数。由此可以得出一个结论:getConstructors()方法会获取本类中所有public修饰的构造函数,不包括父类。
2.2使用getDeclaredConstructors()方法获取构造函数
public class getConstructorDemo2 {
public static void main(String[] args) throws Exception {
Class cls = Class.forName("zzuli.edu.test.Student");
//使用getDeclaredConstructors()方法获取构造函数
Constructor[] constructors = cls.getDeclaredConstructors();
for(Constructor constructor : constructors){
System.out.println(constructor);
}
}
}
运行结果
由运行结果可以看出,getDeclaredConstructors()方法只会获取本类中的构造函数,不会获取父类中的构造函数,并且会获取本类中所有的构造函数,不考虑修饰符。由此可以得出一个结论:getDeclaredConstructors()方法会获取本类中所有的构造函数,不考虑修饰符,不包括父类。
如果我们想要获取父类中的构造函数可以先使用getSuperclass()方法来获取到父类,然后再使用父类中的getConstructors()和getDeclaredConstructors()方法去获取。
3.getMethods() 与getDeclaredMethods() 的区别
Class类中getMethods()和getDeclaredMethods()都是用来获取成员方法的方法,那么它们有之间有什么区别呢?
我们还是按照同样的方法,首先使用代码来进行演示,然后我们再根据运行结果进行分析。
我们还是继续使用1.1和1.2中的实体类Person和Student来进行演示。
3.1使用getMethods()方法获取成员方法
public class getMethodDemo {
public static void main(String[] args) throws Exception {
Class cls = Class.forName("zzuli.edu.test.Student");
//使用getMethods()方法获取成员方法
Method[] methods=cls.getMethods();
for(Method method : methods){
System.out.println(method);
}
}
}
运行结果
由运行结果可以看出,getMethods()方法不仅会获取本类中的成员方法,而且会获取父类中的成员方法和超类(Object)中的成员方法,并且只会获取所有public修饰的成员方法。由此可以得出一个结论:getMethods()方法会获取所有public修饰的成员方法,包括父类和超类。
3.2使用getDeclaredMethods()方法获取成员方法
public class getMethodDemo2 {
public static void main(String[] args) throws Exception {
Class cls = Class.forName("zzuli.edu.test.Student");
//使用getDeclaredMethods()方法获取成员方法
Method[] methods=cls.getDeclaredMethods();
for(Method method : methods){
System.out.println(method);
}
}
}
运行结果
由运行结果可以看出,getDeclaredMethods()方法只会获取本类中的成员方法,不会获取父类和超类(Object)中的成员方法,并且会获取本类中所有的成员方法,不考虑修饰符。由此可以得出一个结论:getDeclaredMethods()方法会获取本类中所有的成员方法,不考虑修饰符,不包括父类。