1. 什么是反射

反射可以动态获取类信息并创建对象、执行方法、属性赋值等,通过反射,我们就可以通过字节码文件反推得到源代码。

2.反射怎么用

2.1 在使用反射前,我们需要介绍4个类,分别是java.lang.Class、java.lang.reflect.Constructor、java.lang.reflect.Method以及java.lang.reflect.Field。因为对于一个字节码文件来说,其实就是一个类(先不考虑接口、数组等对象),一个类则主要是4部分:类信息、属性、构造器和方法。所以当我们拥有了这4个类,也就可以通过字节码来进行操作了。需要被反射的类如下所示。

class Reflect{static{System.out.println("static code seg\n");}private int no;private String name;public Reflect(){System.out.println("no param constructor\n");}public Reflect(int no){this.no = no;System.out.println("int constructor: " + no + "\n");}public Reflect(int no, String name){this.no = no;this.name = name;System.out.println("int--String constructor: " + no + name + "\n");}private void sout(){System.out.println("out");}public int testInt(int i, String s){System.out.println("testInt be invoked: " + i + " " + s);return 20;}public String testString(double i, boolean b){System.out.println("testString Be invoked");return "abc";}
}

2.2 为了反推得到源代码,我们首先要得到类,得到类的Class对象有3种方式:①Class.forName("全限定类名");②通过该类的对象调用getClass()方法;③xxx.class。

这三者完全等价,比较结果都为true,如下图。

2.3 得到类后,我们可以调用构造器创建对象。

2.4 反射属性,进行属性相关的操作

2.5 反射方法

3. 反射的优缺点

优点:①通过配置文件设定要反射的类,即可自动完成对象的实例化,然后进行相应操作,完全不需要更改java源代码,提高了程序的灵活性和拓展性。

缺点:①打破封装、私有属性会被访问;②反射机制是动态解析的,JVM无法进行代码优化。

附录:最终代码及结果

import java.lang.reflect.*;public class ReflectTest02 {public static void main(String[] args) throws Exception {// 都会进行类加载,类加载会执行静态代码块,静态代码块只执行一次Class<?> c = Class.forName("Reflect");Class<Reflect> reflectClass = Reflect.class;Reflect reflect = new Reflect();Class<? extends Reflect> aClass = reflect.getClass();// 调用无参构造器来创建对象Object obj = c.getConstructor().newInstance();// 使用StringBuilder拼接字符串,最后输出StringBuilder sb = new StringBuilder();String sm = Modifier.toString(c.getModifiers());sb.append(sm);sb.append(("".equals(sm) ? "":" ") + "class " + c.getSimpleName() + "{\n");// 得到所有属性Field[] fields = c.getDeclaredFields();for (Field f: fields) {sb.append("\t");String s = Modifier.toString(f.getModifiers());sb.append(s);sb.append("".equals(s) ? "":" ");sb.append(f.getType().getSimpleName());sb.append(" ");sb.append(f.getName());sb.append(";\n");}// 得到所有的构造器方法Constructor[] constructors = c.getDeclaredConstructors();for (Constructor constructor: constructors) {sb.append("\t");String s = Modifier.toString(constructor.getModifiers());sb.append(s);sb.append("".equals(s) ? "":" ");sb.append(c.getSimpleName() + "(");Class[] parameters = constructor.getParameterTypes();for (Class parameter:parameters) {sb.append(parameter.getSimpleName() + ", ");}if(parameters.length > 0){sb.deleteCharAt(sb.length() - 1);sb.deleteCharAt(sb.length() - 1);}sb.append("){}\n");}// 得到所有的方法Method[] methods = c.getDeclaredMethods();for (Method m: methods) {sb.append("\t");String s1 = Modifier.toString(m.getModifiers());sb.append(s1);sb.append("".equals(s1) ? "":" ");sb.append(m.getReturnType().getSimpleName() + " ");sb.append(m.getName() + "(");Class[] parameters = m.getParameterTypes();for (Class parameter:parameters) {sb.append(parameter.getSimpleName() + ", ");}if(parameters.length > 0){sb.deleteCharAt(sb.length() - 1);sb.deleteCharAt(sb.length() - 1);}sb.append("){}\n");}sb.append("}");System.out.println(sb);}
}class Reflect{static{System.out.println("static code seg\n");}private int no;private String name;public Reflect(){System.out.println("no param constructor\n");}public Reflect(int no){this.no = no;System.out.println("int constructor: " + no + "\n");}public Reflect(int no, String name){this.no = no;this.name = name;System.out.println("int--String constructor: " + no + name + "\n");}private void sout(){System.out.println("out");}public int testInt(int i, String s){System.out.println("testInt be invoked: " + i + " " + s);return 20;}public String testString(double i, boolean b){System.out.println("testString be invoked");return "abc";}
}

轻轻松松明白什么是反射,反射有什么用,简单上手反射以及反射的优缺点相关推荐

  1. java反射机制的原理与简单使用

    一. 原理 简单的来说,反射机制其实就是指程序在运行的时候能够获取自身的信息.如果知道一个类的名称/或者它的一个实例对象, 就能把这个类的所有方法和变量的信息(方法名,变量名,方法,修饰符,类型,方法 ...

  2. java基础反射知识总结_非常好的Java基础反射总结

    前言疯狂复习基础ing- 最近复习的Jv基础反射做了应该总结,果然反射不只有那么一点点东西,多的是精髓! 最重要的是最后推荐的那两篇文章,写的非常非常好!!反射 1.反射的原理Jv反射机制就是在运行状 ...

  3. Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?

    ava Java 基础这部分一些简单的问题就直接没有放上来. 需要资料的朋友麻烦一键三连之后点此免费获取! 基础: Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)? 谈谈对 ...

  4. java 分析类_java--分析简单java类与反射的联系

    分析简单java类与反射的联系 web对反射的操作支持 在JSP之中有一种技术--javaBean.而且在jsp里面也配套有相应的操作方式,javaBean的核心在于简单java类,于是下面演示此操作 ...

  5. Java的反射机制,内含超简单实例代码(搞懂反射,这一篇就够了)

    一 首先来说说反射机制的概念: 程序在运行时, 对于类来说,可以知道该类的任意属性和方法: 对于对象来说,可以调用该对象的任意方法和属性: 就以上这种动态获取信息的机制就称为Java的反射机制 彻底了 ...

  6. 【JavaLearn】(19)反射、Class类、使用反射创建对象-操作属性-执行方法、泛型与反射、反射案例

    目录 1. 反射 1.1 反射引入 1.2 反射的入口-Class类 2. 认识 Class 类 3. 使用反射创建对象 4. 使用反射操作属性 5. 使用反射执行方法 6. 使用反射操作泛型 6.2 ...

  7. 【JavaLearn】#(19)反射、Class类、使用反射创建对象-操作属性-执行方法、泛型与反射、反射案例

    1. 反射 1.1 反射引入 编译时,知道类或对象的具体信息,此时直接对类和对象进行操作即可 编译时不知道类或对象的具体信息,只有运行时知道,需要使用反射来实现 ==> 比如驱动的类的名称放在 ...

  8. 什么叫做类的类?如何获取私有的方法?Java反射机制太强大了,详解Java反射机制【Java养成】

    Java学习打卡:第二十二天 内容导航 Java学习打卡:第二十二天 内容管理 Java反射机制 问题引入---数据库介绍 Java反射的介绍 class的使用 由字符串产生类和对象 获取一个类的所有 ...

  9. 【错误记录】反射时调用方法及成员报错 ( 执行反射方法 | 设置反射的成员变量 | 设置方法/成员可见性 )

    文章目录 一.报错信息 二.解决方案 一.报错信息 在执行反射方法时 , 反射方法后 , 直接调用该方法 ; // 获取 View 的 getListenerInfo 方法 Method getLis ...

最新文章

  1. 一键解锁解题秘籍,从向作者提问开始
  2. 重磅,武汉大学获捐10亿元!
  3. SQL点滴1—SET QUOTED_IDENTIFIER OFF语句的作用
  4. 位运算实现用户留存率
  5. 【数据结构与算法】之深入解析“H指数II”的求解思路与算法示例
  6. Oracle要对Java收费了,SAP基于Java技术栈的那些产品的客户怎么办
  7. Kafka中副本机制的设计和原理
  8. python爬虫数据分析系统_2小时精通python爬虫技术 带你打造Bug系统数据抽取及统计分析...
  9. JS将Date加八小时
  10. json.dumps与json.dump的区别 json.loads与json.load的区别(简洁易懂)
  11. jni ndk_带有NDK的Android JNI应用程序
  12. Android 文件存放路径
  13. 工作上不要遮掩,如实回答,什么样的借口可以接受
  14. 从开发人员如何走向架构师
  15. win10 html字体设置,IT之家学院:如何解决Win10屏幕字体缩放模糊问题
  16. 虚拟贝司拓展音源-Toontrack Acoustic EBX
  17. 双十一要不要提前收货
  18. 正态分布离群值检验——偏度与峰度方法
  19. linux服务器安装mysql步骤详解
  20. Linux替换jar包中内容

热门文章

  1. Oracle数据库查看用户状态
  2. sap与外部系统的接口怎么实现
  3. 电子商务平台支付接口开发原理及流程
  4. 财经法规税收征收管理法律制度练习题三
  5. 项目中涉及到的BAPI
  6. SAP中程序间的相互调用,SUBMIT关键字的用法
  7. mysql/event.myd no fond_mysql Last_Error: Error 'File './sales.MYD' not found (Errcode: 24)
  8. html列表无序嵌套,HTML/CSS - 如何正确定位这些嵌套的无序列表?
  9. Python基础教程:repr()与str() 的区别
  10. python赋值方式