【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语言的反射机制. ...
随机推荐
- c# HttpWebRequest 解决 请求HTTPS慢
其实就几行代码 if (strUrl.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { request.Cred ...
- kettle从入门到精通 第四十五课 ETL之 kettle redis
1.kettle 9.3/9.4 spoon客户端中默认是没有redis步骤的,首先想到在kettle的插件市场进行下载redis步骤. 2.可能因为网络原因,直接下载失败了.索性放弃redis原有插 ...
- ubuntu server 安装慢 安装卡
无论是桌面版本ubuntu,还是server 版本,都喜欢在安装过程中联网下东西: 默认的软件包镜像地址下载非常慢,你自身的网络再差点,可能会安装好几个小时. 解决方案: 方案1: 安装前拔网线. 方 ...
- 容器docker技术
我们先看看很久很久以前,服务器是怎么部署应用的! 由于物理机的诸多问题,后来出现了虚拟机. 但是虚拟化也是有局限性的,每一个虚拟机都是一个完整的操作系统,要分配系统资源,虚拟机多道一定程度时,操作系统 ...
- k8s配置文件管理
1.为什么要用configMap ConfigMap是一种用于存储应用所需配置信息的资源类型,用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件. 通过ConfigMap可以方便的 ...
- go随笔
1)声明在函数内部,是函数的本地值,类似private 2)声明在函数外部,是对当前包可见(包内所有.go文件都可见)的全局值,类似protect 3)声明在函数外部且首字母大写是所有包可见的全局值, ...
- Ceph提供nfs服务
目录 Ceph提供nfs服务 1. 前期准备 1.1 检查模块 1.2 检查是否有nfs-ganesha集群 2. 创建nfs服务 2.1 ceph提供的nfs的架构 3. nfs导出 3.1 创建c ...
- GIT 生成变更历史文件清单
脚本搞定git文件版本变化信息,解决部署种变更的审核和统计信息工作复杂问题 git diff --name-status --ignore-cr-at-eol --ignore-space-at-eo ...
- 迭代器模式(Interator Pattern)
一.模式动机 迭代器模式(Iterator Pattern)是一种使用频率非常高的行为型设计模式,迭代器用于对一个聚合对象进行遍历.通过引入迭代器可以将数据的遍历功能从聚合对象中分离出来,聚合对象只负 ...
- Scrcpy - 开源免费在电脑显示手机画面并控制手机的工具 (投屏/录屏/免Root)
教程:https://www.iplaysoft.com/scrcpy.html 官方地址:https://github.com/Genymobile/scrcpy