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); } } }

 

posted @ 2022-09-25 19:25  ja不会va  阅读(25)  评论(0)    收藏  举报