一、Class的API

二、测试使用的JavaBean

class Admin{//字段public String userName;public String pwd;private int age;//构造方法public Admin(){System.out.println("无参构造器啦。。。。。");}public Admin(String userName,String pwd){System.out.println("我的用户名:"+userName+" 密码:"+pwd);}private Admin(int age){System.out.println("我的保密年龄:"+age);}//方法private void setAge(int age){this.age=age;}public int getAge(int age){return age;}}

三、测试

1、获取构造器并创建实例

通过getConstructors()方法获取所有的public构造器

@Test//获取所有public的构造器public void getAllPublicConstrutor() {//1、先找到被调用构造器所在类的字节码Class clazz=Admin.class;//2、获取所有的public构造器Constructor[] cons=clazz.getConstructors();for (Constructor constructor : cons) {System.out.println(constructor);}}/*** 测试结果:*  public Admin()public Admin(java.lang.String,java.lang.String)*/

通过getDeclaredConstructors()获取所有的构造器

    @Test//通过getDeclaredConstructors()获取所有的构造器public void getAllConstrutor(){Class clazz=Admin.class;Constructor[] cons=clazz.getDeclaredConstructors();for (Constructor constructor : cons) {System.out.println(constructor);}}/*** 测试结果:*     public Admin()public Admin(java.lang.String,java.lang.String)private Admin(int)*/

获取指定的public构造器,并创建实例

@Test//获取指定的public构造器,并创建实例public void ConstructorPublicInvoke() throws  Exception{//1、先找到被调用构造器所在类的字节码Class clazz=Admin.class;//2、找到被调用指定的构造器,传入构造器参数的字节码Constructor construtor=clazz.getConstructor(String.class,String.class);//3、执行构造器  创建对象construtor.newInstance("Jack","123456");}/*** 测试结果:* 我的用户名:Jack 密码:123456*/

获取指定的private构造器,并创建实例

    @Test//获取指定的private构造器,并创建实例public void ConstructorInvoke() throws Exception {//1、先找到被调用构造器所在类的字节码Class clazz=Admin.class;//2、找到被调用指定的构造器,传入构造器参数的字节码Constructor construtor=clazz.getDeclaredConstructor(int.class);//3、在调用构造器之前,设置改构造器可以被访问construtor.setAccessible(true);//4、执行构造器  创建对象construtor.newInstance(13);}/*** 测试结果:*    我的保密年龄:13*/

2、获取方法并调用方法

获取所有的public方法,以及父类的方法

@Test//获取所有的public方法,以及父类的方法public void getPublicMethod(){Class clazz=Admin.class;Method[] methods=clazz.getMethods();for (Method method : methods) {System.out.println(method);}}/** 测试结果:*  public int Admin.getAge(int)public final void java.lang.Object.wait() throws java.lang.InterruptedExceptionpublic final void java.lang.Object.wait(long,int) throws java.lang.InterruptedExceptionpublic final native void java.lang.Object.wait(long) throws java.lang.InterruptedExceptionpublic native int java.lang.Object.hashCode()public final native java.lang.Class java.lang.Object.getClass()public boolean java.lang.Object.equals(java.lang.Object)public java.lang.String java.lang.Object.toString()public final native void java.lang.Object.notify()public final native void java.lang.Object.notifyAll()*/

获取所有的方法,不包括父类的。

    @Test//获取所有的方法,不包括父类的。public void getAllMethod(){Class clazz=Admin.class;Method[] methods=clazz.getDeclaredMethods();for (Method method : methods) {System.out.println(method);}}/*** 测试结果:*  private void Admin.setAge(int)public int Admin.getAge(int)*/

调用public方法,并执行

    @Test//调用public方法,并执行public void getPublicMethodInvoke() throws Exception{//1、先找到被调用构造器所在类的字节码Class clazz=Admin.class;//2、根据方法名,获取方法Method method=clazz.getMethod("getAge", int.class);//3、调用方法method.invoke(clazz.newInstance(), 23);}/*** 测试结果:*  无参构造器啦。。。。。public方法===我的年龄是23* */

调用私有方法并执行

@Test//调用私有方法并执行public void getMethodInvoke() throws Exception{//1、先找到被调用构造器所在类的字节码Class clazz=Admin.class;//2、根据方法名,获取方法Method method=clazz.getDeclaredMethod("setAge", int.class);//3、设置私有方法为可调用method.setAccessible(true);//4、调用方法method.invoke(clazz.newInstance(), 23);}/*** 测试结果:*  无参构造器啦。。。。。私有方法====我的年龄是23*/

3、设置字段和获取字段

设置和获取public的字段

@Test//获取public的字段public void setGetPublicFileds() throws  Exception{//1、先找到被调用构造器所在类的字节码Class clazz=Admin.class;//2、根据字段名获取字段Field field=clazz.getField("userName");//3、创建实例Admin admin=(Admin) clazz.newInstance();//4、设置值field.set(admin, "Jack");String userName=  (String) field.get(admin);System.out.println(userName);}/*** 测试结果:*         无参构造器啦。。。。。Jack*/

设置和获取

@Test//设置和获取private字段public void setGetFileds() throws  Exception{//1、先找到被调用构造器所在类的字节码Class clazz=Admin.class;//2、根据字段名获取字段Field field=clazz.getDeclaredField("age");//3、创建实例Admin admin=(Admin) clazz.newInstance();//4、设置字段为可见field.setAccessible(true);//5、设置值field.set(admin, 15);//6、获取值Integer age= (Integer) field.get(admin);System.out.println(age);}/*** 测试结果:*         无参构造器啦。。。。。15*/

4、获取参数泛型信息

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;class Gene{public Map<String,Object> map;
}
public class GenericType {public static void main(String[] args) throws Exception {Class clazz=Gene.class;Field field=clazz.getField("map");//获取带泛型的类型Type type=field.getGenericType();System.out.println(type);//java.util.Map<java.lang.String, java.lang.Object>ParameterizedType paraType=(ParameterizedType) type;Type[] types=paraType.getActualTypeArguments();System.out.println(types[0]);//StringSystem.out.println(types[1]);//Object/*** 输出结果:*  class java.lang.Stringclass java.lang.Object*/}
}

1、java.lang.reflect.Type;

所有已知子接口:GenericArrayType, ParameterizedType, TypeVariable<D>, WildcardType

所有已经实现的类:Class

2、ParameterizedType 表示参数化类型,如 Collection<String>。

getActualTypeArguments():返回表示此类型实际类型参数的 Type 对象的数组。

转载于:https://www.cnblogs.com/lyajs/p/5626520.html

小贾漫谈——Java反射相关推荐

  1. 一个小例子体会Java反射的动态性

    背景:需要在程序运行时或者说某段代码运行后才能知道要创建哪个类的对象. import java.util.Random;/*** @Author: Yeman* @Date: 2021-10-02-2 ...

  2. java 获取 反射 方法 名_乐字节Java反射之一:反射概念与获取反射源头Class

    一.Java反射机制概念 "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言",如Python, Ruby是动态语言:显然C++,Java,C#不是动态语言,但是JAV ...

  3. java 反射 慢在那里_Java 反射到底慢在哪?

    反射具体是怎么影响性能的?这引起了我的反思. 是啊,在阐述某个观点时确实有必要说明原因,并且证明这个观点是对的,虽然反射影响性能人尽皆知,我曾经也真的研究过反射是否存在性能问题,但并没有在写文章的时候 ...

  4. 初识java反射机制

    这篇小博客有这么些内容~认识何使用java反射机制的心路历程 什么是java反射机制呢?什么时候会用到java反射机制呢?怎么使用java反射机制呢? 那我们开始吧~ (一)反射机制(Reflecti ...

  5. java 反射 速度_Java反射获取实例的速度对比分析

    之前代码有一个逻辑,是在初始化时读取某个包下的所有class文件,放入到一个HashMap里.代码运行过程中,通过Key获取到对应class的全路径名,最后通过Class.forName(classN ...

  6. java 反射 ppt_Java反射的基本使用

    这里是修真院后端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析后端知识/技能,本篇分享的是: [Java反射的 ...

  7. 粗浅看 java反射机制

    Java 反射是 Java 被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运 行时透过 Reflection APIs 取得任何一个已知名称的class 的内部信息,包括其 modifi ...

  8. Java 反射 (Class、ClassLoader、Constructor、Method、Field)

    反射是Java中一个非常重要.非常强大的机制.曾看到一句话"反射是框架的灵魂",初学时不懂,等到学完框架之后才慢慢理解其意. 什么是反射?我们先通过几个类和示例来初步体会一下反射. ...

  9. java反射的编译过程_Java反射机制小结和实际操作

    一.什么是反射 1.编译和运行 在了解什么是Java反射机制前,先聊聊Java的编译和运行. 还记得第一次使用记事本编写第一个Java程序的场景吗?通过命令窗口,使用javac命令编译一个.java文 ...

最新文章

  1. SpringBoot如何使用策略模式干掉if else
  2. 【转载】HTML导入css的四种方式
  3. 理解SQL Server中的锁
  4. 【bzoj4007】[JLOI2015]战争调度 暴力+树形背包dp
  5. (100)Verilog HDL:UART波特率设计
  6. Numpy中的时间类型
  7. HNOI2002(伸展树)
  8. 阶段3 2.Spring_07.银行转账案例_3 分析事务的问题并编写ConnectionUtils
  9. mysql yacc 解析_yacc介绍
  10. Qt开发,应用程序错误,应用程序无法正常启动0xc000007b
  11. oracle判断字符串是不是日期,在ORACLE中如何判断一个字符串是否是一个合适的日期...
  12. Javaweb自驾游景点查询网站设计与实现
  13. 安全合规/GDPR--27--我们通过了GDPR合规认证
  14. 读淘宝页面字节流提取宝贝图片地址宝贝标题宝贝价格
  15. 第13章 其他重要主题
  16. vue 路由独享守卫
  17. 2.8 将一个整型变量的值赋给一个布尔型变量,再将这个布尔型变量的值赋给一个整型变量,得到的值是多少?
  18. 伯克利计算机科学录取率,加州大学伯克利分校计算机科学
  19. Solr 之 Linux 安装 solr-8.10.1
  20. edjpgcom生成一句话图片木马

热门文章

  1. android仿优酷菜单,Android编程实现仿优酷旋转菜单效果(附demo源码)
  2. github随时同步代码_原来用IntelliJ IDEA操作GitHub这么方便啊
  3. 解决easyExcel和poi版本冲突问题
  4. c语言处理机调度实验报告,操作系统实验处理机调度C语言实现.docx
  5. 百度地图设置显示定位服务器,百度地图后台持续定位
  6. D. Magic Breeding
  7. Python中的Monkey Patch(猴子补丁)
  8. 服务器系统事件报错4103,IIS信息服务器排错指导
  9. linux 关闭rsync服务器,linux下配置rsync服务器和实时同步
  10. MySQL访问权限管理