[Class的应用]获取类的信息

一.一些基本的类

1.0 UP自己画的图

1.1Modifier类解析访问修饰符

1.1.1Modifier可以干什么

java.lang.reflect.Modifier 是 JDK 提供的反射工具类 ,专门用于解析、判断、拼接 Java 类 / 方法 / 字段 / 构造器的访问修饰符(如 public、static、final)和修饰符标识,是反射开发中处理修饰符的核心工具。

1.1.2构造器私有

1.1.3常见的修饰符对应的常量

1.1.4判断是否是某个修饰符 boolean .isXXX()

1.1.5.toString()方法

1.1.6拼接字符串 - 按 | 运算,把对应的位复合起来

1.2 Field类 - 获取类的成员变量

1.2.1 Field可以干什么

一个Field对象就代表类中一个字段(static/实例/public/private等都可以)

通过 Field,你可以在运行时动态做到:

  • 获取字段名、类型、修饰符
  • 获取 / 修改字段的值(即使是 private)
  • 获取字段上的注解
  • 判断字段是静态还是实例变量

1.2.2Field类的方法

1.2.3Field类获取字段类型

coding
复制代码
@Test
public void testGetSingleField() throws NoSuchFieldException {
    Class<User> clazz = User.class;
    Field field = clazz.getDeclaredField("username");
    System.out.println("字段名:" + field.getName());
    System.out.println("字段类型:" + field.getType());
    System.out.println("字段修饰符:" + Modifier.toString(field.getModifiers()));
}

1.2.4Field类获取Modifier类来查看字段修饰符

coding
复制代码
@Test
public void testGetSingleField() throws NoSuchFieldException {
    Class<User> clazz = User.class;
    Field field = clazz.getDeclaredField("username");
    System.out.println("字段名:" + field.getName());
    System.out.println("字段类型:" + field.getType());
    System.out.println("字段修饰符:" + Modifier.toString(field.getModifiers()));
}

1.3Constructor类

1.3.1Constructor类的方法

复制代码
//        c.getConstructor(...) 获取一个公共的构造器
//        c.getDeclaredConstructor(...) 获取一个本类声明的构造器,可以是非公共的
//        c.getConstructors() 获取所有公共的构造器
//        c.getDeclaredConstructors() 获取所有本类声明的构造器

1.3.2获取全部的Constructor构造器

coding
复制代码
@Test
    public void testGetAllPublicConstructors() throws NoSuchMethodException {
//        c.getConstructor(...) 获取一个公共的构造器
//        c.getDeclaredConstructor(...) 获取一个本类声明的构造器,可以是非公共的
//        c.getConstructors() 获取所有公共的构造器
//        c.getDeclaredConstructors() 获取所有本类声明的构造器
        Class clazz = String.class;
        System.out.println("String类共有构造器:");
        for (Constructor c : clazz.getConstructors()) {
            System.out.println(c);
        }
    }

1.3.3利用Constructor构造对象

复制代码
@Test
public void testAssignAttribute()throws Exception{
    Class<?> clazz = Class.forName("bean.Employee");

    //获取无参构造
    Constructor<?> noArgConstructor = clazz.getConstructor();
    Object obj = noArgConstructor.newInstance();
    //System.out.println(obj);
    /*//获取有参构造
    Constructor<?> constructor = clazz.getConstructor(String.class,int.class,double.class);
    //利用有参构造创建对象
    Object obj = constructor.newInstance("Tom",18,5000);*/

    /*//获取属性的类型和名称
    Field[] fields = clazz.getDeclaredFields();

    for (Field field : fields){
        System.out.println(field.getType() + " "+ field.getName());
    }*/
    Field nameField = clazz.getDeclaredField("name");
    nameField.setAccessible(true);//因为姓名是私有属性,所以为了访问,先设置可访问性为true
    nameField.set(obj,"Tom");
    System.out.println(obj);
}

1.4 Method类

1.4.1Method类的方法

1.4.2coding

复制代码
@Test
    public void testShowAllMethod() {
        //获取String类的所有方法
//        c.getMethod(...)  获取一个公共的方法,包括从父类继承的公共的方法
//        c.getDeclaredMethod(...) 获取一个本类声明的方法,可能是非公共的
//        c.getMethods()  获取所有公共的方法,包括从父类继承的公共的方法
//        c.getDeclaredMethods() 获取所有本类声明的方法,可能是非公共的
        Method[] declaredMethods = String.class.getDeclaredMethods();
        System.out.println("String类的所有方法:");
        for (Method method : declaredMethods) {
            System.out.println(method);
        }
    }

1.4.3通过Class+Constuctor+Method操作方法

复制代码
package reflect;

import org.junit.jupiter.api.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class testOperateMethod {
    @Test
    public void testOperateMethod() throws Exception {
        Class<?> rect = Class.forName("bean.Rectangle");
        Constructor<?> constructor = rect.getConstructor();
        Object obj = constructor.newInstance();

        Field lengthField = rect.getDeclaredField("length");
        Field widthField = rect.getDeclaredField("width");
        lengthField.setAccessible(true);
        widthField.setAccessible(true);

        lengthField.set(obj, 10);
        widthField.set(obj, 5);
        System.out.println(obj);
        Method getAreaMethod = rect.getMethod("area");
        System.out.println(getAreaMethod.invoke(obj));

        Method perimeterMethod = rect.getMethod("perimeter");
        System.out.println(perimeterMethod.invoke(obj));
    }
}
相关推荐
咩咩啃树皮8 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
灯澜忆梦9 小时前
GO_并发编程---定时器
开发语言·后端·golang
鱟鲥鳚9 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
-银雾鸢尾-9 小时前
C#中的StringBuilder相关方法
开发语言·c#
-银雾鸢尾-9 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
大模型码小白10 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司11 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地12 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415912 小时前
TCP超时重传机制是为了解决什么问题?
java
段一凡-华北理工大学12 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化