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的注解、修饰符、父类、接口、字段、构造器和方法的更多相关文章

  1. java反射之获取所有方法及其注解(包括实现的接口上的注解),获取各种标识符备忘

    java反射之获取类或接口上的所有方法及其注解(包括实现的接口上的注解) /** * 获取类或接口上的所有方法及方法上的注解(包括方法实现上的注解以及接口上的注解),最完整的工具类,没有现成的工具类 ...

  2. java反射机制获取自定义注解值和方法

    由于工作需求要应用到java反射机制,就做了一下功能demo想到这些就做了一下记录 这个demo目的是实现动态获取到定时器的方法好注解名称,废话不多说了直接上源码 1.首先需要自定义注解类 /** * ...

  3. Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理

    1.Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理 2. 自定义注解: 使用@interfac ...

  4. java的访问控制(包、访问修饰符、修饰符)

    一.     java的类包 编写好一个源程序后,首先要执行javac命令进行编译源文件,并生成与源文件同名后缀为“.class”的字节码文件(类文件),该类文件与源文件默认在同一个目录中.该类文件是 ...

  5. Java反射机制demo(五)—获得并调用一个类中的方法

    Java反射机制demo(五)—获得并调用一个类中的方法 这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和 ...

  6. Java面向对象之 接口: [修饰符] interface 接口名 {...};子接口:[修饰符] interface 接口名 extends 父接口,父接口2...{...}

    1.什么是接口? 类比抽象类,把功能或者特性类似的一类 抽象的更彻底,可以提炼出更加特殊的"抽象类"----接口 2.如何定义接口 语法:  [修饰符] interface 接口名 ...

  7. java反射之获取类的基本信息(一)

    一.反射原理. Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还原“类的全部的信息”.这里“类的部分已经的信息”,可以是“类名”或“类的对象”等信息.“类的全部 ...

  8. java反射之获取枚举对象

    项目中导入大量枚举对象,用来定义常量.随着带来一个问题,就是每个枚举类都需要通过key来获取对应枚举的需求. public enum ExamType { CRAFT(1, "草稿" ...

  9. Java反射机制获取Class文件

    JAVA反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象方法的功能称为 ...

随机推荐

  1. Django:永别了pycrypto库~

    在开发微信登陆功能时,解密用户信息需要使用到 Crypto 包,所以安装了pycrypto库. Linux.OS X 系统均可直接 pip install pycrypto . 最近换到win10下开 ...

  2. Linux下设置mysql允许远程连接

    最近在Linux上安装了Mysql,然后在Windows环境下通过Navicat来连接时,出现报错:1045 Access denied for user 'root'@'XXX' (using pa ...

  3. sparql 查询语句快速入门

    介绍 RDF is a directed, labeled graph data format for representing information in the Web. RDF is ofte ...

  4. C# Task 多任务 限制Task并发数量

    LimitedTaskScheduler: using System; using System.Collections.Concurrent; using System.Collections.Ge ...

  5. Spring Boot 的静态资源处理

    做web开发的时候,我们往往会有很多静态资源,如html.图片.css等.那如何向前端返回静态资源呢?以前做过web开发的同学应该知道,我们以前创建的web工程下面会有一个webapp的目录,我们只要 ...

  6. 教你用python假装黑客装逼,当着朋友的面破解他的网站密码!

    如何破解iphone登陆密码 今天看了一篇关于如何破解iphone手机密码的文章,瞬间觉得科学技术不是第一生产力,why? 根据“可靠消息”称,即便美国FBI也无法轻易的对iphone手机进行暴力破解 ...

  7. 一分钟理解Java公平锁与非公平锁

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  8. LeetCode刷题191122

    博主渣渣一枚,刷刷leetcode给自己瞅瞅,大神们由更好方法还望不吝赐教.题目及解法来自于力扣(LeetCode),传送门. 算法: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. ...

  9. 检测值是否存在(??)(Freemarker的null值处理)

    使用形式: unsafe_expr?? 或 (unsafe_expr)?? 这个操作符告诉我们一个值是否存在.基于这种情况, 结果是 true 或 false. 访问非顶层变量的使用规则和默认值操作符 ...

  10. 使用Active Database Duplication创建跨平台Data Guard设置 (Windows/Linux) (Doc ID 881421.1)

    Using Active Database Duplication to Create Cross Platform Data Guard Setup (Windows/Linux) (Doc ID ...