反射
反射:框架设计的灵魂
框架:半成品软件。可以在框架的基础上进行软件开发,简化编码
反射概念:将类的各个组成部分封装为其他对象,这就是反射机制
反射用一个 数组来存储 加载的类的成员变量、构造方法、成员方法[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
反射的好处:
-
可以在程序运行过程中,操作这些对象。
-
可以解耦,提高程序的可扩展性。
获取成员变量
Field[ ] getFields( ) 获取所有public修饰的成员变量
Field getFields(String name) 获取指定的public修饰的成员变量
Fied[ ] getDeclaredFieds( ) 获取所有的成员变量 不考虑修饰符获取到成员变量后,可以执行的操作为: 设置值 void set(Object obj,Object value)和获取值
反射破坏了封装,可以直接设置值
setAccessible(true); //暴力反射 忽略安全检查
获取构造方法
用来创建对象
T newInstance(Object …initargs)
获取成员方法
getMethod 获得指定方法
Method 对象 执行方法 Object invoke(Object obj,Object … args)
获取方法名称 getName( )
获取Class对象的方式
1.Class.forName(“全类名”); 将字节码文件加载进内存,返回Class对象
2.加载进内存的类,可通过 类名,class 通过类名的属性获取
3.创建对象时,对象,getClass( ) 这个方法封装在Object类里面
public class fanshe {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, InstantiationException {
//获取Person的Class对象
Class personClass = Person.class;
//获取成员变量
Field fields = personClass.getField("school");
System.out.println(fields);
//获取成员变量的值
Person p = new Person();
Object value = fields.get(p);
System.out.println(value);
System.out.println("=================================");
//设置成员变量的值
fields.set(p,"南阳理工");
System.out.println(p);
System.out.println("=================================");
//获取所有成员变量的值
Field[] fields1 = personClass.getDeclaredFields();
for (Field d : fields1){
System.out.print(d+"||");
}
System.out.println("\n======================================");
Field d = personClass.getDeclaredField("name");
//忽略访问权限修饰符的安全检查
d.setAccessible(true); //暴力反射
Object value2 = d.get(p);
System.out.println(value2);
System.out.println("=================================");
//构造方法
Constructor constructor = personClass.getConstructor(String.class, int.class);
System.out.println(constructor);
System.out.println("=================================");
//创建对象
Object o = constructor.newInstance("保罗·乔治", 31);
System.out.println(o);
System.out.println("=================================");
//获取成员方法
Method method_eat = personClass.getDeclaredMethod("eat");
method_eat.invoke(p);
Method method_eat2 = personClass.getDeclaredMethod("eat", String.class);
method_eat2.invoke(p,"热干面");
System.out.println("=================================");
}
}
public class Person {
private String name;
private int age;
public String school;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
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 boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", school='" + school + '\'' +
'}';
}
public void eat(){
System.out.println("开饭了!!!");
}
public void eat(String food){
System.out.println("开饭了!!! 今天吃"+food);
}
}