【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语言的反射机制. ...
随机推荐
- 震惊!docker镜像还有这些知识你都知道吗
震惊!docker镜像还有这些知识你都知道吗? 镜像搜索 语法 [root@hmm docker-hello]# docker search -h Flag shorthand -h has been ...
- c# HttpWebRequest 解决 请求HTTPS慢
其实就几行代码 if (strUrl.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { request.Cred ...
- 小程序转发 搜索wxml
新闻转发 在小程序中要不通过菜单项来完成分享功能,只能通过表单组件中的按钮来完成. 它是通过按钮中的开放能力完成 按钮自定义处理 新闻搜索 搜索wxml 搜索业务的js
- react 属性绑定动态值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- nginx resolver 指定多个DNS (2个DNS)
nginx resolver 指定多个DNS (2个DNS) 直接在 resolver 后边填2个DNS,中间用空格 location / { resolver 223.5.5.5 114.114.1 ...
- linux nginx命令 查找目录和重启
#查看nginx进程 [root@LinuxServer]$ps -aux | grep nginx root 3229 0.0 0.0 112812 972 pts/0 S+ 16:50 0:00 ...
- 反模式 DI anti-patterns
反模式 DI anti-patterns 反模式DI anti-patterns <Dependency Injecttion Prinsciples,Practices, and Patter ...
- Ubuntu访问samba共享文件
Ubuntu访问samba共享文件 参考:https://www.cnblogs.com/Wolf-Dreams/p/11241198.html 做法 安装samba-client.cifs-util ...
- Python读取YAML配置数据
python编写的一些脚本需要一些简单配置时可以使用yaml文件进行设置.本文将介绍如何使用pyyaml进行读取配置数据. 首先安装pyyaml pip install pyyaml 简单使用下pyy ...
- power bi柱形图如何设置高亮自动显示
通过度量值,将需要高亮的数据颜色设置为明显高亮于背景的颜色,将不需要设置为高亮的颜色设置为稍深于背景的颜色, 效果如下: