Java反射03 : 获取Class的注解、修饰符、父类、接口、字段、构造器和方法
java.lang.Class类提供了获取类的各种信息对象的静态方法。
本文转载自:https://blog.csdn.net/hanchao5272/article/details/79363921
1.通过Class类可以做什么
- 获取类的包(Package)信息
- 获取类的注解(Annotation)信息
- 获取类的修饰符(Modifier)信息
- 获取类的继承的父类(Super Class)信息
- 获取类的实现的接口(Interface)信息
- 获取类的类名信息
- 获取类的字段(Field)信息
- 获取类的构造方法(Constructor)信息
- 获取类的方法(Method)信息
2.实例代码
User类
/**
* <p>用户表</p>
*/
@MyAnnotationA
@MyAnnotationB
public class User extends SuperUser implements InterfaceAAA,InterfaceBBB {
public String username = "张三";
public int password = 123456;
//setter getter constructor toString ...
}
测试类:
/**
* <p>java.lang.Class示例</p>
**/
public class ReflectClassesDemo {
private static final Logger LOGGER = Logger.getLogger(ReflectClassesDemo.class); /**
* <p>Java反射-类Class示例</p>
**/
public static void main(String[] args) throws NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//获得Class对象
Class userClass = User.class; //获得包信息 Package
LOGGER.info("通过class.getPackage()获得类的包名:" + userClass.getPackage()); //获取注解信息
LOGGER.info("通过class.getDeclaredAnnotation(name)获取指定的注解:" + userClass.getDeclaredAnnotation(MyAnnotationB.class));
Annotation[] annotations = userClass.getDeclaredAnnotations();
for (Annotation annotation : annotations) {
LOGGER.info("通过class.getDeclaredAnnotations()获取全部的注解:" + annotation);
} //获取修饰符 Modifier
LOGGER.info("通过class.getModifiers()获得类的修饰符:" + Modifier.toString(userClass.getModifiers())); //获的继承的父类 SuperClass
LOGGER.info("通过class.getSuperclass()获得类的父类" + userClass.getSuperclass()); //获取类实现的接口 Interface
Class[] interfaces = userClass.getInterfaces();
for (Class inter : interfaces) {
LOGGER.info("通过class.getInterfaces()获取类实现的接口:" + inter);
} //获取类的名称
LOGGER.info("通过class.getName()获得类的全名:" + userClass.getName());
LOGGER.info("通过class.getSimpleName()获得类的简名:" + userClass.getSimpleName()); //获取字段 Field
LOGGER.info("通过class.getDeclaredField(name)获取指定的字段:" + userClass.getDeclaredField("username"));
Field[] fields = userClass.getDeclaredFields();
for (Field field : fields) {
LOGGER.info("通过class.getDeclaredFields()获取全部字段:" + field);
} //获取构造器 Constructor
LOGGER.info("通过class.getDeclaredConstructor(args...)获取指定的构造器:" + userClass.getDeclaredConstructor());
Constructor[] constructors = userClass.getDeclaredConstructors();
for (Constructor constructor : constructors) {
LOGGER.info("通过class.getDeclaredConstructors()获取全部构造器:");
}
User user = (User) userClass.getDeclaredConstructor().newInstance();
LOGGER.info("通过constructor.newInstance(args...)进行对象实例化:" + user.toString()); //获取方法 Method
LOGGER.info("通过class.getDeclaredMethod(args...)获取指定的方法:" + userClass.getDeclaredMethod("setPassword", int.class));
Method[] methods = userClass.getDeclaredMethods();
for (Method method : methods) {
LOGGER.info("通过class.getDeclaredMethods()获取全部的方法:" + method);
}
userClass.getDeclaredMethod("setPassword", int.class).invoke(user, 9999);
LOGGER.info("通过method.invoke(obj,args...)执行方法:" + user.toString());
}
}
3.运行结果
INFO ReflectClassesDemo:28 - 通过class.getPackage()获得类的包名:package pers.hanchao.reflect.common
INFO ReflectClassesDemo:31 - 通过class.getDeclaredAnnotation(name)获取指定的注解:@pers.hanchao.reflect.common.MyAnnotationB()
INFO ReflectClassesDemo:34 - 通过class.getDeclaredAnnotations()获取全部的注解:@pers.hanchao.reflect.common.MyAnnotationA()
INFO ReflectClassesDemo:34 - 通过class.getDeclaredAnnotations()获取全部的注解:@pers.hanchao.reflect.common.MyAnnotationB()
INFO ReflectClassesDemo:38 - 通过class.getModifiers()获得类的修饰符:public
INFO ReflectClassesDemo:41 - 通过class.getSuperclass()获得类的父类class pers.hanchao.reflect.common.SuperUser
INFO ReflectClassesDemo:46 - 通过class.getInterfaces()获取类实现的接口:interface pers.hanchao.reflect.common.InterfaceAAA
INFO ReflectClassesDemo:46 - 通过class.getInterfaces()获取类实现的接口:interface pers.hanchao.reflect.common.InterfaceBBB
INFO ReflectClassesDemo:50 - 通过class.getName()获得类的全名:pers.hanchao.reflect.common.User
INFO ReflectClassesDemo:51 - 通过class.getSimpleName()获得类的简名:User
INFO ReflectClassesDemo:54 - 通过class.getDeclaredField(name)获取指定的字段:public java.lang.String pers.hanchao.reflect.common.User.username
INFO ReflectClassesDemo:57 - 通过class.getDeclaredFields()获取全部字段:public java.lang.String pers.hanchao.reflect.common.User.username
INFO ReflectClassesDemo:57 - 通过class.getDeclaredFields()获取全部字段:public int pers.hanchao.reflect.common.User.password
INFO ReflectClassesDemo:61 - 通过class.getDeclaredConstructor(args...)获取指定的构造器:public pers.hanchao.reflect.common.User()
INFO ReflectClassesDemo:64 - 通过class.getDeclaredConstructors()获取全部构造器:
INFO ReflectClassesDemo:64 - 通过class.getDeclaredConstructors()获取全部构造器:
INFO ReflectClassesDemo:67 - 通过constructor.newInstance(args...)进行对象实例化:User{username='张三', password='123456'}
INFO ReflectClassesDemo:70 - 通过class.getDeclaredMethod(args...)获取指定的方法:public void pers.hanchao.reflect.common.User.setPassword(int)
INFO ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public static void pers.hanchao.reflect.common.User.main(java.lang.String[])
INFO ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public java.lang.String pers.hanchao.reflect.common.User.toString()
INFO ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public static void pers.hanchao.reflect.common.User.test(java.lang.Object)
INFO ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public void pers.hanchao.reflect.common.User.setPassword(int)
INFO ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public int pers.hanchao.reflect.common.User.getPassword()
INFO ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public void pers.hanchao.reflect.common.User.setUsername(java.lang.String)
INFO ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public java.lang.String pers.hanchao.reflect.common.User.getUsername() throws java.lang.NullPointerException,java.lang.ArrayStoreException
INFO ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public void pers.hanchao.reflect.common.User.initUser(java.lang.String,java.lang.String)
INFO ReflectClassesDemo:73 - 通过class.getDeclaredMethods()获取全部的方法:public void pers.hanchao.reflect.common.User.demo(java.lang.String[])
INFO ReflectClassesDemo:76 - 通过method.invoke(obj,args...)执行方法:User{username='张三', password='9999'}
4.总结
- 通过class.getPackage()获取类的包(Package)信息
- 通过class.getDeclaredAnnotation(name)获取类的注解(Annotation)信息
- 通过class.getModifiers()获取类的修饰符(Modifier)信息
- 通过class.getSuperclass()获取类的继承的父类(Super **Class)信息
- 通过class.getInterfaces()获取类的实现的接口(Interface)信息
- 通过class.getName()获取类的类名信息
- 通过class.getDeclaredField(name)获取类的字段(Field)信息
- 通过class.getDeclaredConstructor(args…)获取类的构造方法(Constructor)信息
- 通过class.getDeclaredMethod(args…)获取类的方法(Method)信息
其中,关于注解(Annotation)、修饰符(Modifier)、字段(Field)、构造器(Constructor)和方法(Method)的相关内容,在后续章节中会继续深入学习。
Java反射03 : 获取Class的注解、修饰符、父类、接口、字段、构造器和方法的更多相关文章
- java反射之获取所有方法及其注解(包括实现的接口上的注解),获取各种标识符备忘
java反射之获取类或接口上的所有方法及其注解(包括实现的接口上的注解) /** * 获取类或接口上的所有方法及方法上的注解(包括方法实现上的注解以及接口上的注解),最完整的工具类,没有现成的工具类 ...
- java反射机制获取自定义注解值和方法
由于工作需求要应用到java反射机制,就做了一下功能demo想到这些就做了一下记录 这个demo目的是实现动态获取到定时器的方法好注解名称,废话不多说了直接上源码 1.首先需要自定义注解类 /** * ...
- Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理
1.Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理 2. 自定义注解: 使用@interfac ...
- java的访问控制(包、访问修饰符、修饰符)
一. java的类包 编写好一个源程序后,首先要执行javac命令进行编译源文件,并生成与源文件同名后缀为“.class”的字节码文件(类文件),该类文件与源文件默认在同一个目录中.该类文件是 ...
- Java反射机制demo(五)—获得并调用一个类中的方法
Java反射机制demo(五)—获得并调用一个类中的方法 这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和 ...
- Java面向对象之 接口: [修饰符] interface 接口名 {...};子接口:[修饰符] interface 接口名 extends 父接口,父接口2...{...}
1.什么是接口? 类比抽象类,把功能或者特性类似的一类 抽象的更彻底,可以提炼出更加特殊的"抽象类"----接口 2.如何定义接口 语法: [修饰符] interface 接口名 ...
- java反射之获取类的基本信息(一)
一.反射原理. Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还原“类的全部的信息”.这里“类的部分已经的信息”,可以是“类名”或“类的对象”等信息.“类的全部 ...
- java反射之获取枚举对象
项目中导入大量枚举对象,用来定义常量.随着带来一个问题,就是每个枚举类都需要通过key来获取对应枚举的需求. public enum ExamType { CRAFT(1, "草稿" ...
- Java反射机制获取Class文件
JAVA反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象方法的功能称为 ...
随机推荐
- vue集成cesium,webgis平台第一步(附源码下载)
vue-cesium-platform Vue结合Cesium的web端gis平台 初步效果 笔记本性能限制,运行Cesium温度飙到70度以上.所以平时开发时先开发界面,之后加载Cesium地球 当 ...
- 腾讯云推出一站式 DevOps 解决方案 —— CODING DevOps
在产业互联网的大背景下,如何将人工智能.大数据等前沿技术与实体产业相结合,推动传统企业转型升级,已经成为每一个企业不得不思考的问题.落后的软件研发能力已经拖慢了中国大量企业的数字化转型进程. 为了满足 ...
- JAVA杂记
写在前面:期末考试要来了,对于一个暑假自学了几天JAVA之后一个学期划水的人来说现在就是踏上了JAVA预习之路.下面是自己xjb记的东西,主要是根据老师给的流程图总结的自己认为需要的一些零碎的小知识, ...
- python中错误、调试、单元测试、文档测试
错误分为程序的错误和由用户错误的输入引起的错误,此外还有因为各种各样意外的情况导致的错误,比如在磁盘满的时候写入.从网络爬取东西的时候,网络断了.这类错误称为异常 错误处理 普通的错误处理机制就是在出 ...
- Angular(05)- 组件知识点脑图
点击左键 => 拖拽图片 => 新标签页查看图片 => 放大拖拽查阅
- leaflet-webpack 入门开发系列五地图卷帘(附源码下载)
前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...
- 14. java面向对象 - 基础
一.面向对象主线 1. Java类及类的成员:属性.方法.构造器.代码块.内部类 2. 面向对象三大特征:封装.继承.多态.(抽象性) 3. 其他关键字:this.super.static.final ...
- Python动态网页爬虫-----动态网页真实地址破解原理
参考链接:Python动态网页爬虫-----动态网页真实地址破解原理
- go语言之变量
1.go的hello world package main //申明开头,表示代码所属包,申明为main包,可以编译为二进制程序 import ( "fmt" ) //导入格式化包 ...
- three.js实现土星绕太阳体系
概况如下: 1.SphereGeometry实现自转的太阳,土星: 2.RingGeometry实现土星公转轨道: 3.ImageUtils加载球体贴图: 4.canvas中createRadialG ...