• JAVA反射


    一、反射机制概念

            反射是指在程序运行状态中,对于任意一个类都能够得到这个类所有的属性和方法,并且对于任意一个对象,都能够调用它的任意方法。简单来说:将Java对象的各个部分通过类加载器,封装为成员变量对象、构造方法对象和成员方法对象,并通过反射来动态获取以及调用

    二、反射应用场景

    1、源代码阶段

    1)用法:Class clazz=Class.forName("类的全路径");

    2)作用:多用于配置文件,将类名定义在配置文件中,读取文件内容,加载程序类;

    2、Class类对象阶段

    1)用法:类名.class,通过类名的属性class获取;

    2)作用:多用于参数的传递;

    3、运行时阶段

    1)用法:对象.getClass();getClass()方法在object类中定义着;

    2)作用:多用于对象获取字节码的方式

    注意:同一个字节码文件(*.class)在一次程序运行中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。

    三、Class对象功能

    1、获取成员变量

    public Field getField(String name)                 //获取类中public的成员变量
    public Field[] getFields()                         // 获取类中所有的public的成员变量
    public Field getDeclaredField(String name)         //可以获取类中private的成员变量
    public Field[] getDeclaredFields()                 //获取类中所有成员信息

    2、获取构造方法

    1. package com.dgs.entity;
    2. public class User {
    3. private String username ;
    4. private String password ;
    5. public String age ;
    6. public String sex ;
    7. public User() {
    8. }
    9. public User(String username, String password, String age, String sex) {
    10. this.username = username;
    11. this.password = password;
    12. this.age = age;
    13. this.sex = sex;
    14. }
    15. private User(String username, String password) {
    16. this.username = username;
    17. this.password = password;
    18. }
    19. private User(String username, String password, String age) {
    20. this.username = username;
    21. this.password = password;
    22. this.age = age;
    23. }
    24. public String getUsername() {
    25. return username;
    26. }
    27. public void setUsername(String username) {
    28. this.username = username;
    29. }
    30. public String getPassword() {
    31. return password;
    32. }
    33. public void setPassword(String password) {
    34. this.password = password;
    35. }
    36. public String getAge() {
    37. return age;
    38. }
    39. public void setAge(String age) {
    40. this.age = age;
    41. }
    42. public String getSex() {
    43. return sex;
    44. }
    45. public void setSex(String sex) {
    46. this.sex = sex;
    47. }
    48. }
    1. package com.dgs.main;
    2. import com.dgs.entity.User;
    3. import java.lang.reflect.Constructor;
    4. import java.lang.reflect.Field;
    5. public class TestMain {
    6. public static void main(String[] args) throws Exception {
    7. Class userClass = User.class;
    8. Constructor constructor1 = userClass.getConstructor();
    9. System.out.println(constructor1);
    10. Constructor constructor2 = userClass.getConstructor(String.class, String.class, String.class, String.class);
    11. System.out.println(constructor2);
    12. Constructor[] constructors = userClass.getConstructors();
    13. for (Constructor constructor : constructors) {
    14. System.out.println(constructor);
    15. }
    16. Constructor declaredConstructor1 = userClass.getDeclaredConstructor(String.class, String.class);
    17. System.out.println(declaredConstructor1);
    18. Constructor[] declaredConstructors = userClass.getDeclaredConstructors();
    19. for (Constructor declaredConstructor : declaredConstructors) {
    20. System.out.println(declaredConstructor);
    21. }
    22. }
    23. }

    3、获取成员方法

    1. package com.dgs.main;
    2. import com.dgs.entity.User;
    3. import java.lang.reflect.Method;
    4. public class TestMain {
    5. public static void main(String[] args) throws Exception {
    6. User user = new User();
    7. Class userClass = user.getClass();
    8. Method getSex = userClass.getMethod("getSex");
    9. System.out.println(getSex);
    10. Method[] methods = userClass.getMethods();
    11. for (Method method : methods) {
    12. System.out.println(method);
    13. }
    14. Method setSex = userClass.getDeclaredMethod("setSex",String.class);
    15. System.out.println(setSex);
    16. Method[] declaredMethods = userClass.getDeclaredMethods();
    17. for (Method declaredMethod : declaredMethods) {
    18. System.out.println(declaredMethod);
    19. }
    20. }
    21. }

    4、具体使用

    1. package com.dgs.main;
    2. import com.dgs.entity.User;
    3. import java.lang.reflect.Constructor;
    4. import java.lang.reflect.Field;
    5. import java.lang.reflect.Method;
    6. public class TestMain {
    7. public static void main(String[] args) throws Exception {
    8. User user = new User();
    9. Class userClass = user.getClass();
    10. Constructor constructor = userClass.getConstructor(String.class, String.class, String.class, String.class);
    11. Object userObject = constructor.newInstance("dgs", "1234", "22", "男");
    12. System.out.println(userObject);
    13. Method setSex = userClass.getMethod("setSex", String.class);
    14. setSex.invoke(userObject, "女");
    15. System.out.println(userObject);
    16. Field username = userClass.getDeclaredField("username");
    17. username.setAccessible(true);
    18. username.set(userObject,"dgj");
    19. System.out.println(userObject);
    20. }
    21. }

    Field成员变量

    操作:

            ①设置值 void set(Object obj,Object value)

            ②获取值 get(Object obj)

            ③忽略访问权限修饰符的安全检查setAccessible(true)

    Constructor:构造方法

    创建对象:

            ①T newInstance(Object... initargets)

            ②:如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance

    Method:方法对象

    执行方法:Object invoke(Object obj,Object... args)

  • 相关阅读:
    讲讲springboot的@Async
    Spring的Bean加载流程
    DOS学习-目录与文件应用操作经典案例-type
    jenkins2.346.2安装
    【Mysql系列】(一)MySQL语句执行流程
    MaixII-Dock(v831)学习笔记——PWM
    GPT-4 Turbo 发布 | 大模型训练的新时代:超算互联网的调度与调优
    redis笔记
    软件工程测试与度量课程学习---基本测试过程----线性模型
    1、5伪类选择器
  • 原文地址:https://blog.csdn.net/qq_40728285/article/details/125273327