通过反射获取类的完整结构(1)--属性方法
文章目录
- 1.概念
- 2.实例
- 2.1获取属性
- 2.1.1获取属性名
- 2.1.2获取属性的权限修饰符
- 2.1.3获取属性的类型
- 2.2获取方法
- 2.2.1获取方法名
- 2.2.2获取限定值
1.概念
通过反射调用类的完整结构
- 实现的全部接口
- 所继承的父类
- 全部的构造器
- 全部的方法
- 全部的field
2.实例
我们为Person类添加父类,Annotation,Interface
父类
public class Creature <T>{public double weigth;public void breath(){System.out.println("take a breath!");}
Annotation
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {String value();
}
Interface
import java.io.Serializable;public interface MyInterface extends Serializable{}
Person类
@MyAnnotation(value="yyzhang")
public class Person extends Creature<String> implements Comparable,MyInterface{public String name;private int age;public int id;public Person() {super();} public Person(String name) {super();this.name = name;}public Person(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@MyAnnotation(value="0025")public void show(){System.out.println("This is class of Person");}public void display (String nation)throws Exception{System.out.println("my nation is:"+nation);}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}@Overridepublic int compareTo(Object o) {// TODO Auto-generated method stubreturn 0;}class Bird{}
}
2.1获取属性
2.1.1获取属性名
- getFields()
- getDeclaredFields()
运行Test代码
public void Test1(){Class clazz =Person.class;Field[] fields=clazz.getFields();//只能获取到运行时类及其父类public的属性for(int i=0;i<fields.length;i++){System.out.println(fields[i]);}//获取运行时类本身声明的所有属性Field[] fields1=clazz.getDeclaredFields();for(Field f:fields1){System.out.println(f.getName());}}
结果如下
得到结论:
- getFields()只能获取到运行时类及其父类public的属性
- getDeclaredFields()只能获取到运行时类本身声明的所有属性
2.1.2获取属性的权限修饰符
从前面我们知道了getDeclaredFields()可以获取到类本身声明的变量名,但比起getFields()而言,只有变量名来说是远远不够的。
- 获取每个属性的权限修饰符
getModifiers(),返回值是int类型,1代表public,2代表private,0代表默认。 - 再调用Modifier.toString()方法,即可变为字符串类型。
int i=f.getModifiers();
String str=Modifier.toString(i);
输出结果
2.1.3获取属性的类型
代码
Class Type=f.getType();
System.out.println(Type.getName()+" ");
运行结果
2.2获取方法
2.2.1获取方法名
- getMethods()
获取运行时类及其父类中所有声明为public的方法
代码
public void test1(){Class clazz =Person.class;Method[] m1=clazz.getMethods();for(Method m:m1){System.out.println(m);}}
运行结果
无法获取private的方法
- getDeclaredMethods()
获取运行时类本身的所有办法
代码
Method[] m2=clazz.getDeclaredMethods();for(Method m:m2){System.out.println(m);}
运行结果
2.2.2获取限定值
- 注释
- 权限修饰符
- 返回值类型
- 方法名
- 形参列表
代码
public void test2(){Class clazz =Person.class;Method[] m2=clazz.getDeclaredMethods();for(Method m:m2){//1.注释Annotation[] ann=m.getAnnotations();for(Annotation a: ann){System.out.print(a+" ");}//2.权限修饰符String str=Modifier.toString(m.getModifiers());System.out.print(str+" ");//3.返回值类型Class returnType=m.getReturnType();System.out.print(returnType.getName()+" ");//4.方法名System.out.print(m.getName());//5.形参列表System.out.print("(");Class[] params=m.getParameterTypes();for(int i=0;i<params.length;i++){System.out.print(params[i].getName()+i+" ");}System.out.print(")");System.out.println();}}
输出结果
通过反射获取类的完整结构(1)--属性方法相关推荐
- 反射获取类_新人也能看懂?如何使用 Java 反射?反射的用法及案例
· 简介 Java Reflection,称为 Java 反射,是Java基础部分的一个比较难的点.Reflection(反射)是被视为动态语言的关键,通过反射机制,我们可以在运行时(runtime) ...
- 【Java 19】反射 - 反射机制概述、获取Class实例、类的加载与ClassLoader的理解、创建运行时类的对象、获取运行时类的完整结构、调用运行时类的指定结构、动态代理
反射机制概述.获取Class实例.类的加载与ClassLoader的理解.创建运行时类的对象.获取运行时类的完整结构.调用运行时类的指定结构.动态代理 反射 1 Java反射机制概述 1.1 Java ...
- Java基础知识点__获取运行时类的完整结构
通过反射获取运行时类的完整结构 Field,method,Construuuctor,Superclass,Interface,Annotation 实现的全部接口 继承的父类 全部的构造器 全部的构 ...
- Java知识点总结(反射-获取类的信息)
Java知识点总结(反射-获取类的信息) @(Java知识点总结)[Java, 反射] 应用反射的API,获取类的信息(类的名字.属性.方法.构造器等) import java.lang.reflec ...
- Java基础-通过反射获取类的信息
目录 1.获取Field 2.反编译Field 3.通过反射机制访问对象属性 4.可变长度参数 5.反射Method(了解) 6.反编译(了解) 7.反射机制调用方法 8.反射Constructor ...
- 通过反射获取类的所有属性和方法
通过反射获取类的所有属性和方法 1 private void button1_Click(object sender, EventArgs e) 2 { 3 ...
- java反射获取实现类_Java介绍通过反射获取类的信息
免费学习推荐:java基础教程 目录1.获取Field 2.反编译Field 3.通过反射机制访问对象属性 4.可变长度参数 5.反射Method(了解) 6.反编译(了解) 7.反射机制调用方法 8 ...
- python 元类的call_python3 全栈开发 - 内置函数补充, 反射, 元类,__str__,__del__,exec,type,__call__方法...
python3 全栈开发 - 内置函数补充, 反射, 元类,__str__,__del__,exec,type,__call__方法 一, 内置函数补充 1,isinstance(obj,cls)检查 ...
- java获取运行时对象,java 面向对象(四十一):反射(五)反射应用二:获取运行时类的完整结构...
我们可以通过反射,获取对应的运行时类中所有的属性.方法.构造器.父类.接口.父类的泛型.包.注解.异常等.... 典型代码: @Test public void test1(){ Class claz ...
- java反射怎么获取结构体_java反射-使用反射获取类的所有信息
在OOP(面向对象)语言中,最重要的一个概念就是:万事万物皆对象. 在java中,类也是一个对象,是java.lang.Class的实例对象,官网称该对象为类的类类型. Class 类的实例表示正在运 ...
最新文章
- linux vi 批量修改某类字符串
- ubuntu18安装pytorch-gpu,一行conda命令安装,不需要单独安装cuda
- android 之ViewStub
- boost::enable_current_exception用法测试程序
- 修改数据表部分字段方法封装-及-动态生成对象并动态添加属性
- MYSQL 在当前时间加上或减去一个时间段
- php 获取js对象的属性值,js获取对象,数组所有属性键值(key)和对应值(value)的方法示例...
- Vue优化策略_项目发布_01
- java 初始化 静态变量,关于spring:Java初始化静态变量的时间顺序
- MyCat分布式数据库集群架构工作笔记0017---高可用_单表存储千万级_海量存储_垂直分库
- PPPoE工作原理与帧格式
- js中eval的用法
- keras调用自己训练的模型,并去掉全连接层
- 【SpringBoot_ANNOTATIONS】 生命周期 01 @Bean指定初始化和销毁方法
- Excel常用的功能
- python调用谷歌翻译_python调用谷歌翻译
- Jenkins配置slaver节点
- 微信内嵌浏览器打开手机浏览器下载APP(APK)的方法
- 技术人该如何选择未来职业方向?一起听听这几位美团同学的故事
- JS中的BOM、正则表达式、定时器