通过反射来调用类的完整结构
Field、Method、Constructor、Superclass、Interface、Annotation
- 实现的全部接口
- 所继承的父类
- 全部的构造器
- 全部的方法
- 全部的 Field
实现的所有接口
-
确定此对象所表示的类或接口实现的接口。
public Class<?>[] getInterfaces()
例如:
public class Test {
public static void main(String[] args) {
try {
//调用 forName() 方法获取指定类的 Class 实例
Class cla = Class.forName("com.aze.reflection.Student");
//获取实现的所有接口
Class[] ci = cla.getInterfaces();
int i = 1;
//遍历所有接口
for (Class c : ci) {
System.out.println("接口" + i + ":" + c);
i++;
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
所继承的父类
-
返回表示此 Class 所表示的实体(类、接口、基本类型)的父类的 Class
public Class<? Super T> getSuperclass()
例如:
public class Test {
public static void main(String[] args) {
try {
//通过 forName() 方法获取指定类的 Class 实例
Class cla = Class.forName("com.aze.reflection.Student");
//获取父类
Class sc = cla.getSuperclass();
System.out.println("父类是:" + sc);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
全部的构造器
-
返回此 Class 对象所代表的类的所有 public 构造方法
public Constructor<T>[] getConstructors()
//获取类中公有地(public)构造方法
Constructor[] cc = cla.getConstructors();
// 遍历
for (Constructor c : cc) {
// getModifiers()取得修饰符
System.out.println("修饰符为:" + c.getModifiers());
// getName()取得方法名称
System.out.println("构造器名称为:" + c.getName());
// getParameterTypes()取得参数类型
Class[] cpt = c.getParameterTypes();
for (Class s : cpt) {
System.out.println("参数类型为:" + s);
}
System.out.println("------");
}
-
返回此 Class 对象表示的类声明的所有构造方法
public Constructor<T>[] getDeclaredConstructors()
//获取类中所有的构造方法
Constructor[] cc1 = cla.getDeclaredConstructors();
// 遍历
for (Constructor c : cc1) {
// getModifiers()取得修饰符
System.out.println("修饰符为:" + c.getModifiers());
// getName()取得方法名称
System.out.println("构造器名称为:" + c.getName());
// getParameterTypes()取得参数类型
Class[] cpt = c.getParameterTypes();
for (Class s : cpt) {
System.out.println("参数类型为:" + s);
}
System.out.println("------");
}
- Constructor 类中:
-
取得修饰符:
public int getModeifiers();
-
取得方法名称:
public String getName();
-
取得参数的类型:
publi Class<T>[] getParameterTypes();
-
通过反射的构造方法来创建对象
- 调用公有的无参构造
Class cla = Class.forName("com.aze.reflection.Student");
// newInstance 实例化对象,相当于调用 Student 类的公有无参构造
Student s1 = (Student) cla.newInstance();//返回的是 Object 类型,这里进行强转
- 调用公有的有参构造
// 指定获取一个参数且参数为 String 类型的公有有参构造方法
Constructor c1 = cla.getConstructor(String.class);
// newInstance 实例化对象,相当于调用 Student 类的公有且只有一个参数的有参构造
Student s2 = (Student)c1.newInstance("一中");
- 调用所有(包括公有、私有)有参构造
//通过反射机制,强制调用私有的构造方法
// 指定获取两个参数且参数类型为 String、int 的所有构造方法
Constructor c2 = cla.getConstructor(String.class, int.class);
// 解除私有的封装,使下面可以对这个私有的方法强制调用
c2.setAccessible(true);
// newInstance 实例化对象,相当于调用 Student 类的所有且有两个参数的有参构造
Student s3 = (Student)c2.newInstance("二中",13);
全部的方法
-
返回此 Class 对象所表示的类或接口的全部方法
public Methode[] getDeclaredMethods()
Class cla = Class.forName("com.aze.reflection.Student");
// 获取类的所有的方法(包括公有私有)
Method[] cms = cla.getDeclaredMethods();
// 遍历
for (Method m : cms) {
System.out.println("方法名:" + m.getName());
System.out.println("修饰符:" + m.getModifiers());
System.out.println("返回值类型:" + m.getReturnType());
// 获取方法的参数类型,返回的是一个数组
Class[] mp = m.getParameterTypes();
if (mp != null && mp.length > 0){
for (Class c : mp) {
System.out.println("参数类型:" + c.getName());
}
}
System.out.println("======================");
}
-
返回此 Class 对象所表示的类或接口的 public 方法
public Methode[] getMethods()
Class cla = Class.forName("com.aze.reflection.Student");
// 获取类的所有的公有方法
Method[] cms = cla.getMethods();
// 遍历
for (Method m : cms) {
System.out.println("方法名:" + m.getName());
System.out.println("修饰符:" + m.getModifiers());
System.out.println("返回值类型:" + m.getReturnType());
// 获取方法的参数类型,返回的是一个数组
Class[] mp = m.getParameterTypes();
if (mp != null && mp.length > 0){
for (Class c : mp) {
System.out.println("参数类型:" + c.getName());
}
}
System.out.println("======================");
}
-
Method 类中:
-
取得全部的返回值:
public Class<?> getReturnType()
-
取得全部的参数:
public Class<?>[] getParameterTypes()
-
取得修饰符:
public int getModifiers()
-
全部的 Field
-
返回此 Class 对象所表示的类或者接口的 public 的 Field,其中还包括父类中的公有属性。
public Field[] getFields()
Class cla = Class.forName("com.aze.reflection.Student");
// 获取类的公有(public)的属性,其中还包含了父类的公有属性
Field[] fc = cla.getFields();
for (Field f : fc) {
System.out.println("属性名:" + f.getName());
System.out.println("修饰符:" + f.getModifiers());
System.out.println("属性类型:" + f.getType());
System.out.println("===================");
}
-
返回此 Class 对象所表示的类或者接口的全部 Field,只返回本类的所有属性,不包括父类。
public Field[] getDeclaredFields()
Class cla = Class.forName("com.aze.reflection.Student");
// 获取本类的所有属性,不包括父类的属性
Field[] fc = cla.getDeclaredFields();
for (Field f : fc) {
System.out.println("属性名:" + f.getName());
System.out.println("修饰符:" + f.getModifiers());
System.out.println("属性类型:" + f.getType());
System.out.println("===================");
}
-
Field 方法中:
-
一整数形式返回此 Field 的修饰符:
public int getModifiers()
-
得到 Field 的属性类型:
public Class<?> getType()
-
返回 Field 的名称:
public String getName()
-
类所在的包
-
Package getPackage()
Class cla = Class.forName("com.aze.reflection.Student");
Package pc = cla.getPackage();
System.out.println(pc.getName());