【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语言的反射机制. ...
随机推荐
- jquery的循环 tab切换
<ul> <li>1</li> <li>2</li> <li>3< ...
- xv6 内存管理
前文讲述了 xv6 的启动过程,本文接着讲述 xv6 内存管理的部分,直接来看. 公众号:Rand_cs 启动部分完善 前文只是介绍了启动的过程,但是各类函数之间的调用,地址的变换,内存布局的变化并没 ...
- kettle从入门到精通 第六十一课 ETL之kettle 任务调度器,轻松使用xxl-job调用kettle中的job和trans
1.大家都知道kettle设计的job流程文件有个缺点:只能设置简单的定时任务,无法设置复杂的如支持cron表达式的job. 今天给大家分享一个使用xxl-job调度carte的流程文件的示例.整个调 ...
- kettle从入门到精通 第三十二课 mysql 数据连接集群/分区配置
1.这里的集群实际上是数据分区或者分片的概念,如中国全国的学生,应该不会都存在一张表里面,有可能每个省市一个表进行存储. 2.集群(分区),如下图所示 设置在"集群"标签,勾选&q ...
- 关于excel表
对excel表的操作主要通过xlwt,xlrd模块. 创建excel表 import xlwtworkbook = xlwt.Workbook(encoding='utf-8') worksheet ...
- 什么是spring框架?
spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,是一个分层的javaEE一站式轻量级开源框架
- Unity 利用Cache实现边下边玩
现在手机游戏的常规更新方案都是在启动时下载所有资源更新,游戏质量高的.用户粘性大的有底气,先安装2个G,启动再更新2个G,文件小了玩家还觉得品质不行不想玩. 最近在做微信.抖音小游戏,使用他们提供的资 ...
- 利用.htaccess绑定子域名到子目录
Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 利用.htaccess绑定子域名到子目录 日期:2018- ...
- CF1320D Reachable Strings
110和011互相转化,相当于就是0在连续两个1的情况下,移动两个位置 能够发现,0的位置的奇偶不会改变,且很多个0之间的相对位置不会改变 猜想考虑这个答案只跟0的奇偶性有关,下面小证一下:(注意下面 ...
- 高通平台Android设备各种开机模式的进入与退出
原文地址:https://www.cnblogs.com/we-hjb/p/9784659.html 高通方案的Android设备主要有以下几种开机模式,Android.EDL.Fastboot.Re ...