文章目录
- 1. 通过反射获取一个类的父类和接口
- 2. 反射获取一个类的构造方法
- 2.1. 获取全部构造器
1. 通过反射获取一个类的父类和接口
使用反射可以取得:
- 实现的全部接口
public Class<?>[]getInterfaces()
:确定此对象所表示的类或接口实现的接口。 - 所继承的父类
public Class<? Super T>getSuperclass()
:返回表示此 Class 所表示的实体(类、接口、基本类型)的父类的 Class 。
举例:通过反射调用实现的全部接口和所继承的父类。
其中父类为Person类,子类为Student类,两种接口分别为Move和Study两种,用来描述上学方式和学习范围。
实现步骤:
步骤一:定义Person类:
package day14;
public class Person {
public String name;
int age;
}
步骤二:定义接口Move和Study
(1)Move
package day14;
public interface Move {
void moveType();
}
(2)Study
package day14;
public interface Study {
void studyInfo();
}
步骤三:定义Person的子类Student并实现上面两种接口
package day14;
public class Student extends Person implements Move,Study{
String school;
public void showInfo() {
System.out.println("学校是:" + this.school);
}
@Override
public void studyInfo() {
System.out.println("学习的是中学知识");
}
@Override
public void moveType() {
System.out.println("骑自行车去上学");
}
}
步骤四:Test.java
package day14;
public class Test1 {
public static void main(String[] args) {
try {
Class clazz = Class.forName("day14.Student");//通过 包名.类名 的字符串,调用Class.forName方法获取指定类的Class实例
Class superClazz = clazz.getSuperclass();//获取父类
System.out.println(superClazz.getName());
Class[] interfaces = clazz.getInterfaces();//获取当前类的所有接口
for(Class c : interfaces) {
System.out.println("接口:" + c.getName());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Test.java运行结果:
2. 反射获取一个类的构造方法
public Constructor[] getConstructors()
:返回此 Class 对象所表示的类的所有 public 构造方法。
举例:
对上述类Student方法添加三个构造方法
package day14;
public class Student extends Person implements Move,Study{
//构造方法1
public Student() {
}
//构造方法2
public Student(String school) {
this.school = school;
}
//构造方法3
private Student(String school, int age) {
this.school = school;
this.age = age;
}
String school;
public void showInfo() {
System.out.println("学校是:" + this.school);
}
@Override
public void studyInfo() {
System.out.println("学习的是中学知识");
}
@Override
public void moveType() {
System.out.println("骑自行车去上学");
}
}
Test.java:
package day14;
import java.lang.reflect.Constructor;
public class Test1 {
public static void main(String[] args) {
try {
Class clazz = Class.forName("day14.Student");//通过 包名.类名 的字符串,调用Class.forName方法获取指定类的Class实例
Constructor[] cons = clazz.getConstructors();
for(Constructor c : cons) {
System.out.println("构造方法名称:" + c.getName());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
运行结果:
2.1. 获取全部构造器
public Constructor[] getConstructors()
:返回此 Class 对象所表示的类的所有 public 构造方法。
public Constructor[] getDeclaredConstructors()
:返回此 Class 对象表示的类声明的所有构造方法。
Constructor 类中:
①取得修饰符 : public int getModifiers();
②取得方法名称 : public String getName();
③取得参数的类型: public Class<?>[] getParameterTypes();
举例:
Test.java:
package day14;
import java.lang.reflect.Constructor;
public class Test1 {
public static void main(String[] args) {
try {
Class clazz = Class.forName("day14.Student");//通过 包名.类名 的字符串,调用Class.forName方法获取指定类的Class实例
Constructor[] cons = clazz.getConstructors();//获取类的公有构造方法
for(Constructor c : cons) {
System.out.println("-----------------------0------------------------------");
System.out.println("构造方法名称:" + c.getName());//获取方法名称
//getModifiers取得方法的修饰符,返回数组1代表public
System.out.println("构造方法:" + c.getName() + "的修饰符是:" + c.getModifiers());//获取方法的修饰符
Class[] paramClazz = c.getParameterTypes();
for(Class pc : paramClazz) {
System.out.println("构造方法:" + c.getName() + "的参数类型是:" + pc.getName());
}
System.out.println("-----------------------1------------------------------");
}
Constructor[] cons1 = clazz.getDeclaredConstructors();//获取类的所有构造方法,包括公有和私有的
for(Constructor c : cons1) {
System.out.println("----------------------000-----------------------------");
System.out.println("构造方法名称:" + c.getName());//获取方法名称
//getModifiers取得方法的修饰符,返回数组1代表public;返回数字2代表是private
System.out.println("构造方法:" + c.getName() + "的修饰符是:" + c.getModifiers());//获取方法的修饰符
Class[] paramClazz = c.getParameterTypes();
for(Class pc : paramClazz) {
System.out.println("构造方法:" + c.getName() + "的参数类型是:" + pc.getName());
}
System.out.println("----------------------111-----------------------------");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
运行结果: