462反射-概述和463反射获取字节码class对象的三种方式
反射-概述
框架:半成品软件,可以在框架的基础上进行软件开发,简化代码
反射:将类的各个组成部分封装为其他对象,这就是反射机制
1.好处是可以在程序运行过程在,操作这些对象
2.可以解耦,提高程序的可拓展性
什么是反射?
反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。
java反射允许,在运行中操作,类所具有成员变量和方法。(通过反射private修饰的属性、方法、都可以调用)
也就是说,java反射允许我们,在程序运行的时候,可以通过反射拿到类的所有资源。
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,
都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射获取字节码class对象的三种方式
public class Person {
private String name;
private int age;
public String a;
protected String b;
String c;
private String d;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", a='" + a + '\'' +
", b='" + b + '\'' +
", c='" + c + '\'' +
", d='" + d + '\'' +
'}';
}
}
-----------------------------------------------------------
public static void main(String[] args) throws Exception {
//获取Person的Class对象
Class p= Person.class;
/*
1.获取成员变量
Field[] getFields();
Field getFields(String name);
Field [] getDeclaredFields
Field getDeclaredField(String name)
*/
//1.Field[] GetFields()
Field[] fie = p.getFields();
for (Field f:fie) {
System.out.println(f);
System.out.println("===--===");
//Field getFields(String name);
Field a = p.getField("a");
//获取成员变量a的值
Person per = new Person();
Object value = a.get(per);
System.out.println(value);
//设置a的值
a.set(per,"杰瑞");
System.out.println(per);
System.out.println("===--===");
//Field [] getDeclaredFields = 获取所以的成员变量,不考虑修饰符
Field[] decl = p.getDeclaredFields();
for (Field d:decl) {
System.out.println(d);
}
//Field getDeclaredField(String name)
Field declared = p.getDeclaredField("d");
declared.setAccessible(true);//暴力反射
//忽略访问权限修饰符的安全检查
Object value2 = declared.get(per);
System.out.println(value2);
}
}
}