什么是反射?
反射是一种在运行时解析类的技术。
public class Reflex {
public static void main(String[] args) throws Exception {
//1、必须获得操作类所对应的Class对象-一个类只对应唯一的一个class对象
//类名.class
//对象.getClass()
//Class.forName("类的全路径限定名")
Class c1 = Cat.class;
Class c2 = new Cat().getClass(); //Cat是内部类需要是静态的,因为静态随着类的加载而加载,非静态需要Reflex对象创建Cat对象
Class c3 = new Cat().getClass();
//Class c4 = Class.forName("com.springbootaop.controller.Cat");
//System.out.println(c1 == c2);//true
//System.out.println(c1 == c4);//true
//System.out.println(c3 == c2);//true
Cat o = (Cat) c1.newInstance();//调用默认的无参构造
Constructor constructor = c1.getConstructor();//获取无参构造方法
//Constructor constructor2 = c1.getConstructor(String.class);//获取带String参数的构造方法
Constructor constructor3 = c1.getConstructor(String.class, int.class);//获取带String参数&int 参数的构造方法
//通过构造方法创建对象
Cat cat = (Cat) constructor.newInstance();
//constructor2.newInstance("");
constructor3.newInstance("", 1);
Constructor[] constructors = c1.getConstructors();//获取所有的公共的构造方法
Constructor declaredConstructor = c1.getDeclaredConstructor();//获取指定的私有构造方法
Constructor[] declaredConstructors = c1.getDeclaredConstructors();//获取所有构造方法(包含私有)
//3、通过class对象获得类本身的修饰符
int modifiers = c1.getModifiers();//获得当前Person类的所有修饰符System.out.println(modifiers);
System.out.println("是不是公有的- " + Modifier.isPublic(modifiers));
System.out.println("是不是私有的- " + Modifier.isPrivate(modifiers));
System.out.println("是不是静态的- " + Modifier.isStatic(modifiers));
System.out.println("是不是最终的-" + Modifier.isFinal(modifiers));
System.out.println("是不是接口-" + Modifier.isInterface(modifiers));
//4、通过class对象获得类的属性
// Field field = c1.getField("name ");//获得公有的指定的属性值
//Field[] fields = c1.getFields();//获得公有的所有属性
Field nField = c1.getDeclaredField("name");
nField.setAccessible(true);//操作私有成员需要授权
//Field[] nFields = c1.getDeclaredFields();//获得所有公有以及私有属性值
nField.set(cat, "小舞");//给对象设置值
String catName = (String) nField.get(cat);//获取某个对象的属性值
int modifiers1 = nField.getModifiers();//获取属性修饰符
//nField.getAnnotation()获取指定注解
Method method = c1.getMethod("sleep", int.class);
Object invoke = method.invoke(cat, 1);//运行某对象的sleep方法,并获取返回值
// method.getModifiers();
// method.getAnnotation();
// method.getReturnType();
Class<?>[] parameterTypes = method.getParameterTypes();//获得形式参数类型的class对象
for (Class<?> parameterType : parameterTypes) {
System.out.println("参数类型:" + parameterType.getName()); //参数类型:int
}
Parameter[] parameters = method.getParameters();//获得形式参数的反射对象
for (Parameter parameter : parameters) {
String name = parameter.getName();
System.out.println("参数名称:" + name);//参数名称:age
//也可以获取参数的parameter.getModifiers 注解等等
}
}
public static class Cat {
private String name;
private String sex;
private int age;
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
private Cat(String name) {
this.name = name;
}
public Cat() {
}
public void sleep(int age) {
System.out.println(name + "在睡觉-->" + age);
}
public void run() {
System.out.println(name + "在跑步");
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}
}