先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索【程序职场】关注这个执着的职场程序员。
价值:Java技能,面试经验指导,简历优化,职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验。

01

概念

反射是Java的特征之一,是一种间接操作目标对象的机制,核心是JVM在运行的时候才动态加载类,并且对于任意一个类,都能够知道这个类的所有属性和方法,调用方法/访问属性,不需要提前在编译期知道运行的对象是谁,他允许运行中的Java程序获取类的信息,并且可以操作类或对象内部属性。

程序中对象的类型一般都是在编译期就确定下来的,而当我们的程序在运行时,可能需要动态的加载一些类,这些类因为之前用不到,所以没有加载到jvm,这时,使用Java反射机制可以在运行期动态的创建对象并调用其属性,它是在运行时根据需要才加载。

02

用途

只是知道概念还不能更明白反射到底是什么?,那么反射都在哪些用途上使用呢?我们开发中哪些情况下使用?

一般来说反射是用来做框架的,做一些抽象度比较高的底层代码。

反射是框架设计的灵魂。

反射都有哪些用途呢?

1、首先就是反编译,反编译是 .class-->.java

2、通过反射机制访问java对象的属性,方法,构造方法等

3、当我们在使用IDE,比如Ecplise时,当我们输入一个对象或者类,并想调用他的属性和方法是,一按点号,编译器就会自动列出他的属性或者方法,这里就是用到反射。

4、反射最重要的用途就是开发各种通用框架。

03

解剖类

我们知道一个类里一般有构造函数、方法、成员变量(字段/属性)。

Class对象提供了如下常用方法:

public Constructor getConstructor(Class<?>…parameterTypes)

public Method getMethod(String name,Class<?>… parameterTypes)

public Field getField(String name)

public Constructor getDeclaredConstructor(Class<?>…parameterTypes)

public Method getDeclaredMethod(String name,Class<?>… parameterTypes)

public Field getDeclaredField(String name)

这些方法分别用于帮咱们从类中解剖出构造函数、方法和成员变量(属性)。

然后把解剖出来的部分,分别用Constructor、Method、Field对象表示。

首先要明白一点,我们写的代码是存储在后缀名是 .java的文件里的,但是它会被编译,最终真正去执行的是编译后的 .class文件。

Java是面向对象的语言,一切皆对象,所以java认为 这些编译后的 class文件,这种事物也是一种对象,它也给抽象成了一种类,这个类就是Class,大家可以去AIP里看一下这个类。

大家可以查看api

04

常用类

Java.lang.Class;

Java.lang.reflect.Constructor;

Java.lang.reflect.Field;

Java.lang.reflect.Method;

Java.lang.reflect.Modifier;

05

实例

1,反射类中的方法

添加一个Person类,添加几种参数的方法。

package com.cj.test;import java.util.Date;public class Person {    public Person(){    System.out.println("默认的无参构造方法执行了");  }   public Person(String name){    System.out.println("姓名:"+name);  }    public Person(String name,int age){    System.out.println(name+"="+age);  }    private Person(int age){    System.out.println("年龄:"+age);  }    public void m1() {    System.out.println("m1");  }    public void m2(String name) {    System.out.println(name);  }    public String m3(String name,int age) {    System.out.println(name+":"+age);    return "aaa";  }    private void m4(Date d) {    System.out.println(d);  }    public static void m5() {    System.out.println("m5");  }    public static void m6(String[] strs) {    System.out.println(strs.length);  }   public static void main(String[] args) {    System.out.println("main");  }}

下面我们来看一下调用。

package com.cj.test;import java.lang.reflect.Method;import java.util.Date;import org.junit.Test; public class Test1 {   @Test//public void m1()  public void test1() throws Exception{    Class clazz = Class.forName("com.cj.test.Person");    Person p = (Person)clazz.newInstance();    Method m = clazz.getMethod("m1", null);    m.invoke(p, null);  }  @Test//public void m2(String name)  public void test2() throws Exception{    Class clazz = Person.class;    Person p = (Person) clazz.newInstance();    Method m = clazz.getMethod("m2", String.class);    m.invoke(p, "程序职场");  }  @Test//public String m3(String name,int age)  public void test3() throws Exception{    Class clazz = Person.class;    Person p = (Person) clazz.newInstance();    Method m = clazz.getMethod("m3", String.class,int.class);    String returnValue = (String)m.invoke(p, "程序职场",23);    System.out.println(returnValue);  }  @Test//private void m4(Date d)  public void test4() throws Exception{    Class clazz = Person.class;    Person p = (Person) clazz.newInstance();    Method m = clazz.getDeclaredMethod("m4", Date.class);    m.setAccessible(true);    m.invoke(p,new Date());  }  @Test//public static void m5()  public void test5() throws Exception{    Class clazz = Person.class;    Method m = clazz.getMethod("m5", null);    m.invoke(null,null);  }  @Test//private static void m6(String[] strs)  public void test6() throws Exception{    Class clazz = Person.class;    Method m = clazz.getDeclaredMethod("m6",String[].class);    m.setAccessible(true);    m.invoke(null,(Object)new String[]{"a","b"});  }  @Test  public void test7() throws Exception{    Class clazz = Person.class;    Method m = clazz.getMethod("main",String[].class);    m.invoke(null,new Object[]{new String[]{"a","b"}});  }}

2,反射类中的属性字段

package com.cj.test;import java.util.Date;public class Person {  public String name="程序职场";  private int age = 18;  public static Date time;    public int getAge() {    return age;  }    public Person(){    System.out.println("默认的无参构造方法执行了");  }   public Person(String name){    System.out.println("姓名:"+name);  }    public Person(String name,int age){    System.out.println(name+"="+age);  }    private Person(int age){    System.out.println("年龄:"+age);  }    public void m1() {    System.out.println("m1");  }    public void m2(String name) {    System.out.println(name);  }    public String m3(String name,int age) {    System.out.println(name+":"+age);    return "aaa";  }    private void m4(Date d) {    System.out.println(d);  }    public static void m5() {    System.out.println("m5");  }    public static void m6(String[] strs) {    System.out.println(strs.length);  }    public static void main(String[] args) {    System.out.println("main");  }}

结果调用。

package com.cj.test;import java.lang.reflect.Field;import java.util.Date;import org.junit.Test; public class Demo3 {  //public String name="李四";  @Test  public void test1() throws Exception{    Class clazz = Person.class;    Person p = (Person)clazz.newInstance();    Field f = clazz.getField("name");    String s = (String)f.get(p);    System.out.println(s);        //更改name的值    f.set(p, "王六");    System.out.println(p.name);  }  @Test//private int age = 18;  public void test2() throws Exception{    Class clazz = Person.class;    Person p = (Person)clazz.newInstance();    Field f = clazz.getDeclaredField("age");    f.setAccessible(true);    int age = (Integer)f.get(p);    System.out.println(age);        f.set(p, 28);    age = (Integer)f.get(p);    System.out.println(age);  }  @Test//public static Date time;  public void test3() throws Exception{    Class clazz = Person.class;    Field f = clazz.getField("time");    f.set(null, new Date());    System.out.println(Person.time);  }}

3,反射方法的其他使用--通过反射越过泛型检查

import java.lang.reflect.Method;import java.util.ArrayList;/* * 通过反射越过泛型检查 * 例如:有一个String泛型的集合,怎样能向这个集合中添加一个Integer类型的值? */public class Demo {  public static void main(String[] args) throws Exception{    ArrayList<String> strList = new ArrayList<>();    strList.add("aaa");    strList.add("bbb");      //  strList.add(100);    //获取ArrayList的Class对象,反向的调用add()方法,添加数据    Class listClass = strList.getClass(); //得到 strList 对象的字节码 对象    //获取add()方法    Method m = listClass.getMethod("add", Object.class);    //调用add()方法    m.invoke(strList, 100);        //遍历集合    for(Object obj : strList){      System.out.println(obj);    }  }}

讲了这么多,赶紧试试吧,在项目使用中更方便。

本文 Github ( 码云Gitee同步) https://github.com/ProceduralZC/JavaDevGuide/tree/master/code/JavaBasic  已收录,欢迎 star。

文末送书

文末送书时刻!送的书分别是:

Node.js企业级应用开发实战(北京大学出版社提供 3本) 

Redis设计与实现 (机械工业出版社提供 1本)

在此感谢北京大学出版社机械工业出版社的支持。

送书规矩

从留言区中选中奖者,按照留言者的点赞,分享数选择,点赞,分享数高者获得书一本,累计送书 四本。时间截止9月18日的20点。

送的书籍

Node.js企业级应用开发实战

Redis设计与实现

我是【尔东双月】一枚执着的职场程序员,微信搜索【程序职场】关注我。别忘了三连啊,点赞、收藏、留言,随意给,我不挑。
注:如果文章有任何问题,欢迎毫不留情地指正。

文末送书四本 | 这篇Java反射机制太经典!不看后悔!的更多相关文章

  1. 面试题:了解MySQL的Flush-List吗?顺便说一下脏页的落盘机制!(文末送书)

    Hi,大家好!我是白日梦! 今天我要跟你分享的MySQL话题是:"了解Flush-List吗?顺便说一下脏页的落盘机制!(文末送书)" 本文是MySQL专题的第 8 篇,共110篇 ...

  2. 冰河又一MySQL力作出版(文末送书)!!

    写在前面 继<海量数据处理与大数据技术实战>之后,冰河的又一力作<MySQL技术大全:开发.优化与运维实战>出版,相信这本书对任何想系统学习MySQL的小伙伴来说,都会带来实质 ...

  3. 菜鸟学Java(十四)——Java反射机制(一)

    说到反射,相信有过编程经验的人都不会陌生.反射机制让Java变得更加的灵活.反射机制在Java的众多特性中是非常重要的一个.下面就让我们一点一点了解它是怎么一回事. 什么是反射 在运行状态中,对于任意 ...

  4. 一文带你了解Java反射机制

    想要获取更多文章可以访问我的博客 - 代码无止境. 上周上班的时候解决一个需求,需要将一批数据导出到Excel.本来公司的中间件组已经封装好了使用POI生成Excel的工具方法,但是无奈产品的需求里面 ...

  5. Java反射机制demo(四)—获取一个类的父类和实现的接口

    Java反射机制demo(四)—获取一个类的父类和实现的接口 1,Java反射机制得到一个类的父类 使用Class类中的getSuperClass()方法能够得到一个类的父类 如果此 Class 表示 ...

  6. Java反射机制的浅显理解(这篇文章还没写好,留个草稿给自己看的)

    目前只是有一个大概的理解,先把自己感觉容易立即的概念放这里,等以后结合实际工作理解深刻了再来补充. 一.什么是Java反射机制?(多种定义) 1. JAVA反射机制是在运行状态中,对于任意一个类,都能 ...

  7. 如何高效、快速学习Flutter?如何避坑?(文末送服福利)

    稳住,今天是周末,不过我今天要上班....啊..啊... 对于 Flutter 我没有太多的发言权,不过GSY是对 Flutter 充分理解并精深掌握的前辈了,所以转一篇他对 Flutter 的一些解 ...

  8. 一文看懂 ZooKeeper ,面试再也不用背八股(文末送PDF)

    ZooKeeper知识点总结 一.ZooKeeper 的工作机制 二.ZooKeeper 中的 ZAB 协议 三.数据模型与监听器 四.ZooKeeper 的选举机制和流程 本文将以如下内容为主线讲解 ...

  9. 11.Java反射机制 哦对了,前面的序号来自随笔关于编程之路的思索第一篇

    基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于J ...

随机推荐

  1. JMeter逻辑控制器完整介绍

    JMeter逻辑控制器可以对元件的执行逻辑进行控制,就像编程一样,实现业务需求. JMeter包括了以下逻辑控制器: 一共17种.除了仅一次控制器外,其他控制器下可以嵌套别的种类的逻辑控制器. If ...

  2. [leetcode] (周赛)869. 重新排序得到 2 的幂

    869. 重新排序得到 2 的幂 枚举排列,然后验证.比较暴力. 其实好一点的做法应该反过来,先把int范围下的2的N幂算出来,然后一个一个验证给出的数能不能拼成. class Solution { ...

  3. 我眼中的WebViewJavascriptBridge(图解)

    工作中涉及到一段时间iOS开发,在开发中有个小小的框架让我非常深刻,就是WebViewJavascriptBridge,用于原生控件与前端交互通信.我觉得WebViewJavascriptBridge ...

  4. Python+Selenium - Alert弹框

    上面三种弹窗可以在浏览器的控制台做出效果,如下图 上面三种弹窗可以用alert方法处理 示例: #出现弹窗的操作xxxx# 切换al = driver.switch_to.alert# print(a ...

  5. css——圣杯布局

    圣杯布局要求 header和footer各自占领屏幕所有宽度,高度固定 中间dontainer部分为左中右三栏式布局 三栏布局中左右两侧宽度固定,中间部分自动填充 实现方式 1.浮动 先定义heade ...

  6. Redis(二) 数据类型操作指令以及对应的RedisTemplate方法

    1.Redis key值操作以及RedisTemplate对应的API 本文默认使用RedisTemplate,关于RedisTemplate和StringRedisTemplate的区别如下 Red ...

  7. TVM Pass IR如何使用

    TVM Pass IR如何使用 随着Relay / tir中优化遍数的增加,执行并手动维护其依赖关系变得很棘手.引入了一个基础结构来管理优化过程,并应用于TVM堆栈中IR的不同层. Relay / t ...

  8. ResNet网络的训练和预测

    ResNet网络的训练和预测 简介 Introduction 图像分类与CNN 图像分类 是指将图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法,是计算机视觉中其他任务,比如目标检测 ...

  9. arm,asic,dsp,fpga,mcu,soc各自的特点

    arm,asic,dsp,fpga,mcu,soc各自的特点 人工智能受到越来越多的关注,许多公司正在积极开发能实现移动端人工智能的硬件,尤其是能够结合未来的物联网应用,对于移动端人工智能硬件的实现方 ...

  10. cuDNN概述

    cuDNN概述 NVIDIACUDA深度神经网络库(cuDNN)是GPU加速的用于深度神经网络的原语库.cuDNN为标准例程提供了高度优化的实现,例如向前和向后卷积,池化,规范化和激活层. 全球的深度 ...