文章目录
- 1. 通过反射获取一个类的父类和接口
- 2. 反射获取一个类的构造方法
- 3. 反射获取全部构造器
- 4. 通过反射创建一个对象
- 5. 反射机制获取类的方法
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();
}
}
}
运行结果:
3. 反射获取全部构造器
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();
}
}
}
运行结果:
4. 通过反射创建一个对象
举例:
Student类:
package day14;
public class Student extends Person implements Move,Study{
public Student() {
System.out.println("调用的是public Student()");
}
public Student(String school) {
this.school = school;
System.out.println("调用的是public Student(String school)");
}
private Student(String school, int age) {
this.school = school;
this.age = age;
System.out.println("调用的是private Student(String school, int 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实例
//如何用反射的构造方法来创建对象
try {
Object obj = clazz.getDeclaredConstructor().newInstance();//相当于调用Student类的无参公有的构造方法
Student stu = (Student) obj;
// System.out.println(stu.school);
Constructor c = clazz.getConstructor(String.class);//指定获取有一个参数并且为String类型的共有的构造方法
Student stu1 = (Student)c.newInstance("第一中学");//newInstance实例化对象,相当于调用public Student(String school)
//通过反射机制可以强制地调用私有的构造方法
Constructor c1 = clazz.getDeclaredConstructor(String.class, int.class);//指定获取有两个参数(String, int)的构造方法
c1.setAccessible(true);//解除私有的封装,下面就可以对这个私有方法强制调用
Student stu2 = (Student)c1.newInstance("zhangsan",12);
} catch (Exception e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
运行结果:
5. 反射机制获取类的方法
public Method[] getDeclaredMethods()
:返回此 Class 对象所表示的类或接口的全部方法
public Method[] getMethods()
:返回此 Class 对象所表示的类或接口的 public 的方法
Method 类中:
- public Class<?>
getReturnType()
:取得全部的返回值 - public Class<?>[]
getParameterTypes()
: 取得全部的参数 - public int
getModifiers()
: 取得修饰符
举例:
Student类
package day14;
public class Student extends Person implements Move,Study{
public Student() {
System.out.println("调用的是public Student()");
}
public Student(String school) {
this.school = school;
System.out.println("调用的是public Student(String school)");
}
private Student(String school, int age) {
this.school = school;
this.age = age;
System.out.println("调用的是private Student(String school, int 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("骑自行车去上学");
}
private void test(String name) {
}
public String getSchool() {
return this.school;
}
}
Test.java:
package day14;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Test1 {
public static void main(String[] args) {
try {
Class clazz = Class.forName("day14.Student");//通过 包名.类名 的字符串,调用Class.forName方法获取指定类的Class实例
// Method[] ms = clazz.getMethods();//获取到类的所有公有的方法
Method[] ms = clazz.getDeclaredMethods();//获取到类的所有方法,包括私有的
for(Method m : ms) {
System.out.println("方法名:" + m.getName());
System.out.println("方法名:" + m.getReturnType());
System.out.println("方法名:" + m.getModifiers());
Class[] pcs= m.getParameterTypes();//获取方法的参数类型,是一个数组,方法有几个参数,数据就有几个元素
if(pcs != null && pcs.length > 0) {
for(Class pc : pcs) {
System.out.println("参数类型:" + pc.getName());
}
}
System.out.println("=======================================");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
运行结果: