反射

解释

加载类,解剖类的各个组成部分(成员变量,成员方法,构造器),简单来说就跟解剖牛一样,将内脏,血液,牛腱,牛腿肉,肋骨肉,,前座肉,后座肉,骨头单独拿出来

作用

  1. 可以通过反射得到类的全部的成分,进行操作,做成框架
    2.可以破坏封装性
  2. 对方法参数的提示操作
    4 . 将其类的方法,成员变量展示给你看

操作

  1. 加载类的字节码文件到内存中,再获取该类的字节码,万物皆对象,所以可以把类的字节码文件看成一个对象--class对象,而这个clss对象会封装该类的所有信息
  2. 获取类的构造器,类的构造器也是个对象 Constructor
  3. 获取类的成员变量,成员变量也是个对象`Field
  4. 获取类的成员方法,成员方法也是个对象Method

class对象

3种方式获得class对象

获得class对象的三种方式

System.out.println("获取简单的类名: "+c1.getSimpleName());//Student
System.out.println("因为只有一个Student字节码文件,所以获得的地址是相同的"+c1 == c2);//ture

获得类的方法

1.获得类的方法(public修饰的)

2.获得类的所有的方法

这里查看了所有的方法的名字及各个方法形参的个数

获得类的构造器

1. 获得类的构造器(public修饰的)

  1. 这种不推荐,获取构造器受限于修饰符,更推荐使用getDeclaredConstructor()获取类的全部构造器的方法
  2. 获取指定构造器时,可以加泛型限制<Student>, 这样就不用强转就能创建Student对象 ,但使用反射一般不加泛型限制的

2. 获得类的全部构造器

3. 获得所有的构造器的形参个数

4. 获得指定的构造器

这里获得的是有两个参数的构造器,获得无参c1.getDeclaredConstructor()里面空白即可

5.暴力反射创建构造器对象

如果你使用反射方式获取私有对象在创建对象之前不加 禁止检测访问权限constructor.setAccessible(true);,就会在创建时报错
java.lang.IllegalAccessException: class com.itheima.TestReflection cannot access a member of class com.itheima.Student with modifiers "private"

我这里是12点53分

获得类的变量

1. 获得类的变量(public修饰的)

2. 获得所有变量

3.获得变量的类型

System.out.println(declaredField.getName()+"-->"+declaredField.getType());

4. 运行方法

这里使用invoke()方法执行里面传要执行该方法的对象,及方法的实参, 有返回值就接收,没有返回值则返回null,注意私有方法也需要设置方法禁止检查访问权限

创建框架

可以通过定义一个框架类,定义静态方法,可以传老师对象和学生对象等,方法内部是通过对象.getclass()获得其class对象,再遍历获得的所有的变量名,再拿到对象变量名对应的值,



posted @ 2025-01-20 00:30  加油酱  阅读(17)  评论(0)    收藏  举报