本人,精通 java、html、CSS、 JavaScript、 PHP、 C、 C++、 C#、 Ruby、 Perl、 python、 Objective-C、 ActionScript等单词的拼擅长Ai、Fw、Fl、Ae、Pr、Id、PS等软件的安装与卸载,熟悉windows、Linux、Mac、Android、IOS等系统的开关机

码上生活

2021年10月6日-JavaWeb学习笔记

反射概述:

框架:半成品的软件,可以在框架的基础杀那个进行软件开发,简化编码。

发射:将类的各个组成部分封装为其他对象,这就是反射机制。

java代码在计算机的三个阶段:

好处:

  • 可以在程序运行的过程中,操作这些对象。

  • 可以降低程序的耦合性,提高程序可扩展性。

获取Class对象的方式:

  • Class.forName(“类全名”):将字节码文件加载进内存,返回Class对象
    多用于配置文件,将类名定义在配置文件中。读取文件,加载类

  • 类名.Class:通过类名的属性Class获取
    多用于参数的传递

  • 对象.getClass():getClass()方法在Object里
    多用于对象的获取字节码的方式

全类名:包名.类名

结论:

同一个字节文件(*.Class)在一个程序运行中,只会被加载一次,无论是哪一种方式获取的Class文件都是同一个

带Declared的不考虑修饰符都能获取到,不带的只能获取到公共的

Class对象功能获取Field

Field[]   getFields():获取所有public修饰的成员变量

Field[]   getField(String name):获取指定名称的成员变量并且被public修饰

Field[]    getDeclaredFields():获取所有的成员变量,不考虑修饰符

Field[]    getDeclaredField(String name)获取所有指定名称的成员变量,不考虑修饰符

field:成员变量

  • 设置值:
    void(Object obj,Object value)
  • 获取值:
    get(Object obj)
  • 忽略访问权限修饰符分安全检查:
    setAccessible(true);暴力反射

代码实现:

    Class d1 = dim.class;
    //查找到所有public修饰的成员变量
    Field[] fields = d1.getFields();
    for (Field field:fields){
        System.out.println(field);
    }
    System.out.println("--------");
    //查找到叫a的成员变量并且public修饰的成员变量
    Field a1 = d1.getField("aa");
    System.out.println(a1);
    //获取a1的值
    //创建dim对象
    dim d = new dim();
    Object o = a1.get(d);
    System.out.println(o);
    //给叫aa的成员变量赋值
    a1.set(d,20);
    //获取a1的值
    // 获取值
    Object o1 = a1.get(d);
    System.out.println(o1);
    System.out.println("--------");
    //获取所有成员变量,不考虑修饰符
    Field[] declaredFields = d1.getDeclaredFields();
    for (Field f:declaredFields){
        System.out.println(f);
    }
    System.out.println("--------");
    //获取指定名称的成员变量,不考虑修饰符
    Field a = d1.getDeclaredField("aaa");
    a.setAccessible(true);//暴力反射
    //设置值
    a.set(d,"DIM");
    //获取值
    Object o2 = a.get(d);
    System.out.println(o2);
    System.out.println(a);

Class对象功能获取constructor

获取public构造方法指定: getConstructor

获取所有构造方法: getConstructors

获取public构造方法指定:getDeclaredConstructor

获取构造方法:getDeclaredConstructors

代码实现:

Class dimClass = dim.class;
//getConstructor 获取带参构造
Constructor constructor = dimClass.getConstructor(int.class, String.class);
//创建对象
Object o = constructor.newInstance(10,"dim");
System.out.println(o);
//getConstructor 获取无参构造
Constructor constructors = dimClass.getConstructor();
Object o2 = constructors.newInstance();
System.out.println(o2);
//创建空参构造简化,可以使用Class对象的newInstance
Object o3 = dimClass.newInstance();
System.out.println(o3);
// getConstructors获取所有构造方法
Constructor[] constructors1 = dimClass.getConstructors();
for (Constructor d:constructors1){
    System.out.println(d);
}

Class对象功能获取Method

获取public成员方法指定: getMethod

获取public成员方法: getMethods

获取public成员方法指定:getDeclaredMethod

获取所有成员方法:getDeclaredMethods

invoke( ):执行

代码实现:

Class dimClass = dim.class;
Method d = dimClass.getMethod("d");
//创建对象
dim dim = new dim();
//执行成员方法
Object invoke = d.invoke(dim);
System.out.println(invoke);
//带参成员方法
Method d1 = dimClass.getMethod("d", String.class);
Object nh = d1.invoke(dim, "你好");
System.out.println(nh);

//获取所有
Method[] declaredMethods = dimClass.getDeclaredMethods();
for (Method dd:declaredMethods){
    System.out.println(dd.getName());
}

Method d2 = dimClass.getDeclaredMethod("d", String.class);
Object dim1 = d2.invoke(dim, "dim");
System.out.println(dim1);