java reflect探究

Wesley13
• 阅读 457

获取Class的三种方式

  • Person.class
  • Class.forName("com.icngor.Person")
  • Class clazz = new Person().getClass()

利用获得的Class实例clazz进行操作

获得类名

  • clazz.getName() //获得类全名com.icngor.Person
  • clazz.getSimpleName() //获得类名Person

获得类字段名

  • Field[] f = clazz.getFields(); //返回数组,仅返回public修饰的字段
  • Field[] declaredFields = clazz.getDeclaredFields(); //返回全部字段

获得方法名

  • Method[] declaredMethods = clazz.getDeclaredMethods(); //返回全部方法
  • clazz.getDeclaredMethod(name, parameterTypes); //返回指定方法

获得构造器名

  • clazz.getDeclaredConstructors(int.class,String.class); //获得带此参数的构造器

构造对象

  • clazz.newInstance(); //调用无参构造方法
  • Constructor c1 = clazz.getDeclaredConstructor(String.class,int.class); //调用有参构造方法 Person p =c1.newInstance("icngor",1); System.out.println(p.getName());

通过反射调用方法

  • Person p =(Person) clazz.newInstance(); Method maMethod = clazz.getDeclaredMethod("setName", String.class); maMethod.invoke(p, "icngor");//相当于p.setName("icngor"); System.out.println(p.getName());

通过反射调用属性

  • Person p =(Person) clazz.newInstance(); Field f = clazz.getDeclaredField("name"); f.setAccessible(true); //设置安全(private)可见性,(禁止安全检查,提高运行效率) f.set(p, "icngor"); System.out.println(p.getName());

  • 反射效率极低,必须要使用且频繁调用调用时将setAccessible设为true,可提高性能

高级补充

  • 通过反射获取泛型信息(参数/返回值)
点赞
收藏
评论区
推荐文章
2021年度最全面JVM虚拟机,类加载过程与类加载器
前言类装载器子系统是JVM中非常重要的部分,是学习JVM绕不开的一关。一般来说,Java类的虚拟机使用Java方式如下:Java源程序(.java文件)在经过Java编译器编译之后就被转换成Java字节代码(.class文件)。类加载器负责读取Java字节代码,并转换成java.lang.Class类的一个实例。每个这样的实例用来表
2021年度最全面JVM虚拟机,类加载过程与类加载器
前言类装载器子系统是JVM中非常重要的部分,是学习JVM绕不开的一关。一般来说,Java类的虚拟机使用Java方式如下:Java源程序(.java文件)在经过Java编译器编译之后就被转换成Java字节代码(.class文件)。类加载器负责读取Java字节代码,并转换成java.lang.Class类的一个实例。每个这样的实例用来表
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
NetBeans配置Spring
<beanid"obstacle1"class"C:\launchCodeFiles\src\main\java\RunMario.java"改为<beanid"obstacle1"class"RunMario"class路径为(包名类名)<?xmlversion"1.0"encoding
Wesley13 Wesley13
3年前
Go 反射包使用教程
引子几乎所有高级语言都有反射功能,以用于语言的灵活性,实现各种封装。Java(java.lang.reflect)://获得Person的Class对象Class<?clstestJavaSE.Person.class;//Class.forName("testJavaSE.Person");//创建P
Easter79 Easter79
3年前
Spring学习笔记一
IOC容器里配置beanapplicationContext.xml必须有个无参的构造器class:bean的全类名通过beanid获得这个bean必须唯一spring提供2种IOC容器容器实现方式beanfactory用在spring本身applicationContext用在开发者配置方式相同
Wesley13 Wesley13
3年前
Java 读取Properties文件时应注意的路径问题
1\.使用Class的getResourceAsStream()方法读取Properties文件(资源文件)的路径问题:      InputStreaminthis.getClass().getResourceAsStream("资源Name");    注意:    (1)这种方式要求Properties资源文件必须与当
Wesley13 Wesley13
3年前
JAVA 中的反射(reflact)
获取反射加载类(获取类的字节码)的3种方式:Classclass1Class.forName("lession\_svc.lession\_svc.reflact.Person");Classclass2newPerson().getClass();Classclass3\Person.class;
Stella981 Stella981
3年前
EKT Java企业级关键技术强化 Enterprise Edition
EKTenterprisekeytechlology企业关键技术本章目标:1.理解Class类2.理解JAVA类加载体系结构3.理解类的加载过程Class对象由JVM自动产生,每当一个类被加载时,JVM就自动为其生成一个Class对象,通过Class对象可以获得类的相关信息。将类信息读到内存中过程,称为类加载
Wesley13 Wesley13
3年前
Java反射机制详解
一、内容提要:  1、反射机制是什么  2、反射机制能做什么  3、反射机制相关的API  4、通过一个对象获得完整的包名和类名  5、实例化Class类对象  6、获取一个对象的父类与实现的接口  7、获取某个类的全部构造函数  8、通过反射机制实例化一个类的对象  9、获取某个类的全部属性  10、