• java反射机制


    目录

    1、什么是反射?

    2、类类

    3、反射实例化

    4、反射动态方法调用

    5、反射读写属性


    1、什么是反射

    Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。

    2、类类

    Class.forName(完整类名)、类名.class、对象.getClass

     编写一个student类

    1. package com.zking.reflect;
    2. public class Student {
    3. private String sid;
    4. private String sname;
    5. public Integer age;
    6. static {
    7. System.out.println("加载进jvm中!");
    8. }
    9. public Student() {
    10. super();
    11. System.out.println("调用无参构造方法创建了一个学生对象");
    12. }
    13. public Student(String sid) {
    14. super();
    15. this.sid = sid;
    16. System.out.println("调用带一个参数的构造方法创建了一个学生对象");
    17. }
    18. public Student(String sid, String sname) {
    19. super();
    20. this.sid = sid;
    21. this.sname = sname;
    22. System.out.println("调用带二个参数的构造方法创建了一个学生对象");
    23. }
    24. @SuppressWarnings("unused")
    25. private Student(Integer age) {
    26. System.out.println("调用Student类私有的构造方法创建一个学生对象");
    27. this.age = age;
    28. }
    29. public String getSid() {
    30. return sid;
    31. }
    32. public void setSid(String sid) {
    33. this.sid = sid;
    34. }
    35. public String getSname() {
    36. return sname;
    37. }
    38. public void setSname(String sname) {
    39. this.sname = sname;
    40. }
    41. public void hello() {
    42. System.out.println("你好!我是" + this.sname);
    43. }
    44. public void hello(String name) {
    45. System.out.println(name + "你好!我是" + this.sname);
    46. }
    47. @SuppressWarnings("unused")
    48. private Integer add(Integer a, Integer b) {
    49. return new Integer(a.intValue() + b.intValue());
    50. }
    51. }

    使用三种类类方法测试 

    1. public class Demo {
    2. public static void main(String[] args) throws Exception {
    3. // 1、Class.forName
    4. Class class1 = Class.forName("com.zking.reflect.Student");
    5. // 2、类.class
    6. Class class2 = Student.class;
    7. // 3、对象.class
    8. Student stu = new Student();
    9. Class class3 = stu.getClass();
    10. System.out.println(class1);
    11. System.out.println(class2);
    12. System.out.println(class3);
    13. }
    14. }

     运行结果如下:

    3、反射实例化

    三种实例化方法:getConstructor、getDeclaredConstructor、newlnstance

    1. // 1、Class.forName
    2. Class class1 = Class.forName("com.zking.reflect.Student");
    3. // 2、类.class
    4. Class class2 = Student.class;
    5. Constructor cs=class1.getConstructor();
    6. Student stu1 = (Student) class1.newInstance();
    7. stu1.setSname("zs");
    8. System.out.println(stu1);

    ​​​​​​强制转换的话要使用泛型

    1. // 1、Class.forName
    2. Class class1 = (Class) Class.forName("com.zking.reflect.Student");
    3. // 2、类.class
    4. Class class2 = Student.class;
    5. //无参数
    6. Constructor cs=class1.getConstructor();
    7. Student stu1 = cs.newInstance();
    8. stu1.setSname("zs");
    9. System.out.println(stu1);
    10. //有一个参数
    11. Constructor cs1 = class1.getConstructor(String.class);
    12. Student stu2 = cs1.newInstance("0001");
    13. stu2.setSname("ww");
    14. System.out.println(stu2);
    15. //有两个参数
    16. Constructor cs2 = class1.getConstructor(String.class,String.class);
    17. Student stu3 = cs2.newInstance("0001","ls");
    18. System.out.println(stu3);
    19. Constructor cs3=class1.getDeclaredConstructor(Integer.class);
    20. cs3.setAccessible(true);//暴力反射 既可以获取私有方法也可以获取公有方法
    21. Student stu4 = cs3.newInstance(23);
    22. System.out.println(stu4);

    结果如下:

    4、反射动态方法调用

    getMethod、getDeclaredMethod

    1. Method method1 = class1.getMethod("hello");
    2. stu4.setSname("zs");
    3. method1.invoke(stu4);//invoke 调用Method类的方法,可以实现动态调用
    4. System.out.println("-------------");
    5. Method method2 = class1.getMethod("hello", String.class);
    6. method2.invoke(stu4, "ww");
    7. System.out.println("-------------");
    8. Method method3 = class1.getDeclaredMethod("add", Integer.class, Integer.class);
    9. method3.setAccessible(true);//会出现不合法访问异常,这时候用暴力反射
    10. int a = (int) method3.invoke(stu4, 1, 2);
    11. System.out.println("add 1,2=" + a);

    效果如下:

     

    5、反射读写属性

    getDeclaredField、getDeclaredFields

    1. Field field1 = class1.getField("age");//通过字符串获取属性
    2. field1.set(stu4, 70);
    3. System.out.println(stu4);
    4. Field field2 = class1.getDeclaredField("sname");
    5. field2.setAccessible(true);
    6. field2.set(stu4, "lhl");
    7. System.out.println(stu4);

    效果如下:

     

    1. Field[] field3 = class1.getDeclaredFields();
    2. // 通过循环数值完成动态赋值
    3. for (Field field : field3) {
    4. field.setAccessible(true);
    5. System.out.println(field.get(class1.newInstance()));
    6. }

  • 相关阅读:
    9月17日计算机视觉基础学习笔记——认识机器学习
    unity脚本_Input鼠标键盘 c#
    开源物联网系统 ThingsBoard 上手
    Postgresql源码(90)共享内存申请CreateSharedMemoryAndSemaphores
    都要2023年了,造机器人还能搞出什么新花活?
    使用C#监控选定文件夹中文件的变动情况
    show processlist 详解
    stable diffusion实践操作-黑白稿线稿上色
    SQL函数的格式、顺序、流程
    给新手教师的成长建议
  • 原文地址:https://blog.csdn.net/qq_64001795/article/details/125822080