package 反射;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
public class demo {
public static void main(String[] args) throws Exception {
// 通过类的全限定名获取对应的 Class 对象
Class clazz = Class.forName("反射.Cat");
// 获取类中声明的所有字段,包括私有、受保护和默认访问权限的字段
Field[] fields = clazz.getDeclaredFields();
// 打印所有声明的字段
System.out.println(Arrays.toString(fields));
// 获取名为 "age" 的声明字段
Field ageFiled = clazz.getDeclaredField("age");
// 打印该字段信息
System.out.println(ageFiled);
// 获取名为 "name" 的声明字段
Field nameFiled = clazz.getDeclaredField("name");
// 打印该字段信息
System.out.println(nameFiled);
// 获取名为 "color" 的声明字段
Field colorFiled = clazz.getDeclaredField("color");
// 打印该字段信息
System.out.println(colorFiled);
// 获取名为 "height" 的声明字段
Field heightFiled = clazz.getDeclaredField("height");
// 打印该字段信息
System.out.println(heightFiled);
// 以下代码注释掉,因为 getField 方法只能获取公共字段,而 name 和 age 是私有字段,调用会报错
// Field[] fields1 = clazz.getFields();
// System.out.println(Arrays.toString(fields1));
// Field nameFiled1 = clazz.getField("name");
// System.out.println(nameFiled1);
// Field ageFiled1 = clazz.getField("age");
// System.out.println(ageFiled1);
// 获取类中声明的所有方法,包括私有、受保护和默认访问权限的方法
Method[] methods = clazz.getDeclaredMethods();
// 打印所有声明的方法
System.out.println(Arrays.toString(methods));
// 获取名为 "run" 且参数类型为 String 的声明方法
Method runMethod1 = clazz.getDeclaredMethod("run", String.class);
// 打印该方法信息
System.out.println(runMethod1);
// 获取名为 "run" 且参数类型为 String 的公共方法
Method runMethod2 = clazz.getMethod("run", String.class);
// 打印该方法信息
System.out.println(runMethod2);
// 获取名为 "fly" 的声明方法
Method flyMethod1 = clazz.getDeclaredMethod("fly");
// 打印该方法信息
System.out.println(flyMethod1);
// 获取类的所有公共构造函数
Constructor[] constructors = clazz.getConstructors();
// 打印所有公共构造函数
System.out.println(Arrays.toString(constructors));
// 获取类的所有声明的构造函数,包括私有、受保护和默认访问权限的构造函数
Constructor[] constructors1 = clazz.getDeclaredConstructors();
// 打印所有声明的构造函数
System.out.println(Arrays.toString(constructors1));
// 获取无参的声明构造函数
Constructor constructor2 = clazz.getDeclaredConstructor();
// 打印该构造函数信息
System.out.println(constructor2);
// 获取参数类型为 String 的声明构造函数
Constructor constructor4 = clazz.getDeclaredConstructor(String.class);
// 打印该构造函数信息
System.out.println(constructor4);
// 获取无参的公共构造函数
Constructor constructor3 = clazz.getConstructor();
// 打印该构造函数信息
System.out.println(constructor3);
// 获取类实现的所有接口
Class[] classes = clazz.getInterfaces();
// 打印类实现的所有接口
System.out.println(Arrays.toString(classes));
}
}
package 反射;
public class Cat implements A,B{
private int age;
private String name;
protected String color;
double height;
public Cat(String name, String color, double height) {
this.name = name;
this.color = color;
this.height = height;
}
public Cat() {
}
public Cat(String color) {
this.color = color;
}
public void run(String name) {
System.out.println("小猫的名字叫"+name);
}
private int setAge(int age) {
return age;
}
void fly() {
System.out.println("猫不回飞");
}
}
1. Class.forName("反射.Cat")
此方法能够依据类的全限定名获取对应的 Class
对象。Class
对象代表着 Java 中的类或者接口,借助它能够在运行时获取类的相关信息。
2. clazz.getDeclaredFields()
该方法会返回一个 Field
数组,其中包含类里声明的全部字段,涵盖私有、受保护以及默认访问权限的字段。
3. clazz.getDeclaredField("fieldName")
此方法可获取类中指定名称的声明字段,无论其访问权限怎样。
4. clazz.getFields()
这个方法返回一个 Field
数组,其中仅包含类的公共字段。
5. clazz.getField("fieldName")
该方法用于获取类中指定名称的公共字段。
6. clazz.getDeclaredMethods()
此方法会返回一个 Method
数组,其中包含类里声明的全部方法,涵盖私有、受保护以及默认访问权限的方法。
7. clazz.getDeclaredMethod("methodName", parameterTypes)
该方法可获取类中指定名称和参数类型的声明方法,无论其访问权限如何。
8. clazz.getMethod("methodName", parameterTypes)
此方法用于获取类中指定名称和参数类型的公共方法。
9. clazz.getConstructors()
这个方法返回一个 Constructor
数组,其中仅包含类的公共构造函数。
10. clazz.getDeclaredConstructors()
该方法会返回一个 Constructor
数组,其中包含类里声明的全部构造函数,涵盖私有、受保护以及默认访问权限的构造函数。
11. clazz.getDeclaredConstructor(parameterTypes)
此方法可获取类中指定参数类型的声明构造函数,无论其访问权限怎样。
12. clazz.getConstructor(parameterTypes)
该方法用于获取类中指定参数类型的公共构造函数。
13. clazz.getInterfaces()
这个方法返回一个 Class
数组,其中包含类实现的所有接口。