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文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象方法的功能称为 ...
随机推荐
- CSS 解决z-index上层元素遮挡下层元素点击事件问题
解决z-index上层元素遮挡下层元素点击事件问题 by:授客 QQ:1033553122 开发环境 Win 10 element-ui "2.8.2" Vue 2.9.6 需求 ...
- 主说明:自动Undo管理的故障排除指南(Doc ID 1579081.1)
Master Note: Troubleshooting guide for Automatic Undo Management (Doc ID 1579081.1) APPLIES TO: Orac ...
- django补充CBV和FBV模式
django补充CBV和FBV模式FBV模式---函数:经常用的方式CBV模式---类CBV中url连接时函数名后面要接.as_view()class index(views.View): @... ...
- docker学习笔记---基本命令
[root@docker ~]# docker Usage: docker [OPTIONS] COMMAND A self-sufficient runtime for containers Opt ...
- flyway 非常坑爹的中文乱码问题
flyway 也真是够了, 动不动乱码,烦死了! 我的 命令是这样的: flyway -driver=com.mysql.jdbc.Driver -user=root -password=12345 ...
- IT兄弟连 HTML5教程 CSS3属性特效 动画-animation
CSS3属性中有关于制作动画的三个属性:Transform,Transition,Animation.前面已经介绍过Transform和Transition了,这里我们来学习Animation动画.通 ...
- 耐人寻味的CSS属性font-family
font-family是一个网站用户体验的第一入口,非常有必要花功夫来研究一下.我们首先需要了解衬线字体和无衬线字体,接着了解中英文的常用字体及其适用性. 衬线字体 衬线(serif)的笔画有粗有细的 ...
- Shell命令的执行优先级
Shell内置命令.外部命令.别名.函数.保留关键字的优先级 在Shell中,有5种可调用的东西:别名(alias).函数(function).shell保留关键字.shell内置命令.外部命令. 如 ...
- 在 ASP.NET Core 中启用跨域请求(CORS)
本文介绍如何在 ASP.NET Core 的应用程序中启用 CORS. 浏览器安全可以防止网页向其他域发送请求,而不是为网页提供服务. 此限制称为相同源策略. 同一源策略可防止恶意站点读取另一个站点中 ...
- VScode - 10个提高工作效率的快捷键
复制行 shift + alt + up / down 移动行 alt + up / down 多选 按住alt + 鼠标单击 删除上个单词 ctrl + Backspace 全部保存 ctrl + ...