当前位置: 首页 > news >正文

java.lang.Class应用

记录:478

场景:使用java.lang.Class,获取指定类的Class对象、获取类的构造函数、获取类的方法、获取类的属性、获取类的注解以及类的其它信息。在Java反射机制中发挥重要作用。

版本:JDK 1.8,Spring Boot 2.6.3。

1.基础

1.1Class类

在JDK的java.lang.Class中对Class的官方说明如下:

Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions. The primitive Java types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects.

Class has no public constructor. Instead Class objects are constructed automatically by the Java Virtual Machine as classes are loaded and by calls to the defineClass method in the class loader.

1.2Java 反射机制

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

2.创建Class对象(三种方式)

// HashMap类全限定名称
String clzName = "java.util.HashMap";
Class<?> clazz01 = Class.forName(clzName);
Class<?> clazz02 = Class.forName(clzName, true, HashMap.class.getClassLoader());
Class<?> clazz03 = java.util.HashMap.class;
System.out.println("Class对象clazz01: " + clazz01.getName());
System.out.println("Class对象clazz02: " + clazz02.getName());
System.out.println("Class对象clazz03: " + clazz03.getName());

3.创建实例对象

HashMap<String, String> hashMap = (HashMap<String, String>) clazz01.newInstance();
System.out.println("判断一个对象是否是实例: " + clazz01.isInstance(hashMap));

4.获取类的构造函数

//1获取类的全部构造方法
Constructor<?>[] constructor01 = ThreadPoolExecutor.class.getConstructors();
//2获取类的指定构造方法(根据构造方法入参类型)
Constructor<?> constructor02 = ThreadPoolExecutor.class.getConstructor(int.class, int.class, long.class, TimeUnit.class, BlockingQueue.class);
StringBuilder sb01 = new StringBuilder();
Arrays.asList(constructor01).forEach(item -> {sb01.append(item.getName() + ",");
});
System.out.println("获取类的全部构造方法列表: " + sb01.toString());
System.out.println("获取类的指定构造方法: " + constructor02.getName());

5.获取类的方法

//1获取类的全部方法列表
Method[] method01 = ThreadPoolExecutor.class.getMethods();
//2获取类的指定方法,无入参数
Method method02 = ThreadPoolExecutor.class.getMethod("isTerminated", null);
//3获取类的指定方法,有入参数
Method method03 = ThreadPoolExecutor.class.getMethod("execute", Runnable.class);
StringBuilder sb02 = new StringBuilder();
Arrays.asList(method01).forEach(item -> {sb02.append(item.getName() + ",");
});
System.out.println("获取类的全部方法列表: " + sb02.toString());
System.out.println("获取类的指定名称方法: " + method02.getName());
System.out.println("获取类的指定名称方法: " + method03.getName());

6.获取类的属性

//1获取类的全部属性列表
Field[] field01 = CityVO.class.getFields();
//2获取类的指定属性
Field field02 = CityVO.class.getField("cityNo");
StringBuilder sb03 = new StringBuilder();
Arrays.asList(field01).forEach(item -> {sb03.append(item.getName() + ",");
});
System.out.println("获取类的全部属性列表: " + sb03.toString());
System.out.println("获取类的指定名称属性: " + field02.getName());

7.获取类的注解

//1获取类全部注解列表
Annotation[] ano01 = WorkImpl.class.getAnnotations();
//2获取类的指定注解
CityAno ano02 = WorkImpl.class.getAnnotation(CityAno.class);
StringBuilder sb04 = new StringBuilder();
Arrays.asList(ano01).forEach(item -> {sb04.append(item.annotationType() + ",");
});
System.out.println("获取类全部注解: " + sb04.toString());
System.out.println("获取类注解属性,code=" + ano02.code() + ",value=" + ano02.value());
System.out.println("CityAno是否是注解: " + CityAno.class.isAnnotation());

8.类的其它信息

Class<?> clz02 = Class.forName("java.util.HashMap");
//1获取类的ClassLoader
ClassLoader clzLoader = clz02.getClassLoader();
//2判断类是否是可分配对象
boolean b01 = clz02.isAssignableFrom(HashMap.class);
//3判断类是否是接口
boolean b02 = clz02.isInterface();
//4判断类是否是数组
boolean b03 = clz02.isArray();
//5判断类是否是基本类型
boolean b04 = long.class.isPrimitive();
//6判断类是否是注解
boolean b05 = long.class.isAnnotation();
//7判断类是否是局部类
boolean  b06 = AbstractMap.SimpleEntry.class.isLocalClass();
//8判断类是否是成员类
boolean  b07 = AbstractMap.SimpleEntry.class.isMemberClass();
//9获取参数类型
TypeVariable<? extends Class<?>>[] tv01 = clz02.getTypeParameters();
//10获取继承的类和继承类的类型
Class clz = clz02.getSuperclass();
Type ty = clz02.getGenericSuperclass();
//11获取包信息
Package pkg = clz02.getPackage();
//12获取实现的接口和实现的接口类型
Class<?>[] ifs = clz02.getInterfaces();
Type[] ifsType = clz02.getGenericInterfaces();
//13类名称
String name01 = clz02.getSimpleName();
String name02 = clz02.getTypeName();
String name03 = clz02.getCanonicalName();
//14判断是否是枚举类型
boolean enum01 = clz02.isEnum();
Object[] enum02 = JDBCType.class.getEnumConstants();
//15获取内部类
Class<?>[] cls03 = clz02.getClasses();
//16获取Modifier
int mod = clz02.getModifiers();

9.辅助类

9.1CityVO

public class CityVO {public String cityNo;public String cityName;public String population;
}

9.2CityAno

@Retention(RetentionPolicy.RUNTIME)
public @interface CityAno {//城市编码String code();//城市名称String value() default "";
}

9.3DistrictAno

@Retention(RetentionPolicy.RUNTIME)
public @interface DistrictAno {//区编码String code();//区名称String value() default "";
}

9.4Work

public interface Work {String getData();
}

9.5WorkImpl

@CityAno(code = "Xiamen",value = "厦门")
@DistrictAno(code = "Haicang",value = "海沧")
public class WorkImpl implements Work{@Overridepublic String getData() {return "厦门天气很好";}
}

以上,感谢。

2024年2月26日

相关文章:

  • QSettings使用示例
  • 网络安全“三保一评”深度解析
  • 在Spring Boot启动时禁止自动配置数据源相关的组件、@SpringBootApplication
  • 嵌入式学习day26 Linux
  • 算法打卡day3|链表篇|Leetcode 203.移除链表元素、 707.设计链表 、 206.反转链表
  • 免费享受企业级安全:雷池社区版WAF,高效专业的Web安全的方案
  • 倒计时42天
  • React入门简介
  • pyspark分布式部署随机森林算法
  • 学习python的第7天,她不再开放她的听歌榜单
  • 【es6 】中的装饰器 decorator 到底是什么,有什么用,和ts 中的装饰器decorator有啥区别
  • 包装类详解
  • FPS游戏之漫谈Shader.globalMaximumLOD
  • 【Elasticsearch专栏 18】深入探索:Elasticsearch核心配置与性能调优 保姆级教程 企业级实战
  • 【Antd】Form 表单获取不到 Input 的值
  • [Vue CLI 3] 配置解析之 css.extract
  • Asm.js的简单介绍
  • dva中组件的懒加载
  • Java深入 - 深入理解Java集合
  • JS+CSS实现数字滚动
  • JS笔记四:作用域、变量(函数)提升
  • js中forEach回调同异步问题
  • October CMS - 快速入门 9 Images And Galleries
  • Service Worker
  • Shell编程
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • WebSocket使用
  • 基于Android乐音识别(2)
  • 每天10道Java面试题,跟我走,offer有!
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 入手阿里云新服务器的部署NODE
  • 为视图添加丝滑的水波纹
  • 学习JavaScript数据结构与算法 — 树
  • 硬币翻转问题,区间操作
  • 自制字幕遮挡器
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • UI设计初学者应该如何入门?
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​TypeScript都不会用,也敢说会前端?
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • ${ }的特别功能
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (k8s中)docker netty OOM问题记录
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (三)Honghu Cloud云架构一定时调度平台
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)jQuery 基础
  • (转)德国人的记事本
  • (转载)PyTorch代码规范最佳实践和样式指南
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET Core 版本不支持的问题
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存