当前位置: 首页 > news >正文

做软件公司网站/百度搜索排名购买

做软件公司网站,百度搜索排名购买,建设婚恋网站,政务公开与网站建设文章目录1.类加载器1.1类加载器【理解】1.2类加载的过程【理解】1.3类加载的分类【理解】1.4双亲委派模型【理解】1.5ClassLoader 中的两个方法【应用】2.反射2.1反射的概述【理解】2.2获取Class类对象的三种方式【应用】 第1步:获取类的Class对象2.3反射获取构造方…

文章目录

    • 1.类加载器
      • 1.1类加载器【理解】
      • 1.2类加载的过程【理解】
      • 1.3类加载的分类【理解】
      • 1.4双亲委派模型【理解】
      • 1.5ClassLoader 中的两个方法【应用】
    • 2.反射
      • 2.1反射的概述【理解】
      • 2.2获取Class类对象的三种方式【应用】 第1步:获取类的Class对象
      • 2.3反射获取构造方法并使用【应用】第2.1步:利用Class类获取对象方法
        • 2.3.1Class类获取构造方法对象的方法
        • 2.3.2Constructor类用于创建对象的方法 (构造方法获取到了,接下来第3步:利用构造方法创建对象了)
        • 2.3.3小结
      • 2.4反射获取成员变量并使用【应用】
        • 2.4.1Class类获取成员变量对象的方法 (第2步:获取成员变量 (第1步已经获取了Class类对象了))
        • 2.4.2Field类用于给成员变量赋值的方法 (第3步:使用成员变量 (前面已经获取到了成员变量对象了))
      • 2.5反射获取成员方法并使用【应用】
        • 2.5.1Class类获取成员方法对象的方法 (第2步:用Class类对象获取成员方法)
        • 2.5.2Method类用于执行方法的方法 (第3步:前面已经获取了成员方法,这里该执行成员方法了)
      • 小结:反射根据配置文件动态创建对象并执行方法
      • LX 再手敲一遍,读取配置文件,动态创建类对象,获取方法并执行

1.类加载器

1.1类加载器【理解】

  • 作用

    负责将.class文件(存储的物理文件)加载在到内存中

在这里插入图片描述

1.2类加载的过程【理解】

  • 类加载时机

    • 创建类的实例(对象)
    • 调用类的类方法
    • 访问类或者接口的类变量,或者为该类变量赋值
    • 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
    • 初始化某个类的子类
    • 直接使用java.exe命令来运行某个主类
  • 类加载过程

    1. 加载

      • 通过包名 + 类名,获取这个类,准备用流进行传输
      • 将这个类加载到内存中
      • 加载完毕创建一个class对象 类在内存中不能随便乱放,得为每个类创建一个Class对象来存放这个类的信息

在这里插入图片描述

  1. 链接

    • 验证

      确保Class文件字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安全

      (文件中的信息是否符合虚拟机规范有没有安全隐患)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HzUSJvbX-1676707016232)(.\img\03_类加载过程验证.png)]

    • 准备

      负责为类的类变量(被static修饰的变量)分配内存,并设置默认初始化值

      (初始化静态变量) 静态变量有默认的初始化值 开辟空间 赋值为null 注意只为static修饰的静态变量赋初值

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VrfQ087y-1676707016234)(.\img\04_类加载过程准备.png)]

    • 解析

      将类的二进制数据流中的符号引用替换为直接引用

      (本类中如果用到了其他类,此时就需要找到对应的类)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B12DVgn5-1676707016235)(.\img\05_类加载过程解析.png)]
    在这里插入图片描述

“将类的二进制数据流中的符号引用替换为直接引用”:
加载好了类Student,但是其成员name是引用类型,对应的String类到底有没有被加载呀,加载了在哪呀? 所以String先是符号引用
----内存中找到String类------ 就变成了 直接引用(String类型)

  1. 初始化

    根据程序员通过程序制定的主观计划去初始化类变量和其他资源

    (静态变量赋值以及初始化其他资源)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dxugFrGa-1676707016235)(.\img\06_类加载过程初始化.png)]

  • 小结

    • 当一个类被使用的时候,才会加载到内存
    • 类加载的过程: 加载、验证、准备、解析、初始化

1.3类加载的分类【理解】

  • 分类

    • Bootstrap class loader:虚拟机的内置类加载器,通常表示为null ,并且没有父null
    • Platform class loader:平台类加载器,负责加载JDK中一些特殊的模块
    • System class loader:系统类加载器(应用程序类加载器),负责加载用户类路径上所指定的类库
  • 类加载器的继承关系

    • System的父加载器为Platform
    • Platform的父加载器为Bootstrap

1.4双亲委派模型【理解】

  • 介绍

    如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式

是逻辑上的父子关系,不是extends的继承父子关系。 就是把类加载任务委托给‘父亲’去加载
某个父亲加载不了就返回,直到最后没办法,自己才去加载
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yyyPYrfH-1676709561222)(.\img\07_双亲委派模型.png)]

1.5ClassLoader 中的两个方法【应用】

  • 方法介绍

    方法名说明
    public static ClassLoader getSystemClassLoader()获取系统类加载器
    public InputStream getResourceAsStream(String name)加载某一个资源文件
    public class ClassLoaderDemo1 {public static void main(String[] args) {//获得系统类加载器ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();//获得系统类加载器的父加载器 --- 平台类加载器ClassLoader platformClassLoader = systemClassLoader.getParent();//获得平台类加载器的父加载器 --- 启动类加载器ClassLoader bootstrapClassLoader = platformClassLoader.getParent();System.out.println("系统类加载器"+systemClassLoader);System.out.println("平台类加载器"+platformClassLoader);System.out.println("启动类加载器"+bootstrapClassLoader);}
    }
    

    在这里插入图片描述

  • LX 读取properties文件

    • prop.properties
    name=zhangsan
    age=13
    
    • ClassLoaderDemo2.java
    public class ClassLoaderDemo2 {public static void main(String[] args) throws IOException {//static ClassLoader getSystemClassLoader() 获取系统类加载器//InputStream getResourceAsStream(String name)  加载某一个资源文件//获取系统类加载器ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();//利用加载器去加载一个指定的文件//参数:文件的路径(放在src的根目录下,默认去那里加载)//返回值:字节流。InputStream is = systemClassLoader.getResourceAsStream("prop.properties");Properties prop = new Properties();prop.load(is);System.out.println(prop);is.close();}
    }
    

    在这里插入图片描述

    • ClassLoaderDemo2.java 整理后很简单
    public class ClassLoaderDemo2_1 {public static void main(String[] args) throws IOException {// 获得系统类加载器ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();// 利用加载器加载一个指定文件 返回字节流InputStream is = systemClassLoader.getResourceAsStream("prop.properties");Properties prop = new Properties();prop.load(is);System.out.println("prop = " + prop);is.close();}
    }
    

2.反射

2.1反射的概述【理解】

  • 反射机制

    是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
    对于任意一个对象,都能够调用它的任意属性和方法;
    这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。

2.2获取Class类对象的三种方式【应用】 第1步:获取类的Class对象

  • 三种方式分类

    • 类名.class属性

    • 对象名.getClass()方法

    • Class.forName(全类名)方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sADuhDGD-1676715280381)(.\img\08_获取Class对象的三种方式.png)]

  • 示例代码
    Student.java

package cn.whu.myreflect1;public class Student {private String name;private int age;//空参构造,全参构造,toString,所有get/setpublic void study(){System.out.println("学生在学习");}
}

ReflectDemo1.java

/*** 各种获取类的Class对象的方法*/
public class ReflectDemo1 {public static void main(String[] args) throws ClassNotFoundException {//方法1.Class类中的静态方法forName("全类名") //所谓全类名: 包名.类名Class clazz = Class.forName("cn.whu.myreflect1.Student");System.out.println(clazz);//class cn.whu.myreflect1.Student//方法2.通过class属性来获取Class clazz2 = Student.class;System.out.println(clazz2);//class cn.whu.myreflect1.Student//方法3.利用对象的getClass方法来获取class对象//getClass方法是定义在Object类中的,所以任何对象都有Student stu = new Student();Class clazz3 = stu.getClass();System.out.println(clazz3);//class cn.whu.myreflect1.StudentSystem.out.println(clazz == clazz2);//trueSystem.out.println(clazz2 == clazz3);//true}
}

在这里插入图片描述
无视修饰符: 无视private还是public


有了Class对象可以干嘛,可以获取类的所有信息,主要也就三类:构造器、普通方法、成员变量
Class对象组成如下:
在这里插入图片描述


2.3反射获取构造方法并使用【应用】第2.1步:利用Class类获取对象方法

2.3.1Class类获取构造方法对象的方法

  • 方法介绍

    方法名说明
    Constructor<?>[] getConstructors()返回所有公共构造方法对象的数组
    Constructor<?>[] getDeclaredConstructors()返回所有构造方法对象的数组
    Constructor getConstructor(Class<?>… parameterTypes)返回单个公共构造方法对象
    Constructor getDeclaredConstructor(Class<?>… parameterTypes)返回单个构造方法对象
  • Student.java
package cn.whu.myreflect2;public class Student {private String name;private int age;//私有的有参构造private Student(String name){System.out.println("name值为:"+name);System.out.println("private Student 有参构造方法");}//公共无参构造public Student() {System.out.println("public Student 无参构造方法");}//公共有参构造public Student(String name,int age){System.out.println("name值为:"+name+" age值为:"+age);System.out.println("public Student 有参构造方法");}
}
  • Constructor<?>[] getConstructors() 返回所有公共构造方法对象的数组
    public static void main(String[] args) throws ClassNotFoundException {//1.不管那种获取方法 第一步都得先获取Class对象啊Class<?> clazz = Class.forName("cn.whu.myreflect2.Student");//2. Constructor<?>[] getConstructors()	返回所有公共构造方法对象的数组Constructor<?>[] constructors = clazz.getConstructors();for (Constructor<?> constructor : constructors) {System.out.println(constructor);}}

在这里插入图片描述

  • Constructor<?>[] getDeclaredConstructors() 返回所有构造方法对象的数组
   public static void main(String[] args) throws ClassNotFoundException {//1.不管那种获取方法 第一步都得先获取Class对象啊Class<?> clazz = Class.forName("cn.whu.myreflect2.Student");//2. Constructor<?>[] getDeclaredConstructors()	返回所有构造方法对象的数组Constructor<?>[] declaredAnnotations = clazz.getDeclaredConstructors();for (Constructor declaredAnnotation : declaredAnnotations) {System.out.println(declaredAnnotation);}

在这里插入图片描述

  • Constructor getConstructor(Class<?>… parameterTypes) 返回单个公共构造方法对象
    参数就写构造方法的形式参数类型对应的Class类
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {//1.不管那种获取方法 第一步都得先获取Class对象啊Class<?> clazz = Class.forName("cn.whu.myreflect2.Student");//2. Constructor getConstructor(Class<?>… parameterTypes)	返回单个公共构造方法对象Constructor<?> constructor1 = clazz.getConstructor();System.out.println(constructor1);//public cn.whu.myreflect2.Student() 公共空参构造Constructor<?> constructor2 = clazz.getConstructor(String.class, int.class);//参数类型就写构造方法的形参类型和顺序System.out.println(constructor2);//public cn.whu.myreflect2.Student(java.lang.String,int) //string,int参构造方法//Constructor<?> constructor3 = clazz.getConstructor(int.class);//报错 并没有一个参数为(int)的构造方法}

在这里插入图片描述

  • Constructor getDeclaredConstructor(Class<?>… parameterTypes) 返回单个构造方法对象
    私有的也可以获取到
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {//1.不管那种获取方法 第一步都得先获取Class对象啊Class<?> clazz = Class.forName("cn.whu.myreflect2.Student");//2. Constructor getDeclaredConstructor(Class<?>… parameterTypes)	返回单个构造方法对象// 私有的也可以获取到Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(String.class);System.out.println(declaredConstructor);}

在这里插入图片描述

2.3.2Constructor类用于创建对象的方法 (构造方法获取到了,接下来第3步:利用构造方法创建对象了)

  • 方法介绍

    方法名说明
    T newInstance(Object…initargs)根据指定的构造方法创建对象
    setAccessible(boolean flag)设置为true,表示取消访问检查
  • T newInstance(Object…initargs) 根据指定的构造方法创建对象
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {//1. 第一步永远都是先获取Class对象Class<?> clazz = Class.forName("cn.whu.myreflect2.Student");//2.获取构造方法对象Constructor<?> constructor = clazz.getConstructor(String.class, int.class);//3.利用newInstance 创建Student对象Student student = (Student) constructor.newInstance("张三",23); // 当然创建对象时的实参值得这时候传递了// 此时,构造方法会自动执行System.out.println("student = " + student);}

在这里插入图片描述
类似的调用空参构造

    public static void main(String[] args) throws Exception {//1. 第一步永远都是先获取Class对象Class<?> clazz = Class.forName("cn.whu.myreflect2.Student");//2.获取构造方法对象Constructor<?> constructor = clazz.getConstructor();//3.利用newInstance 创建Student对象Student student = (Student) constructor.newInstance(); // 当然创建对象时的实参值得这时候传递了// 此时,构造方法会自动执行System.out.println("student = " + student);}

在这里插入图片描述
空参构造还有个简写方式(过时方法 了解即可)

    public static void main(String[] args) throws Exception {        // 反射调用空参创建对象简写格式//1. 第一步永远都是先获取Class对象Class<?> clazz = Class.forName("cn.whu.myreflect2.Student");//2. 在Class类中,有一个newInstance方法,可以利用空参直接创建一个对象 (直接跳过了获得构造对象那一步)Student student = (Student) clazz.newInstance(); // 该方法已经过时 了解即可System.out.println(student);}

在这里插入图片描述

  • setAccessible(boolean flag) 设置为true,表示取消访问检查(可以临时使用私有成员了)

★获取一个私有的构造方法,创建对象★
多一步,临时取消访问检查

	public static void main(String[] args) throws Exception {//1. 第一步永远都是先获取Class对象Class<?> clazz = Class.forName("cn.whu.myreflect2.Student");//2.获取构造私有方法对象Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);//直接创建对象会报错 毕竟私有,直接调用私有构造方法肯定不妥//也即:被private修饰的成员,不能直接使用//如果用反射强行获取并使用,需要临时取消访问检查constructor.setAccessible(true);//临时取消(私有)访问检查//3.利用newInstance 创建Student对象Student student = (Student) constructor.newInstance("张三"); // 当然创建对象时的实参值得这时候传递了// 此时,构造方法会自动执行System.out.println("student = " + student);}

在这里插入图片描述
反射可以强行获取私有方法,并强行用其获取对象

2.3.3小结

  • 获取class对象

    三种方式: Class.forName(“全类名”), 类名.class, 对象名.getClass()

  • 获取里面的构造方法对象

    getConstructor (Class<?>... parameterTypes) getDeclaredConstructor (Class<?>… parameterTypes)

  • 如果是public的,直接创建对象

    newInstance(Object… initargs)

  • 如果是非public的,需要临时取消检查,然后再创建对象

    setAccessible(boolean) 暴力反射
    在这里插入图片描述

2.4反射获取成员变量并使用【应用】

2.4.1Class类获取成员变量对象的方法 (第2步:获取成员变量 (第1步已经获取了Class类对象了))

  • 方法分类

    方法名说明
    Field[] getFields()返回所有公共成员变量对象的数组
    Field[] getDeclaredFields()返回所有成员变量对象的数组
    Field getField(String name)返回单个公共成员变量对象
    Field getDeclaredField(String name)返回单个成员变量对象

公共成员变量:仅仅public修饰的成员变量
所有成员变量:public、private、protect… 修饰的成员变量

  • Student.java
public class Student {public String name;public int age;public String gender;private int money = 300;//3个public 仅仅int money一个private
}
  • Field[] getFields() 返回所有公共成员变量对象的数组 (仅仅public)
    public static void main(String[] args) throws Exception {//Field[] getFields()	返回所有公共成员变量对象的数组//1.第一步永远还是获取对呀类的Class对象Class clazz = Class.forName("cn.whu.myreflect3.Student");//2.第二步:获取Field对象Field[] fields = clazz.getFields();for (Field field : fields) {System.out.println(field); //所有public成员变量}}

在这里插入图片描述

  • Field[] getDeclaredFields() 返回所有成员变量对象的数组 (包括私有)
    public static void main(String[] args) throws Exception {//Field[] getDeclaredFields()	返回所有成员变量对象的数组 (包括私有)//1.第一步永远还是获取对呀类的Class对象Class clazz = Class.forName("cn.whu.myreflect3.Student");//2.第二步:获取Field对象Field[] declaredFields = clazz.getDeclaredFields();for (Field declaredField : declaredFields) {System.out.println(declaredField);}}

在这里插入图片描述

  • Field getField(String name) 返回单个公共成员变量对象 (仅仅public)
    public static void main(String[] args) throws Exception {//Field getField(String name)	返回单个公共成员变量对象//1.第一步永远还是获取对呀类的Class对象Class clazz = Class.forName("cn.whu.myreflect3.Student");//2.第二步:获取Field对象Field age = clazz.getField("age"); //传入变量名即可//Field age = clazz.getField("age1"); //倘若没有这个变量 则会报错//Field money = clazz.getField("money"); //私有的也会报错System.out.println(age);}

在这里插入图片描述

  • Field getDeclaredField(String name) 返回单个成员变量对象 (包括私有)
    public static void main(String[] args) throws Exception {        //Field getDeclaredField(String name)	返回单个成员变量对象//1.第一步永远还是获取对呀类的Class对象Class clazz = Class.forName("cn.whu.myreflect3.Student");//2.第二步:获取Field对象Field age = clazz.getDeclaredField("age"); // 传入变量名 获取公有变量Field money = clazz.getDeclaredField("money"); // 私有的也可以获取System.out.println(age);System.out.println(money);}

在这里插入图片描述

2.4.2Field类用于给成员变量赋值的方法 (第3步:使用成员变量 (前面已经获取到了成员变量对象了))

  • 方法介绍

    方法名说明
    void set(Object obj, Object value)赋值
    Object get(Object obj)获取值

第一个参数就是要赋值或者获取值的 具体对象 (一个类好多对象 到底赋值给哪个对象,肯定要说明一下的)

  • 示例代码
  • void set(Object obj, Object value) 赋值
    public static void main(String[] args) throws Exception {//void set(Object obj, Object value)	赋值//1.第一步永远还是获取对呀类的Class对象Class clazz = Class.forName("cn.whu.myreflect3.Student");//2.获取age这个Filed对象Field age = clazz.getField("age");//3.利用set方法进行赋值//3.1先创建一个Student对象 (不然赋值给谁呢?)Student student = (Student) clazz.newInstance();//空参的简写形式(跳过了获取构造方法那步)//3.2有了对象才可以给指定对象进行赋值age.set(student,18); //给student对象的age属性赋值18System.out.println(student.age);//18}

在这里插入图片描述

  • Object get(Object obj) 获取值

    访问私有成员,都必须取消访问检查

    public static void main(String[] args) throws Exception {//Object get(Object obj)	获取值//1.第一步永远还是获取对呀类的Class对象Class clazz = Class.forName("cn.whu.myreflect3.Student");//2.获取age这个Filed对象Field money = clazz.getDeclaredField("money");//直接获取一个私有的//3.☆想再下面访问私有成员,都必须取消访问检查money.setAccessible(true);//4.调用get方法,获取money值//4.1 还是得提前创建实际对象Student student = (Student) clazz.newInstance();//4.2 获取指定对象的money值Object val = money.get(student);System.out.println(val);//300}

在这里插入图片描述

2.5反射获取成员方法并使用【应用】

2.5.1Class类获取成员方法对象的方法 (第2步:用Class类对象获取成员方法)

  • 方法分类

    方法名说明
    Method[] getMethods()返回所有公共成员方法对象的数组,包括继承的
    Method[] getDeclaredMethods()返回所有成员方法对象的数组,不包括继承的
    Method getMethod(String name, Class<?>… parameterTypes)返回单个公共成员方法对象
    Method getDeclaredMethod(String name, Class<?>… parameterTypes)返回单个成员方法对象
  • 示例代码

  • Student.java

public class Student {// 私有,无参,无返回值private void fun(){System.out.println("私有的show方法,无参,无返回值");}// 公共,无参,无返回值public void fun1(){System.out.println("公共的fun1方法,无参,无返回值");}// 公共,有参,无返回值public void fun2(String name){System.out.println("公共的fun2方法,有参,无返回值, 参数为:"+name);}// 公共,无参,有返回值public String fun3(){System.out.println("公共的fun3方法,无参,有返回值, 参数为:");return "zhangsan";}// 公共,有参,有返回值public String fun4(String name){System.out.println("公共的fun4方法,有参,有返回值, 参数为:"+name);return "zhangsan";}
}
  • Method[] getMethods() 返回所有公共成员方法对象的数组,包括继承的
    public static void main(String[] args) throws Exception {//Method[] getMethods()	返回所有公共成员方法对象的数组,包括继承的//1.第一步永远是先获取Class对象Class clazz = Class.forName("cn.whu.myreflect4.Student");//2.获取成员方法对象Method[] methods = clazz.getMethods();//所有公共成员方法for (Method method : methods) {System.out.println(method); // 所有public都打印出来了 (包括一大堆从Object里继承的)}}

在这里插入图片描述

  • Method[] getDeclaredMethods() 返回所有成员方法对象的数组,不包括继承的
    public static void main(String[] args) throws Exception {//extracted1();//Method[] getDeclaredMethods()	返回所有成员方法对象的数组,不包括继承的//1.第一步永远是先获取Class对象Class clazz = Class.forName("cn.whu.myreflect4.Student");//2.获取成员方法对象Method[] declaredMethods = clazz.getDeclaredMethods();//所有方法,包括私有 (但继承的就获取不到了 (私有的也不会被继承))for (Method declaredMethod : declaredMethods) {System.out.println(declaredMethod);}}

在这里插入图片描述

  • Method getMethod(String name, Class<?>… parameterTypes) 返回单个公共成员方法对象
    public static void main(String[] args) throws Exception {//Method getMethod(String name, Class<?>… parameterTypes)	返回单个公共成员方法对象//1.第一步永远是先获取Class对象Class clazz = Class.forName("cn.whu.myreflect4.Student");//2.获取成员方法对象Method fun1 = clazz.getMethod("fun1");//第一个参数方法名,该方法本身有参数就接着写在后面System.out.println(fun1); // public void cn.whu.myreflect4.Student.fun1()//获取有形参的方法Method fun2 = clazz.getMethod("fun2", String.class); // 方法名,形参1.class,形参2.class ....System.out.println(fun2); // public void cn.whu.myreflect4.Student.fun2(java.lang.String)}
  • Method getDeclaredMethod(String name, Class<?>… parameterTypes) 返回单个成员方法对象 (主要用来获取私有成员)
    public static void main(String[] args) throws Exception {//Method getDeclaredMethod(String name, Class<?>… parameterTypes)	返回单个成员方法对象//1.第一步永远是先获取Class对象Class clazz = Class.forName("cn.whu.myreflect4.Student");//2.获取成员方法对象 私有fun方法Method fun = clazz.getDeclaredMethod("fun");System.out.println(fun);//只是看一下 完全可以(不必取消访问检查)}

在这里插入图片描述

2.5.2Method类用于执行方法的方法 (第3步:前面已经获取了成员方法,这里该执行成员方法了)

  • 方法介绍

    方法名说明
    Object invoke(Object obj, Object… args)运行方法

    参数一: 用obj对象调用该方法

    参数二: 调用方法的传递的实际参数(如果没有就不写)

    返回值: 方法的返回值(如果没有就不写)

  • 示例代码

    public static void main(String[] args) throws Exception {//Object invoke(Object obj, Object… args)	运行方法//参数一: 用obj对象调用该方法//参数二: 调用方法的传递的实际参数(如果没有就不写)//返回值: 方法的返回值(如果没有就不写)//1. 第一步永远是先获取Class对象Class clazz = Class.forName("cn.whu.myreflect4.Student");//2. 获取里面的Method对象, fun4 (最难的,有参,有返回值)Method fun4 = clazz.getMethod("fun4", String.class);//要指定方法参数类型//3. 运行方法//3.1 先得创建实际对象,作为方法的调用者(对象调用方法运行嘛)Student student = (Student) clazz.newInstance();//又是简写形式(跳过了获取构造器的一步)//3.2 有了对象,就可以在该对象上执行方法了Object ret = fun4.invoke(student,"myname"); //实参 依次写在后面  有返回值就直接接收就行了System.out.println(ret);}

在这里插入图片描述

小结:反射根据配置文件动态创建对象并执行方法

小结:
1、获取Class对象
Class clazz = Class.forName("cn.whu.myreflect1.Student");
Class clazz2 = Student.class;
Class clazz3 = new Student().getClass();2、通过Class对象获取三类成员
Constructor constructor = clazz.getConstructor(); // 获取构造器 (详细介绍了多种方式)
Method method = clazz.getMethod("name"); //获取方法 (详细介绍了多种方式)
Field field clazz.getField(String name) // 获取变量名 (详细介绍了多种方式)3、通过获取的构造器创建对象
Object o = constructor.newInstance();4、通过对象和方法,执行对应方法
method.invoke(o);//学生在学习

反射可以根据配置文件,动态创建对象,并调用对象的方法
在这里插入图片描述

ReflectDemo2.java

package cn.whu.myreflect1;import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;/*** 根据配置文件创建对象,并执行对象方法*/
public class ReflectDemo2 {public static void main(String[] args) throws ClassNotFoundException, IOException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException {//获取系统类加载器,加载prop.properties文件InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("prop.properties");//得先创建一个Properties集合Properties prop = new Properties();//将文件中的数据读取到集合中prop.load(is);is.close();//---- 下面利用【反射】创建对象并调用方法 ----// 死步骤 能看懂 最好是记住//获取字节码文件对象Class clazz = Class.forName(prop.getProperty("className"));//配置文件里className配置好的全路径名//(通过类Class对象)获取构造器对象Constructor constructor = clazz.getConstructor();//利用构造器创建一个对象Object o = constructor.newInstance();//获取方法对象Method method = clazz.getMethod(prop.getProperty("methodName"));//配置文件里配置好的方法名//运行方法method.invoke(o);//学生在学习}
}

prop.properties

className=cn.whu.myreflect1.Worker
methodName=work

在这里插入图片描述

LX 再手敲一遍,读取配置文件,动态创建类对象,获取方法并执行

propLX.properties

className=cn.whu.LX.Worker
methodName=show

Worker.java

package cn.whu.LX;public class Worker {private String name;private int age;public Worker() {}public Worker(String name, int age) {this.name = name;this.age = age;}public String show(){System.out.println("我叫"+name+" 我今年"+age+"岁啦");//成员变量 类内部可以随便访问return "明年就"+(age+1)+"岁啦";}}

myreflectLX.java

package cn.whu.LX;import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Properties;public class myreflectLX {public static void main(String[] args) throws Exception {// 1.类加载器获取输入流 读取Property配置文件 获取配置信息InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("propLX.properties");Properties prop = new Properties();prop.load(is);is.close();System.out.println("prop = "+prop);String className = prop.getProperty("className");String methodName = prop.getProperty("methodName");System.out.println("className = "+className);System.out.println("methodName = "+methodName);//2.反射 动态根据(类名className)和(其方法名methodName) 创建对象 并用对象调用该方法//2.1 获取Class对象Class clazz = Class.forName(className);//有了Class对象 啥都能获取了//2.2 获取有参数构造并创建对象Constructor constructor = clazz.getConstructor(String.class, int.class);Worker worker = (Worker) constructor.newInstance("紫英", 24);//2.3 获取方法Method method = clazz.getMethod(methodName);//2.4 用对象调用方法Object ret = method.invoke(worker);//该方法有返回值就接收System.out.println(ret);}
}

在这里插入图片描述

相关文章:

15-基础加强-1-类加载器反射

文章目录1.类加载器1.1类加载器【理解】1.2类加载的过程【理解】1.3类加载的分类【理解】1.4双亲委派模型【理解】1.5ClassLoader 中的两个方法【应用】2.反射2.1反射的概述【理解】2.2获取Class类对象的三种方式【应用】 第1步&#xff1a;获取类的Class对象2.3反射获取构造方…...

基于SSM,Spring, BootStrap 毕业设计管理系统的设计与实现

目录 一.前言介绍 二、主要技术 2.1 SSM框架介绍 2.2 MYSQL数据库 2.3 持久层框架MyBatis 2.4 前端框架BootStrap 三. 系统设计 3.1 系统架构设计 3.2 系统功能模块 3.2.1 学生模块 3.2.2 教师模块 3.2.3 管理员模块 四、数据库设计 4.1 数据分析 4.2 概念设计 …...

一招鉴别真假ChatGPT,并简要介绍ChatGPT、GPT、GPT2和GPT3模型之间的区别和联系

以下内容除红色字体部分之外&#xff0c;其他均来源于ChatGPT自动撰写。 ChatGPT是基于GPT模型的对话生成模型&#xff0c;旨在通过对话模拟实现自然语言交互。它是为了改善人机对话体验而设计的&#xff0c;主要应用于聊天机器人、智能客服等场景。 与GPT模型相比&#xff0c;…...

华为OD机试 - 特异性双端队列(JS)

特异性双端队列 题目 有一个特异性的双端队列,该队列可以从头部到尾部添加数据,但是只能从头部移除数据。 小A一次执行 2n 个指令往队列中添加数据和移除数据, 其中 n 个指令是添加数据(可能从头部也可以从尾部添加) 依次添加 1 到 n , n 个指令是移出数据 现在要求移除数…...

Nginx自动封禁可疑Ip

文章目录一、Nginx封禁ip1、简介2、nignx 禁止IP访问2.1 方法一2.2 方法二3、关于 deny 的使用二、脚本自动封禁Ip1、流程介绍2、脚本实战2.1 核心脚本解释2.2 编写shell脚本2.3 crontab定时一、Nginx封禁ip 1、简介 在网站维护过程中&#xff0c;有时候我们需要对一些IP地址…...

分布式事务--理论基础

1、事务基础 1.1、什么是事务 事务可以看做是一次大的活动&#xff0c;它由不同的小活动组成&#xff0c;这些活动要么全部成功&#xff0c;要么全部失败。 1.2、本地事务 在同一个进程内&#xff0c;控制同一数据源的事务&#xff0c;称为本地事务。例如数据库事务。 在计…...

Matlab数学建模常用算法及论文插图绘制模板资源合集

最近有很多朋友咨询我关于Matlab论文插图绘制方面的问题。 问了一下&#xff0c;这些朋友中&#xff0c;除了写博士论文的&#xff0c;大部分都是要参加美赛的。 这让我突然想起&#xff0c;自己曾经为了水论文&#xff0c;购买过一批Matlab数学建模的资料。 想了想&#xf…...

C语言【动态内存管理 后篇】

动态内存管理 后篇&#x1fac5;经典例题&#x1f926;‍♂️题目1&#x1f926;‍♂️题目2&#x1f926;‍♂️题目3&#x1f926;‍♂️题目4&#x1fac5;C/C程序的内存开辟前面的一篇文章动态内存管理 前篇&#xff0c;我们已经了解过了动态内存管理的相关信息&#xff0c…...

四大步骤,教你彻底关闭Win10自动更新

文章目录一、禁用Windows Update服务二、在组策略里关闭Win10自动更新相关服务三、禁用任务计划里边的Win10自动更新四、在注册表中关闭Win10自动更新参考资料一、禁用Windows Update服务 1、同时按下键盘 Win R&#xff0c;打开运行对话框&#xff0c;然后输入命令 services…...

通信算法之一百零四:QPSK完整收发仿真链路

1.发射机物理层基带仿真链路 1.1 % Generates the data to be transmitted [transmittedBin, ~] BitGenerator(); 2.2 % Modulates the bits into QPSK symbols modulatedData QPSKModulator(transmittedBin); 2.3 % Square root Raised Cosine Transmit Filter %comm…...

时间复杂度(超详解+例题)

全文目录引言如何衡量一个算法的好坏时间复杂度时间复杂度的定义时间复杂度的大O表示法实例test1test2test3test4test5总结引言 如何衡量一个算法的好坏 我们在写算法的时候&#xff0c;对于实现同样的作用的不同算法&#xff0c;我们如何判断这个算法的好坏呢&#xff1f; …...

【Java面试总结】Maven篇

【Java面试总结】Maven篇1.Maven坐标是啥2.Maven常见的依赖范围有哪些?3.多模块如何聚合4.对于一个多模块项目&#xff0c;如果管理项目依赖的版本5.maven怎么解决版本冲突6.Maven常用命令有哪些&#xff1f;1.Maven坐标是啥 一般maven使用groupID&#xff0c;artifactId&…...

【每日一题Day123】LC1792最大平均通过率 | 堆

最大平均通过率【LC1792】 一所学校里有一些班级&#xff0c;每个班级里有一些学生&#xff0c;现在每个班都会进行一场期末考试。给你一个二维数组 classes &#xff0c;其中 classes[i] [passi, totali] &#xff0c;表示你提前知道了第 i 个班级总共有 totali 个学生&#…...

[安装之5] Mac pro更换大内存固态硬盘实践教程

近由于mac电脑内存吃紧&#xff0c;安装大的软件&#xff0c;是不是要提示一下内存不够&#xff0c;内心非常的不爽。作为一款A1502版的mac&#xff0c;128G固态硬盘通常被称为“乞丐版”。提前做好准备工作后&#xff0c;我周末花了一天的时间搞定这件事&#xff0c;为了能够帮…...

04 Python变量的声明与使用

基本上,在所有的计算机编程语言中,都会用到变量,变量将数据存储在计算机内存中。 变量是指存储数据的内存地址,通过变量名,我们可以找到这个变量名对应的内容。 命名变量时不允许使用数字、特殊字符、连字符开头。 变量可以有一个短名称(如 x、y、z),但强烈建议使用更具…...

LeetCode 2418. 按身高排序

给你一个字符串数组 names &#xff0c;和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。 对于每个下标 i&#xff0c;names[i] 和 heights[i] 表示第 i 个人的名字和身高。 请按身高 降序 顺序返回对应的名字数组 names 。 示例 1&#xff1a; 输…...

一文了解Hotspot虚拟机下JAVA对象从创建到回收的生命周期

Java虚拟机是Java的核心和基础&#xff0c;他是Java编译器和操作系统平台之间处理器&#xff0c;能实现跨平台运行Java程序。本文主要讲解的是虚拟机如何管理对象&#xff0c;即Java对象在JVM虚拟机中被创建到回收的流程 Java对象从创建到回收的生命周期对象创建流程1.类加载检…...

【Java基础】Java对象创建的几种方式

先上关键内容&#xff0c;所用到的代码请参考文末示例代码。一、使用new关键字创建对象这是一种最常用的创建对象的方式。Student student1 new Student();二、使用Class的newInstance()方法创建对象需要有一个无参构造方法&#xff0c;这个newInstance()方法调用无参的构造函…...

社保缴费满15年就可以不缴了?6个很多人最关心的问题权威解答来了

一、社保缴费满15年就可以不缴了&#xff1f; 上海市政府新闻办公室2022年在微信号发文表示&#xff0c;社会保险是由国家通过立法强制建立的社会保障制度&#xff0c;用人单位和劳动者都必须依法参加社会保险。即使职工与用人单位商议签订了不参加社保的所谓“协议”&#xf…...

关于HDFS

目录 一、HDFS概述 二、HDFS架构与工作机制 三、HDFS的Shell操作 四、Hdfs的API操作 一、HDFS概述 HDFS&#xff1a;Hadoop Distributed File System&#xff1b;一种分布式文件管理系统&#xff0c;通过目录树定位文件。使用场景&#xff1a;一次写入&#xff0c;多次读出…...

C++入门:类 对象

C 在 C 语言的基础上增加了面向对象编程&#xff0c;C 支持面向对象程序设计。类是 C 的核心特性&#xff0c;通常被称为用户定义的类型。类用于指定对象的形式&#xff0c;它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成…...

Python生日系统

#免费源码见文末公众号# 录入生日 def write():keyvar1.get()valuevar2.get()with open(d:\\生日系统.pickle,rb) as file:dictspickle.load(file)dicts[key]valuewith open(d:\\生日系统.pickle,wb) as file:pickle.dump(dicts,file)file.close() 查询生日 def read():namev…...

< CSDN周赛解析:第 28 期 >

CSDN周赛解析&#xff1a;第 27 期&#x1f449; 第一题&#xff1a; 小Q的鲜榨柠檬汁> 题目解析> 解决方案&#x1f449; 第二题&#xff1a; 三而竭> 解析> 解决方案> 拓展知识&#x1f449; 第三题&#xff1a; 隧道逃生> 解析> 解决方案&#x1f449;…...

【题外话】如何拯救小米11Pro这款工业垃圾

1 背景媳妇用小米11Pro手机&#xff0c;某日不慎摔落&#xff0c;幸好屏幕未碎&#xff0c;然而WiFi却怎样都无法打开&#xff0c;初以为是系统死机&#xff0c;几天依旧故障无法使用。现在的手机没有WiFi功能&#xff0c;就无法刷抖音、看视频&#xff0c;就是鸡肋了。后抽空去…...

Python中有哪些常用操作?这20个你都会吗

Python 是一个解释型语言&#xff0c;可读性与易用性让它越来越热门。 正如 Python 之禅中所述&#xff1a; 优美胜于丑陋&#xff0c;明了胜于晦涩。 在你的日常编码中&#xff0c;以下技巧可以给你带来意想不到的收获。 1、字符串反转 下面的代码片段&#xff0c;使用 P…...

【LeetCode】剑指 Offer(4)

目录 写在前面&#xff1a; 题目&#xff1a;剑指 Offer 10- I. 斐波那契数列 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 10- II. …...

庄懂的TA笔记(十二)<>

庄懂的TA笔记&#xff08;十二&#xff09;&#xff1c;&#xff1e;一、作业展示&#xff0c;答疑&#xff1a;1、作业&#xff1a;2、答疑&#xff1a;二、作业示范&#xff0c;分析&#xff1a;1、文档分析&#xff1a;2、资源分析&#xff1a;3、资源优化&#xff1a;4、光…...

学分绩点(2023寒假每日一题 5)

北京大学对本科生的成绩施行平均学分绩点制&#xff08;GPA&#xff09;。 既将学生的实际考分根据不同的学科的不同学分按一定的公式进行计算。 公式如下&#xff1a; 实际成绩 绩点 90——100 4.0 85——89 3.7 82——84 3.3 78——81 3.0 75…...

Framework学习之旅:Zygote进程

概述 在Android系统中&#xff0c;DVM(Dalvik 虚拟机和ART、应用程序进程以及运行系统的关键服务SystemServer进程都是由Zygote进程来创建的。通过fork&#xff08;复制进程&#xff09;的形式来创建应用程进程和SystemServer进程&#xff0c;由于Zygote进程在启动时会创建DVM…...

HTTP基础知识

关键字&#xff1a;一问一答用于和服务器交互什么是HTTPHTTP是个应用层协议&#xff0c;是HTTP客户端和HTTP服务器之间的交互数据格式。所以这里有个实例&#xff1a;在浏览网页的时候&#xff0c;浏览器会向服务器发送一个HTTP请求&#xff0c;告诉服务器我想访问什么..然后服…...