首页 > 编程语言 >Java反射语法

Java反射语法

时间:2024-09-12 10:26:35浏览次数:14  
标签:反射 Java 对象 class clazz 语法 public Student Class

1.反射

1.1反射的概述【理解】

  • 反射机制

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

1.2获取Class类对象的三种方式【应用】

  • 三种方式分类

    • 类名.class属性

    • 对象名.getClass()方法

    • Class.forName(全类名)方法

  • 示例代码

    public class Student {
        private String name;
        private int age;
    ​
        public Student() {
        }
    ​
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    ​
        public String getName() {
            return name;
        }
    ​
        public void setName(String name) {
            this.name = name;
        }
    ​
        public int getAge() {
            return age;
        }
    ​
        public void setAge(int age) {
            this.age = age;
        }
    ​
        public void study(){
            System.out.println("学生在学习");
        }
    ​
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    public class ReflectDemo1 {
        public static void main(String[] args) throws ClassNotFoundException {
            //1.Class类中的静态方法forName("全类名")
                //全类名:包名 + 类名
            Class clazz = Class.forName("com.wedu.myreflect2.Student");
            System.out.println(clazz);
    ​
            //2.通过class属性来获取
            Class clazz2 = Student.class;
            System.out.println(clazz2);
    ​
            //3.利用对象的getClass方法来获取class对象
            //getClass方法是定义在Object类中.
            Student s = new Student();
            Class clazz3 = s.getClass();
            System.out.println(clazz3);
    ​
            System.out.println(clazz == clazz2);
            System.out.println(clazz2 == clazz3);
        }
    }

1.3反射获取构造方法并使用【应用】

1.3.1Class类获取构造方法对象的方法
  • 方法介绍

    方法名说明
    Constructor<?>[] getConstructors()返回所有公共构造方法对象的数组
    Constructor<?>[] getDeclaredConstructors()返回所有构造方法对象的数组
    Constructor<T> getConstructor(Class<?>... parameterTypes)返回单个公共构造方法对象
    Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)返回单个构造方法对象
  • 示例代码

    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...有参构造方法");
        }
    }
    public class ReflectDemo1 {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
            //method1();
            //method2();
            //method3();
            //method4();
        }
    ​
        private static void method4() throws ClassNotFoundException, NoSuchMethodException {
            //        Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes):
    //                                      返回单个构造方法对象
            //1.获取Class对象
            Class clazz = Class.forName("com.wedu.myreflect3.Student");
            Constructor constructor = clazz.getDeclaredConstructor(String.class);
            System.out.println(constructor);
        }
    ​
        private static void method3() throws ClassNotFoundException, NoSuchMethodException {
            //        Constructor<T> getConstructor(Class<?>... parameterTypes):
    //                                      返回单个公共构造方法对象
            //1.获取Class对象
            Class clazz = Class.forName("com.wedu.myreflect3.Student");
            //小括号中,一定要跟构造方法的形参保持一致.
            Constructor constructor1 = clazz.getConstructor();
            System.out.println(constructor1);
    ​
            Constructor constructor2 = clazz.getConstructor(String.class, int.class);
            System.out.println(constructor2);
    ​
            //因为Student类中,没有只有一个int的构造,所以这里会报错.
            Constructor constructor3 = clazz.getConstructor(int.class);
            System.out.println(constructor3);
        }
    ​
        private static void method2() throws ClassNotFoundException {
            //        Constructor<?>[] getDeclaredConstructors():
    //                                      返回所有构造方法对象的数组
            //1.获取Class对象
            Class clazz = Class.forName("com.wedu.myreflect3.Student");
    ​
            Constructor[] constructors = clazz.getDeclaredConstructors();
            for (Constructor constructor : constructors) {
                System.out.println(constructor);
            }
        }
    ​
        private static void method1() throws ClassNotFoundException {
            //        Constructor<?>[] getConstructors():
    //                                      返回所有公共构造方法对象的数组
            //1.获取Class对象
            Class clazz = Class.forName("com.wedu.myreflect3.Student");
            Constructor[] constructors = clazz.getConstructors();
            for (Constructor constructor : constructors) {
                System.out.println(constructor);
            }
        }
    }

1.3.2Constructor类用于创建对象的方法
  • 方法介绍

    方法名说明
    T newInstance(Object...initargs)根据指定的构造方法创建对象
    setAccessible(boolean flag)设置为true,表示取消访问检查
  • 示例代码

    // Student类同上一个示例,这里就不在重复提供了
    public class ReflectDemo2 {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
            //T newInstance(Object... initargs):根据指定的构造方法创建对象
            //method1();
            //method2();
            //method3();
            //method4();
    ​
        }
    ​
        private static void method4() throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
            //获取一个私有的构造方法并创建对象
            //1.获取class对象
            Class clazz = Class.forName("com.wedu.myreflect3.Student");
    ​
            //2.获取一个私有化的构造方法.
            Constructor constructor = clazz.getDeclaredConstructor(String.class);
    ​
            //被private修饰的成员,不能直接使用的
            //如果用反射强行获取并使用,需要临时取消访问检查
            constructor.setAccessible(true);
    ​
            //3.直接创建对象
            Student student = (Student) constructor.newInstance("zhangsan");
    ​
            System.out.println(student);
        }
    ​
        private static void method3() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
            //简写格式
            //1.获取class对象
            Class clazz = Class.forName("com.wedu.myreflect3.Student");
    ​
            //2.在Class类中,有一个newInstance方法,可以利用空参直接创建一个对象
            Student student = (Student) clazz.newInstance();//这个方法现在已经过时了,了解一下
    ​
            System.out.println(student);
        }
    ​
        private static void method2() throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
            //1.获取class对象
            Class clazz = Class.forName("com.wedu.myreflect3.Student");
    ​
            //2.获取构造方法对象
            Constructor constructor = clazz.getConstructor();
    ​
            //3.利用空参来创建Student的对象
            Student student = (Student) constructor.newInstance();
    ​
            System.out.println(student);
        }
    ​
        private static void method1() throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
            //1.获取class对象
            Class clazz = Class.forName("com.wedu.myreflect3.Student");
    ​
            //2.获取构造方法对象
            Constructor constructor = clazz.getConstructor(String.class, int.class);
    ​
            //3.利用newInstance创建Student的对象
            Student student = (Student) constructor.newInstance("zhangsan", 23);
    ​
            System.out.println(student);
        }
    }

1.3.3小结
  • 获取class对象

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

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

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

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

    newInstance(Object... initargs)

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

    setAccessible(boolean) 暴力反射

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

1.4.1Class类获取成员变量对象的方法
  • 方法分类

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

    public class Student {
    ​
        public String name;
    ​
        public int age;
    ​
        public String gender;
    ​
        private int money = 300;
    ​
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", gender='" + gender + '\'' +
                    ", money=" + money +
                    '}';
        }
    }
    public class ReflectDemo1 {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
           // method1();
            //method2();
            //method3();
            //method4();
    ​
        }
    ​
        private static void method4() throws ClassNotFoundException, NoSuchFieldException {
            //        Field getDeclaredField(String name):返回单个成员变量对象
            //1.获取class对象
            Class clazz = Class.forName("com.wedu.myreflect4.Student");
      
            //2.获取money成员变量
            Field field = clazz.getDeclaredField("money");
      
            //3.打印一下
            System.out.println(field);
        }
      
        private static void method3() throws ClassNotFoundException, NoSuchFieldException {
            //        Field getField(String name):返回单个公共成员变量对象
            //想要获取的成员变量必须是真实存在的
            //且必须是public修饰的.
            //1.获取class对象
            Class clazz = Class.forName("com.wedu.myreflect4.Student");
      
            //2.获取name这个成员变量
            //Field field = clazz.getField("name");
            //Field field = clazz.getField("name1");
            Field field = clazz.getField("money");
      
            //3.打印一下
            System.out.println(field);
        }
      
        private static void method2() throws ClassNotFoundException {
            //        Field[] getDeclaredFields():返回所有成员变量对象的数组
            //1.获取class对象
            Class clazz = Class.forName("com.wedu.myreflect4.Student");
      
            //2.获取所有的Field对象
            Field[] fields = clazz.getDeclaredFields();
      
            //3.遍历
            for (Field field : fields) {
                System.out.println(field);
            }
        }
      
        private static void method1() throws ClassNotFoundException {
            //        Field[] getFields():返回所有公共成员变量对象的数组
      
            //1.获取class对象
            Class clazz = Class.forName("com.wedu.myreflect4.Student");
      
            //2.获取Field对象.
            Field[] fields = clazz.getFields();
      
            //3.遍历
            for (Field field : fields) {
                System.out.println(field);
            }
        }
    }

1.4.2Field类用于给成员变量赋值的方法
  • 方法介绍

    方法名说明
    void set(Object obj, Object value)赋值
    Object get(Object obj)获取值
  • 示例代码

    // Student类同上一个示例,这里就不在重复提供了
    public class ReflectDemo2 {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {
    //        Object get(Object obj) 返回由该 Field表示的字段在指定对象上的值。
            //method1();
            //method2();
    ​
        }
    ​
        private static void method2() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {
            //1.获取class对象
            Class clazz = Class.forName("com.wedu.myreflect4.Student");
    ​
            //2.获取成员变量Field的对象
            Field field = clazz.getDeclaredField("money");
    ​
            //3.取消一下访问检查
            field.setAccessible(true);
    ​
            //4.调用get方法来获取值
            //4.1创建一个对象
            Student student = (Student) clazz.newInstance();
            //4.2获取指定对象的money的值
            Object o = field.get(student);
    ​
            //5.打印一下
            System.out.println(o);
        }
    ​
        private static void method1() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {
            //        void set(Object obj, Object value):给obj对象的成员变量赋值为value
            //1.获取class对象
            Class clazz = Class.forName("com.wedu.myreflect4.Student");
    ​
            //2.获取name这个Field对象
            Field field = clazz.getField("name");
    ​
            //3.利用set方法进行赋值.
            //3.1先创建一个Student对象
            Student student = (Student) clazz.newInstance();
            //3.2有了对象才可以给指定对象进行赋值
            field.set(student,"zhangsan");
    ​
            System.out.println(student);
        }
    }

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

1.5.1Class类获取成员方法对象的方法
  • 方法分类

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

    public class Student {
    ​
        //私有的,无参无返回值
        private void show() {
            System.out.println("私有的show方法,无参无返回值");
        }
    ​
        //公共的,无参无返回值
        public void function1() {
            System.out.println("function1方法,无参无返回值");
        }
    ​
        //公共的,有参无返回值
        public void function2(String name) {
            System.out.println("function2方法,有参无返回值,参数为" + name);
        }
    ​
        //公共的,无参有返回值
        public String function3() {
            System.out.println("function3方法,无参有返回值");
            return "aaa";
        }
    ​
        //公共的,有参有返回值
        public String function4(String name) {
            System.out.println("function4方法,有参有返回值,参数为" + name);
            return "aaa";
        }
    }
    public class ReflectDemo1 {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
            //method1();
            //method2();
            //method3();
            //method4();
            //method5();
        }
    ​
        private static void method5() throws ClassNotFoundException, NoSuchMethodException {
            //        Method getDeclaredMethod(String name, Class<?>... parameterTypes):
    //                                返回单个成员方法对象
            //1.获取class对象
            Class clazz = Class.forName("com.wedu.myreflect5.Student");
            //2.获取一个成员方法show
            Method method = clazz.getDeclaredMethod("show");
            //3.打印一下
            System.out.println(method);
        }
      
        private static void method4() throws ClassNotFoundException, NoSuchMethodException {
            //1.获取class对象
            Class clazz = Class.forName("com.wedu.myreflect5.Student");
            //2.获取一个有形参的方法function2
            Method method = clazz.getMethod("function2", String.class);
            //3.打印一下
            System.out.println(method);
        }
      
        private static void method3() throws ClassNotFoundException, NoSuchMethodException {
            //        Method getMethod(String name, Class<?>... parameterTypes) :
    //                                返回单个公共成员方法对象
            //1.获取class对象
            Class clazz = Class.forName("com.wedu.myreflect5.Student");
            //2.获取成员方法function1
            Method method1 = clazz.getMethod("function1");
            //3.打印一下
            System.out.println(method1);
        }
      
        private static void method2() throws ClassNotFoundException {
            //        Method[] getDeclaredMethods():
    //                                返回所有成员方法对象的数组,不包括继承的
            //1.获取class对象
            Class clazz = Class.forName("com.wedu.myreflect5.Student");
      
            //2.获取Method对象
            Method[] methods = clazz.getDeclaredMethods();
            //3.遍历一下数组
            for (Method method : methods) {
                System.out.println(method);
            }
        }
      
        private static void method1() throws ClassNotFoundException {
            //        Method[] getMethods():返回所有公共成员方法对象的数组,包括继承的
            //1.获取class对象
            Class clazz = Class.forName("com.wedu.myreflect5.Student");
            //2.获取成员方法对象
            Method[] methods = clazz.getMethods();
            //3.遍历
            for (Method method : methods) {
                System.out.println(method);
            }
        }
    }

1.5.2Method类用于执行方法的方法
  • 方法介绍

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

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

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

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

  • 示例代码

  • public class ReflectDemo2 {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
    //        Object invoke(Object obj, Object... args):运行方法
    //        参数一:用obj对象调用该方法
    //        参数二:调用方法的传递的参数(如果没有就不写)
    //        返回值:方法的返回值(如果没有就不写)
    
            //1.获取class对象
            Class clazz = Class.forName("com.wedu.myreflect5.Student");
            //2.获取里面的Method对象  function4
            Method method = clazz.getMethod("function4", String.class);
            //3.运行function4方法就可以了
            //3.1创建一个Student对象,当做方法的调用者
            Student student = (Student) clazz.newInstance();
            //3.2运行方法
            Object result = method.invoke(student, "zhangsan");
            //4.打印一下返回值
            System.out.println(result);
        }
    }

标签:反射,Java,对象,class,clazz,语法,public,Student,Class
From: https://blog.csdn.net/2302_76758195/article/details/142148200

相关文章

  • Java技术深度探索:高并发场景下的线程安全与性能优化
    Java技术深度探索:高并发场景下的线程安全与性能优化在当今的软件开发领域,随着互联网应用的日益复杂和用户量的激增,高并发成为了一个不可忽视的技术挑战。Java,作为一门广泛应用于企业级开发的编程语言,其内置的并发支持机制如线程(Thread)、锁(Lock)、并发集合(ConcurrentCollect......
  • 在线考试|基于java的模拟考试系统小程序(源码+数据库+文档)
    在线考试|模拟考试系统|模拟考试系统小程序目录基于java的模拟考试系统小程序一、前言二、系统设计三、系统功能设计四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者计划专......
  • Java程序部署
    在Java应用程序中,通常我们编写的代码(Java源代码)会被编译成字节码(即.class文件),这些字节码文件是Java虚拟机(JVM)可以执行的二进制格式。然而,当谈到“最后启动的时候是二进制文件+配置文件”时,这通常指的是Java应用程序的部署和运行方式,其中不仅包含了编译后的二进制文件(即.class文件或......
  • 计算机毕业设计必看必学!! 89352 基于python的网上挂号预约系统,原创定制程序, java、P
    摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,医院当然也不例外。网上挂号预约系统是以实际运用为开发背景,运用软件工程原理和开发方法,采用Python技术构建的一个管理系统。整个开发过程首先对软件系统进......
  • javascript 计算今天离目标日期还有多少天
    /***计算从今天起到指定日期还有多少天。*@param{string}fixedDate-目标日期字符串,格式应为"YYYY-MM-DD"。*@returns{number}-从今天起到目标日期的天数。*@example*daysUntil("2024-12-25");//假设今天是2024-09-11,将返回104*/exportfunction......
  • Java毕业设计之新能源汽车销售管理系统
    项目技术架构:该SSM+Vue的校园二手交易系统,后端采用SSM架构,前端采用Vue+ElementUI实现页面的快速开发,并使用关系型数据库MySQL存储系统运行数据。本系统分为两种角色,分别是系统管理员,前台用户。核心主要功能:系统主要功能包括前台首页、网站公告、全部商品、商品搜索、分类展......
  • java学习9.11
    IDEA里导入mybatis,lombok等依赖成功连接好数据库。并将MYSQL数据库同时用navicat连接便利创建表等操作。设计实体类student并在数据库设计好表接下来就是如何实现在数据库里的增删改查设计接口类mapper,将操作简化最后能正常运行实现功能。总的来说这一块内容,刚开始学,肯定......
  • 计算机毕业设计 智能推荐旅游平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解
    ......
  • 关于我学习java的小结03
    这节课我主要学习了关于重载、this关键字、构造器、static、final、封装、单例模式这几个知识点,其中单例模式在javaSe中用不到。1、重载定义:在同一个类中,方法的名字一样,参数列表不一样(包括参数类型)的两个方法是重载关系,跟返回值没有关系。目的:为了节约方法的功能命名和提高......
  • JAVA圣经第九天
    1.字节输入流【FileInputStream】,字节输出流【FileOutputStream】--适合做文件的复制2.字符输入流【FileReader】,字符输出流【FileWriter】--适合做文件文本的内容的操作3.字节缓冲输入流【BufferedInputStream】,字节缓冲输出流【BufferedOutputStream】字符缓冲输入流【Buf......