Java反射机制实在运行状态时,对于任意一个类,都能够知道这个类的属性和方法,对于任意一个对象,都能够调用他的任意一个属性和方法

获取Class对象的三种方式

  • Object类中的getClass()方法

    想要用这种方式,必须要明确具体的类,并创建对象
Person p = new Person();
Class clazz = p.getClass();
  • 任何数据类型都具备一个静态的属性.class来获取其对应的Class对象

    相对简单,但是还是要明确用到类中的静态成员
Class clazz = Person.class;
  • 通过给定的类的字符串名称就获取该类,该方法就是forName
String className = "com.abc.Person"; //此处为class的全称
Class clazz = Class.forName(className);

获取构造函数

  • 无参构造函数
String name = "com.abc.Person";
Class clazz = Class.forName(name);
Object obj = clazz.newInstance();
  • 有参构造函数

    获取到该构造函数:getConstructor(paramterTypes);
String name = "com.abc.Person";
Class clazz = Class.forName(name);
Constructor constructor = clazz.getConstructor(String.class, int.class);
Object obj = constructor.newInstance("test", 10);

获取字段

公有

Class clazz = Class.forName("com.abc.Person");
Field field = clazz.getField("age"); //只能获取公有的
Object o = field.get(obj);
System.out.println(o);

私有

Class clazz = Class.forName("com.abc.Person");
Field field = clazz.getDeclaredField("age"); //只获取本类,但包含私有
//对私有字段的访问取消权限检查,暴力访问
field.setAccessible(true);
Object obj = clazz.newInstance();
field.set(obj, 20);
Object o = field.get(obj);
System.out.println(o);

获取方法

  • 获取所有方法
Class clazz = Class.forName("com.abc.Person");
Method[] methods = clazz.getMethods(); //获取的都是公有的方法。
//methods = clazz.getDeclaredMethods(); //只获取本类中所有方法,包含私有
for(Method method : methods){
System.out.println(method);
}
  • 调用无参方法
Class clazz = Class.forName("com.abc.Person");
Method method = clazz.getMethod("show", null); //获取空参数一般方法。
//Object obj = clazz.newInstance();
Constructor constructor = clazz.getConstructor(String.class, int.class);
Object obj = constructor.newInstance("name", 10);
method.invoke(obj, null);
  • 调用有参方法
Class clazz = Class.forName("com.abc.Person");
Method method = clazz.getMethod("show", String.class, int.class);
Object obj = clazz.newInstance();
method.invoke(obj, "name", 20);

Java学习笔记-反射机制的更多相关文章

  1. JAVA 学习笔记 - 反射机制

    1.   JAVA反射机制的概念 2. 怎样实例化一个 Class对象 Class.forName(包名.类名); 对象.getClass(); 类.class; ================== ...

  2. java学习之反射机制

    java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ...

  3. 0032 Java学习笔记-类加载机制-初步

    JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...

  4. java学习--Reflection反射机制

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...

  5. Java学习:反射机制简介

    反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为ja ...

  6. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

  7. Java学习笔记--反射

    什么是Java反射 概念 java反射是指java能够在运行时确定类的类型信息,包括其方法.字段.构造函数等,并能够通过反射调用类或者类对象的方法.在Java中,java.lang.Class类与ja ...

  8. Java 学习之反射机制“解刨”分解类,并获取内容!

    正常情况下,单纯的做开发是接触不到反射机制的(额,当然并不排除例外的情况了).下面我就对我学到的反射方面的知识做一个小小的总结,旨在复习和以后的查看. 原理分析: 所谓反射就是将一个类当做我们研究的对 ...

  9. Java学习笔记--反射API

    反射API 1.反射API的介绍 通过反射API可以获取Java程序在运行时刻的内部结构.比如Java类中包含的构造方法.域和方法等元素,并可以与这些元素进行交换.     按照 一般地面向对象的设计 ...

随机推荐

  1. xftp传输文件失败

    迁移yii项目的时候,需要手动传输runtime文件夹.但是发现总是传输失败,后来得知是因为xftp必须是root用户才能传输成功. 或者把传输的目标文件夹权限修改为777. 修改目标文件夹的属主和属 ...

  2. luogu 1373 小a和uim之大逃离 dp

    有取模操作,所以直接维护模意义下的差即可. Code: #include <bits/stdc++.h> #define M 16 #define N 801 #define ll lon ...

  3. BZOJ 2834: 回家的路 Dijkstra

    按照横,竖为方向跑一个最短路即可,算是水题~ #include <bits/stdc++.h> #define N 200005 #define E 2000000 #define set ...

  4. Python基础面试题整理

    基础 Python中lambda是什么意思 Python中的pass是什么意思 作为解释型语言,Python如何运行 什么是Python的单元测试 在Python中unittest是什么 如何将数字转 ...

  5. Python实用黑科技——以某个字段进行分组

    需求: 当前有个字典实例,你想以某个字段比如”日期”对整个字典里面的元素进行分组. 方法: itertools.groupby()函数是专门用来干这个活的.请看下面这个例子,这里有一个列表构成的字典, ...

  6. shell基础之一

    Shell脚本自动化管理系统的必备基础: vim编辑器的熟练使用,SSH终端及“.vimrc”的设置等等需要熟悉. 命令基础:Linux的150个常用命令的熟练使用 Linux的正则表达式以及三剑客( ...

  7. ios真机调试教程(不上架App Store安装到手机)

    原文 不上架App Store安装到手机调试测试,需要用到ios真机调试证书打包的ipa才能安装到非越狱的手机使用. 2017年最新整理的ios真机调试的详细图文步骤流程,轻松的把你开发的ios ap ...

  8. 记录学习Linux过程

    第一步fdisk-l 出错 Permission denied? ubuntu@VM-0-6-ubuntu:~$ fdisk -l fdisk: cannot open /dev/vda: Permi ...

  9. OpenCL Workshop 1 —— 数字音频滤波

    Introduction 这两年深度学习大火,Cuda跟着吃红利,OpenCL发展也很快.虽然OpenCL不是事实上的标准,但是作为开放标准,适应性是很强的,除了显卡之外,CPU/FPGA上都可以执行 ...

  10. Mysql 逗号分隔行列转换总结

    方法一 存储过程实现: -- 修改结束符,防止在mysql命令行中默认分号直接运行 delimiter $$ -- 创建一个计算拆分后字符串的个数函数 drop function if exists ...