首页 > 其他分享 >反射(快速入门)

反射(快速入门)

时间:2024-08-30 18:54:59浏览次数:5  
标签:反射 入门 System Constructor println 快速 class userClass out

目录

1、什么是反射?

2、反射的作用

3、Class对象的获取

4、Constructor对象的获取

5、Method对象获取

6、Fieldfi对象的获取Java把类中的属性抽象成了一个Field对象


1、什么是反射?

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

2、反射的作用

1)在运行时判断任意一个对象所属的类 2)在运行时构造任意一个类的对象 3)在运行时判断任意一个类所具有的成员变量和方法 4)在运行时调用任意一个对象的方法

3、Class对象的获取

三种方式

类.class
对象.getClass()
Class.forName()
package com.yhf.a_class;

import com.yhf.entity.User;

/**
 * @Author yhf
 * @Date 2024/8/29
 * @Desc 200不是二百
 */
public class Demo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        //1、类.class
        Class<User> userClass = User.class;
        //2、对象.getClass
        Class<? extends User> aClass = new User().getClass();
        //3、Class.forName("");
        Class<?> aClass1 = Class.forName("com.yhf.entity.User");
    }
}

4、Constructor对象的获取

Java中把构造方法 抽象成了一个类对象叫Constructor

构造方法在类(Class对象)中,通过CLass对象来获取的!!!

1)Constructor<?>[] constructors = userClass.getConstructors();

2)Constructor<?>[] declaredConstructors = userClass.getDeclaredConstructors();

3)Constructor<User> constructor = userClass.getConstructor(null);

4)Constructor<User> constructor1 = userClass.getConstructor(String.class);

5)Constructor<User> constructor2 = userClass.getDeclaredConstructor(int.class);

import com.qf.entity.*;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * @Author yhf
 * @Date 2024/8/29
 * @Desc 200不是二百
 */
public class Demo1 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //1.获取CLass对象
        Class<User> userClass = User.class;
        //2.通过Class对象获取构造方法(Constructor)对象
        //getConstructors(): 获取非私有化的构造方法
        Constructor<?>[] constructors = userClass.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }
        System.out.println("=======");
        //getDeclaredConstructors()  获取全部的构造方法对象
        Constructor<?>[] declaredConstructors = userClass.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }
        System.out.println("======");
        //获取当个构造方法对象
        //...   可以多个参数,用逗号隔开的!!
        //parameterTypes  构造方法的参数的类型
        //getConstructor(Class<?>... parameterTypes)
        Constructor<User> constructor = userClass.getConstructor(null);
        System.out.println(constructor);//获取无参的构造方法,因为 参数 null类型的
        System.out.println("*******");
        /**
         * public User (String name) {
         *         this.name = name;
         *     }
         */
        Constructor<User> constructor1 = userClass.getConstructor(String.class);
        System.out.println(constructor1);
        Constructor<User> constructor2 = userClass.getDeclaredConstructor(int.class);
        System.out.println(constructor2);


        //构造方法有啥用?一般借助于构造方法创建对象
        //newInstance(Object ... initargs)
        //initarg 构造方法中的参数进行赋值

        User user = constructor.newInstance();
        System.out.println(user);
        User user1= constructor1.newInstance("狗蛋");
        System.out.println(user1);


        constructor2.setAccessible(true);//暴力反射
        User user2 = constructor2.newInstance(12);
        System.out.println(user2);
    }
}

5、Method对象获取

Method对象 是把类中方法抽象成了Method对象

import com.qf.entity.User;
​
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
​
/**
 * @Author yhf
 * @Date 2024/8/29
 * @Desc 200不是二百
 */
public class Demo1 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Class<User> userClass = User.class;
        //getMethods()  获取本类的非私有的方法和父类(Object)的方法
        Method[] methods = userClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("============");
        //getDeclaredMethods()  获取全部的方法,但是获取不了父类的方法
        Method[] declaredMethods = userClass.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }
        System.out.println("----------------");
        //获取单个方法
        //getDeclaredMethod(String name, Class<?>... parameterTypes)
        //Params:
        //name – the name of the method
        //parameterTypes – the parameter array
        Method eat = userClass.getMethod("eat", null);//获取的是无参的eat方法
        System.out.println(eat);
        Method eat1 = userClass.getMethod("eat", String.class);//获取的是eat方法 带有一个参数 这个参数类型是String
        System.out.println(eat1);
        //获取私有的方法
        Method sleep = userClass.getDeclaredMethod("sleep", null);
        System.out.println(sleep);
        //拿到方法对象干嘛?【重要】
        //invoke(Object obj, Object... args)
        //Params:
        //obj – 是类对象   这个方法所在的对象
        // args – 是方法的实参
        User user = userClass.getConstructor(null).newInstance(null);
        eat.invoke(user, null);
        eat1.invoke(user, "xixi");
        sleep.setAccessible(true);
        sleep.invoke(user, null);
        
​
​
    }
}
​

6、Fieldfi对象的获取Java把类中的属性抽象成了一个Field对象

​import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
​
/**
 * @Author yhf
 * @Date 2024/8/29
 * @Desc 200不是二百
 */
public class Demo1 {
    public static void main(String[] args) throws NoSuchFieldException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException {
       /* Class<User> userClass = User.class;
        Field[] fields = userClass.getFields();
        for (Field field : fields) {
            System.out.println(field);  打印了age
        }*/
​
        Class<Person> personClass = Person.class;
        //表示公共字段的 Field对象的数组
        Field[] fields = personClass.getFields();
        for (Field field : fields) {
            System.out.println(field);//
        }
        System.out.println("====");
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        //获取单个属性
        Field name = personClass.getDeclaredField("name");
        System.out.println(name);
        Field age = personClass.getField("age");
        Field sex = personClass.getDeclaredField("sex");
        //获取到属性以后干嘛?   属性可以赋值的
        Person person = personClass.getConstructor(null).newInstance(null);
        age.set(person, 18);
        System.out.println(person);
        sex.setAccessible(true);
        sex.set(person, '男');
        System.out.println(person);
​
    }
}

标签:反射,入门,System,Constructor,println,快速,class,userClass,out
From: https://blog.csdn.net/hang_sa_mu/article/details/141686352

相关文章

  • JS逆向入门案例-xx志愿服务网encData-05
    文章目录概要整体架构流程技术细节小结概要提示:仅供学习,不得用做商业交易,如有侵权请及时联系!逆向:xx志愿服务网URL:aHR0cDovL2NoaW5hdm9sdW50ZWVyLm1jYS5nb3YuY24vc2l0ZS9wcm9qZWN0目标:表单数据中的encData参数整体架构流程提示:分析-调试-猜想-实现-执......
  • NestJs 快速入门
    npmi-g@nestjs/cli,nestnewcar-report快速创建car-report 项目。src目录下面有main,controller,service,module文件。main.ts是项目的入口,它引入AppModule,创建服务,监听3000端口。AppModule是一个注解@Module()的类,也称为app模块。由于项目启动时引入AppModule,它也称为根模......
  • Yolov5入门介绍(官网文档学习笔记)
    一、yolov5是什么yolov5是yolo的第五次迭代,旨在提供高速、高精度的目标检测模型官方文档:ComprehensiveGuidetoUltralyticsYOLOv5-UltralyticsYOLODocs二、yolov5的优点1、高速、高精度 (例如R-CNN目标检测有两部:先生成候选框再分类)2、基于pytorch搭建,使用于各......
  • C++ 快速输入的优化与缓冲区管理(竞赛必用)
    在编程竞赛和性能敏感的场景中,数据输入的效率往往直接影响到程序的运行速度。为了优化输入操作,我们可以通过手动设定缓冲区的方式来提升输入的速度。本文将详细介绍两种不同的快速输入方案:手动设定缓冲区大小的方案与系统默认缓冲区大小的方案,并结合二进制位数与可表示数据范围......
  • 【CSP】坐标变换2(问题拆解,快速输入,知识补充)
    1.题目背景与任务分析题目背景本题要求对二维平面上的点进行指定角度的旋转,并输出旋转后的坐标,要求精确到小数点后六位。这类题目广泛用于考察选手对数学计算、坐标变换以及编程语言中浮点数处理的能力。任务明确输入:多个坐标点及旋转角度。输出:旋转后的新坐标,精确到小数......
  • 动态规划 之《从入门到入土》
    bushi动态规划的几个模板and例题背包问题01背包顾名思义,一个东西只有选和不选两种选择。求体积一定的包里能放的最大质量。 for(inti=1;i<=n;i++) { for(intj=m;j>=w[i];j--)//w[i]表示物品i的体积 { f[j]=max(f[j],f[j-w[i]]+v[i]);//v[i]表示物品i的质......
  • 快速搭建一款可交互式的「地理空间」应用
    GreppoGitHub上的开源Python框架,可快速搭建一款可交互式的「地理空间」应用。该框架提供了一整套完整工具包,让你可以轻松打通数据、算法、可视化UI等模块,构建一款交互式应用。https://github.com/greppo-io/greppo ......
  • Pinia入门(快速上手)
    定义一个Store 在深入了解核心概念之前,我们需要知道Store是使用 defineStore() 定义的,并且它需要一个唯一名称,作为第一个参数传递:import{defineStore}from'pinia'//useStore可以是useUser、useCart之类的任何东西//第一个参数是应用程序中store的唯一i......
  • HTTP协议入门
    HTTP协议入门参考:http://www.ruanyifeng.com/blog/2016/08/http.html      一、HTTP/0.9HTTP是基于TCP/IP协议的应用层协议。它不涉及数据包传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。最早版本是1991年发布的0.9版。该版本及其简单,只有一个命......
  • Python编程实战营:四款实用小项目助你快速入门,从零开始打造你的个人项目集!
    踏入编程世界的门槛,总是伴随着既兴奋又忐忑的心情。作为Python的新手,你是否渴望通过实际项目来巩固知识、提升技能?本篇文章将引领你踏上一段从理论到实践的精彩旅程,通过四个精心设计的项目,让你在趣味与挑战中快速成长。项目一:简易文本编辑器首先,我们将从基础出发,动手打造一......