【Java】Reflection 反射机制 02获取类的一切
先创建一个可演示的类
注解类
package cn.dai.Reflection.demo; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target({ElementType.TYPE,ElementType.PACKAGE,ElementType.FIELD,ElementType.METHOD,ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAt {
String value() default "sample";
}
接口
public interface Plug {
void info();
}
父类
public class Creature<T> implements Serializable {
private boolean gender;
private double weight;
private void breath(){
System.out.println("生物在呼吸");
}
public void eat(){
System.out.println("生物吃食");
}
}
本类
@MyAt("Animal")
public class Animal extends Creature<String> implements Comparable<String>,Plug {
@MyAt("旺财")
private String name;
public int id;
public Animal() {
}
public Animal(String name, int id) {
this.name = name;
this.id = id;
}
@MyAt("雪糕")
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@MyAt("中国")
public String show(String nation){
System.out.println("我来自:"+ nation);
return nation;
}
@Override
public void info() {
System.out.println("我是一个动物!!!");
}
@Override
public int compareTo(String o) {
return 0;
}
@Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
", id=" + id +
'}';
}
}
获取运行时类的所有结构
属性获取
@Test
public void getInstanceAllField(){
Class<Animal> animalClass = Animal.class; // 获取本类和父类的所有属性,返回一个属性类实例的数组 本类和父类private修饰的字段是不能被获取到的
Field[] fields = animalClass.getFields(); for (Field field : fields) {
System.out.println(field);
} System.out.println("-----------------------------------------------------------------"); // getDeclaredFields(); 当前运行时类的所有属性 没有访问权限限制,仅限本类独有的字段
Field[] declaredFields = animalClass.getDeclaredFields();
for (Field field : declaredFields) {
System.out.println(field);
}
} @Test
public void getInstance2(){
Class<Animal> animalClass = Animal.class; Field[] declaredFields = animalClass.getDeclaredFields();
for (Field field : declaredFields) {
// 权限修饰访问
int modifiers = field.getModifiers();//获取访问权限修饰 返回的是一个权限状态值
String accessModifier = Modifier.toString(modifiers); // 通过这个权限修饰类转换一下 // 数据类型访问 获取
Class<?> fieldType = field.getType();
String fieldTypeName = fieldType.getName(); // 字段标识名 获取
String fieldName = field.getName(); System.out.println(accessModifier + " " + fieldTypeName + " " + fieldName);
}
}
方法的获取
@Test
public void getMethods(){
Class<Animal> animalClass = Animal.class; // 获取当前运行时类和及其父类,所有public修饰的方法
Method[] methods = animalClass.getMethods();
for (Method method : methods) {
System.out.println(method);
} System.out.println("-----------------------------------------------------------------"); // 获取当前运行时类中声明的所有方法,不包含父类
Method[] declaredMethods = animalClass.getDeclaredMethods();
for (Method method:declaredMethods) {
System.out.println(method);
}
} @Test
public void getFactor(){
// 权限修饰,返回类型,方法名,参数,抛出的异常,注解,注解的值
Class<Animal> animalClass = Animal.class;
// 获取声明的注解
Method[] declaredMethods = animalClass.getDeclaredMethods();
for (Method method:declaredMethods) { Annotation[] annotations = method.getAnnotations();
for (Annotation annotation: annotations) { System.out.println(annotation); // @cn.dai.Reflection.demo.MyAt(value=中国)
} // 获取方法的权限修饰
int modifiers = method.getModifiers();
String accessModifier = Modifier.toString(modifiers); // 获取返回类型
Class<?> returnType = method.getReturnType();
String returnTypeName = returnType.getName(); // 获取方法名
String methodName = method.getName(); // 获取参数
Class<?>[] parameterTypes = method.getParameterTypes();
if (!(parameterTypes == null && parameterTypes.length == 0)){ for (int i = 0; i < parameterTypes.length; i++) {
System.out.println(parameterTypes[i].getName() + "参数" + i);
}
} // 异常的获取
Class<?>[] exceptionTypes = method.getExceptionTypes();
if (exceptionTypes.length > 0){
for (int i = 0; i < exceptionTypes.length; i++) {
System.out.println( exceptionTypes[i].getName() );
}
}
}
}
构造器获取
@Test
public void constructor(){
Class<Animal> animalClass = Animal.class; // 当前运行时类中声明为Public 的构造器
Constructor[] constructors = animalClass.getConstructors();
for (Constructor constructor:constructors) {
System.out.println(constructor);
} System.out.println("--------------------------------------"); // 当前运行时类自己的构造器,无论权限修饰
Constructor[] declaredConstructors = animalClass.getDeclaredConstructors();
for (Constructor constructor: declaredConstructors) {
System.out.println(constructor);
}
}
父类获取,及泛型获取
@Test
public void superClass(){
Class<Animal> animalClass = Animal.class; // 仅父类
Class<? super Animal> superclass = animalClass.getSuperclass();
System.out.println(superclass); // 带泛型的父类
Type genericSuperclass = animalClass.getGenericSuperclass();
System.out.println(genericSuperclass); ParameterizedType type = (ParameterizedType)genericSuperclass; // 多个泛型参数类
Type[] actualTypeArguments = type.getActualTypeArguments();
// 取第一个泛型参数类的名字
System.out.println(((Class)actualTypeArguments[0]).getName());
}
接口,所在包,注解
@Test
public void IPA(){
Class<Animal> animalClass = Animal.class; // 接口是多实现的,所有可能有多个存在
Class<?>[] interfaces = animalClass.getInterfaces(); for (Class interFace:interfaces) {
System.out.println(interFace);
} System.out.println("---------------------------------------"); // 获取父类接口
Class<?>[] interfaces1 = animalClass.getSuperclass().getInterfaces(); for (Class interFace:interfaces1) {
System.out.println(interFace);
} System.out.println("----------------------------------------"); // 所在包
Package aPackage = animalClass.getPackage();
System.out.println(aPackage); // 类上的注解
Annotation[] annotations = animalClass.getAnnotations();
for (Annotation annotation : annotations){
System.out.println(annotation);
}
}
【Java】Reflection 反射机制 02获取类的一切的更多相关文章
- java 通过反射机制调用某个类的方法
package net.xsoftlab.baike; import java.lang.reflect.Method; public class TestReflect { public s ...
- 浅谈Java反射机制 之 获取类的字节码文件 Class.forName("全路径名") 、getClass()、class
另一个篇:获取 类 的 方法 和 属性(包括构造函数) 先贴上Java反射机制的概念: AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它 ...
- JAVA反射机制教程-获取类对象
1. 什么是类对象 类对象,就是用于描述这种类,都有什么属性,什么方法的 2. 获取类对象 获取类对象有3种方式(1). Class.forName(2). Hero.class(3). new He ...
- 浅谈Java反射机制 之 获取类的 方法 和 属性(包括构造函数)
上一篇 获取 类 的字节码文件 我们讲到了获取类的字节码文件的三种方法 第三种方法通过getClass("全路径名")获取字节码文件最符合要求 1.获取构造方法 先贴上我们要获取的 ...
- Java反射机制 之 获取类的 方法 和 属性(包括构造函数)(Day_06)
把自己立成帆,才能招来凤. 运行环境 JDK8 + IntelliJ IDEA 2018.3 本文中使用的jar包链接 https://files.cnblogs.com/files/papercy ...
- 浅谈Java反射机制 之 使用类的 属性、方法和构造函数
前面两篇我们总结了Java反射机制如何获取类的字节码,如何获取构造函数,属性和方法, 这篇我们将进一步验证如何使用我们获取到的属性.方法以及构造函数 1.使用 反射 获取到的 属性 import ja ...
- java笔录---反射机制(1)
引言 为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架, 像spring中核心模块IO ...
- 面试题思考:什么是 Java 的反射机制
一.反射机制概述 Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法.这种在运行时动态的获取信息以及动态调用对象的方法 ...
- Java进阶之reflection(反射机制)——反射概念与基础
反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...
- java学习--Reflection反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
随机推荐
- pandas基础--基本功能
pandas含有是数据分析工作变得更快更简单的高级数据结构和操作工具,是基于numpy构建的. 本章节的代码引入pandas约定为:import pandas as pd,另外import numpy ...
- Github Markdown 指定图片在光亮或暗黑模式展示
Github 根据系统配置不同的主题模式: 如果想要在光亮模式和暗黑模式显示不同的主题的图片,比如以下就是同一个图片在暗黑模式和光亮模式下展示: 解决方案 在markdon 的图片链接后添加#gh-d ...
- vant做城市列表
vant: https://youzan.github.io/vant/#/zh-CN/ 安装 cnpm i -S vant 按需加载配置 # 在 babel.config.js 中配置 module ...
- 程序员面试金典-面试题 16.20. T9键盘
题目: 在老式手机上,用户通过数字键盘输入,手机将提供与这些数字相匹配的单词列表.每个数字映射到0至4个字母.给定一个数字序列,实现一个算法来返回匹配单词的列表.你会得到一张含有有效单词的列表.映射如 ...
- kettle从入门到精通 第二十四课 kettle 部署生产常用命令
一.设置KETTLE_HOME环境变量 假设kettle软件目录为/xxx/data-integration vi ~/.bash_profile export KETTLE_HOME=/xxx/da ...
- 谁说.net core不好动态访问webservice?看这篇文章,C#快速实现动态访问webservice,兼容.net framework和.net core+
前言:访问webservice,大多数人都是用服务引用的方式,但是这种方式比较麻烦,例如遇到服务更新了,你还需要手动更新你的服务引用,再重新发布,很麻烦.或者已有的一些例子,至少我看到的很多案例,动态 ...
- js获取指定日期的前一天/后一天
date代表指定日期,格式:2018-09-27 day代表天数,-1代表前一天,1代表后一天 // date 代表指定的日期,格式:2018-09-27// day 传-1表始前一天,传1表始后一天 ...
- elasticsearch6.8 ik分词器需安装
elasticsearch6.8 ik分词器需安装order_info_es/_analyze POST{ "analyzer": "ik_max_word" ...
- C#算法求解最佳组队问题
最佳组队问题 双人混合ACM程序设计竞赛即将开始,因为是双人混合赛,故每支队伍必须由1男1女组成.现在需要对n名男队员和n名女队员进行配对.由于不同队员之间的配合优势不一样,因此,如何组队成了大问题. ...
- Kubernetes 存储资源 PV、PVC 和StorageClass详解
一.存储机制介绍 在 Kubernetes 中,存储资源和计算资源(CPU.Memory)同样重要,Kubernetes 为了能让管理员方便管理集群中的存储资源,同时也为了让使用者使用存储更加方便,所 ...