首页 > 编程语言 >java反射技术学习

java反射技术学习

时间:2024-07-09 09:56:21浏览次数:12  
标签:反射 java getName public 学习 Student println studentClass class

反射

反射:加载类,并允许以编程的方式解剖类中的各种成分(成员变量,方法,构造器等)

反射学什么?

学习获取类的信息、操作他们

1.反射第一步:加载类、获取类的字节码:Class对象

 package com.itheima.reflect;
 ​
 public class reflect1 {
     public static void main(String[] args) throws ClassNotFoundException {
         Class studentClass = Student.class;
         System.out.println(studentClass.getName());//全名
         System.out.println(studentClass.getSimpleName());//简名
         Class aClass = Class.forName("com.itheima.reflect.Student");
         System.out.println(aClass == studentClass);
         Student student = new Student();
         Class aClass1 = student.getClass();
         System.out.println(aClass1);
     }
 }

2.获取类的构造器:Constructor对象

image-20240314200645439

 package com.itheima.reflect;
 ​
 import org.junit.Test;
 ​
 import java.lang.reflect.Constructor;
 ​
 public class reflect2 {
     @Test
     public void StudentReflect() throws Exception {
         //1.得到类的Class对象
         Class studentClass = Student.class;
         //2.获取private的,获取类的构造器,无参构造器
         Constructor[] declaredConstructors = studentClass.getDeclaredConstructors();
         for (Constructor declaredConstructor : declaredConstructors) {
             System.out.println(declaredConstructor.getName() + declaredConstructor.getParameterCount());
         }
         //3.获取public的
         Constructor[] constructors = studentClass.getConstructors();
         for (Constructor constructor : constructors) {
             System.out.println(constructor.getName());
         }
     }
     @Test
     public void StudentGetController() throws Exception {
         //1.获取类Class对象
         Class studentClass = Student.class;
         //2.获取public类型的
         Constructor constructor = studentClass.getConstructor(
                 String.class, int.class
         );
         System.out.println(constructor.getName());
         //3.获取private类型的
         Constructor declaredConstructor = studentClass.getDeclaredConstructor(String.class, int.class);
         System.out.println(declaredConstructor.getName());
     }
 }

3.获取类的成员变量:Field对象

image-20240315192401213

 
//第一个方法的设置就是让private对象可以被公开创建
 //禁止检查访问权限
 constructor.setAccessible(true);
 //强转为Student对象
 Student student = (Student)constructor.newInstance();
 //
 declaredConstructor.setAccessible(true);
 Student student1 = (Student)declaredConstructor.newInstance("张三", 20);

获取成员变量的前提就是要有对象

 public class reflect3 {
     @Test
     public void getAttribute() throws Exception {
         //创建对象
         Class studentClass = Student.class;
         //将属性存放在一个数组内
         Field[] declaredFields = studentClass.getDeclaredFields();
         //遍历数组获取属性
         for (Field declaredField : declaredFields) {
             System.out.println(declaredField.getName());
         }
         Class studentClass1 = Student.class;
         Field name = studentClass1.getDeclaredField("name");
         System.out.println(name);
 ​
     }
 }
 Student student = new Student();
 name.setAccessible(true);
 name.set(name,"111");
 String name1 = (String)name.get(student);
 System.out.println(name1);

4.获取类的成员方法:Method对象

 package com.itheima.reflect;
 ​
 import org.junit.Test;
 ​
 import java.lang.reflect.Method;
 ​
 public class reflect4 {
     @Test
     public void getMethod() throws Exception {
         //1.创建对象
         Class studentClass = Student.class;
         //2.获取对象全部方法
         Method[] declaredMethods = studentClass.getDeclaredMethods();
         //3.遍历方法获取对象方法参数:方法名,方法数,方法返回值类型
         for (Method declaredMethod : declaredMethods) {
             System.out.println(declaredMethod.getName()
             +"--->"+declaredMethod.getParameterCount()
                     +"--->"+declaredMethod.getReturnType()
             );
         }
         //4.根据参数获取对象方法
         Method getName = studentClass.getDeclaredMethod("getName");
         System.out.println(getName.getName()
         +"--->"+getName.getParameterCount()
         +"--->"+getName.getReturnType()
         );
         Student student = new Student();
         getName.setAccessible(true);
         Object rs  = getName.invoke(Student);
         System.out.println(rs);
     }
 }
  • 构造对象

  • 使用对象get方法然后获取想要的方法,属性,构造器等

  • 遍历方法获取对象方法,属性,构造器等

  • get…s就是获取所有的东西,没有s就要加参数,获取特定的想要的东西,然后是否加Declared就是表明是否要强制获取private的东西

反射的作用

  • 基本作用:可以得到一个类的全部成分然后操作

  • 可以破坏封装性

  • 最重要的用途:适合做Java框架,基本上,主流的框架都会基于反射设计出一些通用的功能

 public class Test5 {
     @Test
     public void Test5Frame() throws Exception {
         Student student = new Student("李宇航",11,'1',111,"1111");
         Teacher teacher = new Teacher("111", 11111);
         ObjectFrame.saveObject(student);
         ObjectFrame.saveObject(teacher);
     }
 }




 public class ObjectFrame {
     //目标,保存任意信息到文本文件中去
     public static void saveObject(Object obj) throws Exception {
         //创建管道,输出到文件中去
         PrintStream printStream = new PrintStream(new FileOutputStream("D:\\javacangku\\云顶视频练习\\Junit1\\src\\main\\java\\com\\itheima\\reflect1\\a.txt",true));
         //1.Object是任意对象,到底有多少个字段保存
         Class objClass = obj.getClass();
         Field[] fields = objClass.getDeclaredFields();
         //2.从这个类中提取它的全部成员变量
         for(Field field : fields){
             String name = field.getName();
             field.setAccessible(true);
             String value = field.get(obj) + "";
             printStream.println(name + " = "+ value);
         }
         printStream.close();
     }
 }

标签:反射,java,getName,public,学习,Student,println,studentClass,class
From: https://blog.csdn.net/2301_80005856/article/details/140286676

相关文章

  • JavaScript介绍、初识(注释语法、书写位置、书写规范)、常量和变量、数据类型Number、
    【一】JavaScript介绍【1】什么是jsjs也是一门编程语言,他可以写后端代码【2】什么是node.js前端由于非常受制于后端,所以有一些人异想天开想要通过js来编写后端代码一统江湖由此开发了一个叫nodejs的工具(支持js跑在后端服务器上)但是并不能完美的实现【3】JavaScript......
  • Java 修饰符
    Java中的修饰符用于修饰类、方法、变量等元素,它们控制了这些元素的访问性、继承性和其他特性。主要的修饰符包括:1.**访问控制修饰符**:  -**public**:可以被任何其他类访问。  -**protected**:可以被同一包内的类及其子类访问。  -**default(nomodifier)*......
  • Java计算机毕业设计网上求职招聘系统(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的迅猛发展和普及,网络已成为人们获取信息、交流互动的重要平台。在就业市场日益竞争激烈的环境下,传统的求职招聘方式已难以满足求职者......
  • Java计算机毕业设计幼儿园管理系统(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着教育信息化的深入发展,幼儿园作为儿童启蒙教育的重要阶段,其管理模式的现代化与智能化已成为必然趋势。传统的手工记录、纸质管理方式不仅效率低下......
  • Java计算机毕业设计校园共享单车系统的设计与实现(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高校规模的不断扩大和学生人数的增加,校园内的交通问题日益凸显。传统的自行车管理方式不仅效率低下,还存在车辆调度不灵活、租赁流程繁琐、车辆维......
  • 基于Java+SpringBoot+Vue的影城管理系统的设计与开发(源码+lw+部署文档+讲解等)
    文章目录前言项目背景介绍技术栈后端框架SpringBoot前端框架Vue数据库MySQL(MyStructuredQueryLanguage)具体实现截图详细视频演示系统测试系统功能测试系统测试结论代码参考数据库参考源码获取前言......
  • Java高级-线程池
    1.什么是线程池?用于管理线程对象的池子。2.为什么使用线程池?一个线程大约占用内存1M。 1.解决频繁创建线程和销毁线程消耗的性能。 2.解决大量创建线程而导致的内存泄漏问题。3.如何创建线程池?Java中提供了两种方式:第一种:通过工具类完成线程池的创建-:语法简......
  • JAVA基础-----128陷阱
    一、何为128陷阱Java中Integer类型在使用==比较时的特殊行为------128陷阱,解释了当数值在-128到127范围内,由于valueOf方法的缓存机制导致地址相同,比较为真;超出这个范围则新分配内存,地址不同,比较为假。可以预测一下下面程序的输出结果:答案在最后后面!二、造成该现象的原因......
  • 快捷键收录-学习阶段非常适用
    Shift+Ctrl+L   选中语句,可以对其语句进行注释,我已经实验,可以按不同格式注释Alt+鼠标左键  按住鼠标左键,向下移动,出现多个光标就可以多行写重复的语句Ctrl+A            全选语句Ctrl+C        复制Ctrl+V           粘贴Ctrl......
  • javaMap笔记分享
    Map映射(map)是存储键和值间关联(即,键值对)的对象。给定一个键,可以找到其值。键和值都是对象。键必须唯一,但是值可以重复。13.1 支持映射的接口接 口描 述Map将唯一键映射到值NavigableMap扩展SortedMap接口,以处理基于最接近匹配搜索原则的键/值对检索So......