JavaWeb—反射
反射:框架设计的灵魂(将一个类的各个组成部分封装成对象,每个类的运行时的类型信息就是用Class对象表示的)
Class类对象是在内存中,描述所有字节码文件特征的类
源代码阶段:表示你的Java代码还在硬盘阶段,还没有进内存,Class类对象阶段和Runtime运行时阶段:都在内存中进行
例:
功能方法
例:
public static void main(String[] args) throws Exception {
// 获取Person类的对象
Class p = Person.class;
System.out.println(p);
Field[] fields = p.getFields();
for (Field a : fields){
System.out.println(a);
}
Field a = p.getField("a");
// 获取成员变量a的值
Person p1 = new Person();
Object o = a.get(p1);
System.out.println(o);
a.set(p1,"qwe");
System.out.println(p1);
System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!");
Field[] declaredFields = p.getDeclaredFields();
for (Field b : declaredFields){
System.out.println(b);
}
System.out.println("@@@@@@@@@@@@@@");
Field age = p.getDeclaredField("age");
System.out.println(age);
age.setAccessible(true);
System.out.println("###############");
Object o1 = age.get(p1);
System.out.println(o1);
}
例:
public static void main(String[] args) throws Exception {
// 获取Person类的对象
Class personClass = Person.class;
// 获取空参数构造方法
Constructor constructor = personClass.getConstructor();
System.out.println(constructor);
System.out.println("!!!!!!!!!!!!");
// 获取有参数构造方法
Constructor constructor1 = personClass.getConstructor(String.class,int.class);
System.out.println(constructor1);
// 使用有参数构造方法创建对象
Object obj = constructor1.newInstance("asd", 12);
System.out.println(obj);
System.out.println("$$$$$");
//使用无参数构造方法创建对象方法一
Object obj1 = constructor.newInstance();
System.out.println(obj1);
System.out.println("@@@@@");
//使用无参数构造方法创建对象方法二
Object o = personClass.newInstance();
System.out.println(o);
}
例:
public static void main(String[] args) throws Exception {
// 获取Person类的对象
Class p = Person.class;
System.out.println(p);
// 获取指定名称的方法
Method method = p.getMethod("eat");
System.out.println(method);
// 执行方法,前提是要先创建对象
Person person = new Person();
// 执行方法
method.invoke(person);
//获取指定名称带参数的方法
Method method1 = p.getMethod("eat",String.class);
System.out.println(method1);
// 执行带参数的方法
method1.invoke(person,"米饭");
// 获取所有public修饰的方法,里面还包含Object类的方法
Method[] methods = p.getMethods();
for (Method methodd : methods){
System.out.println(methodd);
// 获取方法名
String name = methodd.getName();
System.out.println(name);
}
// 获取类名 ReflectDemo.Person
String name = p.getName();
System.out.println(name);
}