目录介绍

  • 8.0.0.1 反射的原理是什么?有哪些途径获取到Class对象,Class类的含义和作用是什么?什么是class类?
  • 8.0.0.2 有哪些方式可以提高反射效率?为何反射消耗性能?究竟是怎么影响的,举例说明?
  • 8.0.0.3 java反射机制提供了什么功能?发射具有暴力访问权限,如何防止反射序列化攻击单例?
  • 8.0.0.4 通过反射获得泛型的实际类型参数?反射获取构造方法,变量,方法的方法是哪些?
  • 8.0.0.5 getGenericParameterTypes 与 getParameterTypes区别?
  • 8.0.0.6 反射有什么作用和应用?反射和注解相比,为何反射消耗性能,有什么优缺点?

好消息

  • 博客笔记大汇总【15年10月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计500篇[近100万字],将会陆续发表到网上,转载请注明出处,谢谢!
  • 链接地址:https://github.com/yangchong211/YCBlogs
  • 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变!所有博客将陆续开源到GitHub!

8.0.0.1 反射的原理是什么?有哪些途径获取到Class对象,Class类的含义和作用是什么?什么是class类?

  • 反射的原理是什么?

    • 反射是为了能够动态的加载一个类,动态的调用一个方法,动态的访问一个属性等动态要求而设计的。它的出发点就在于JVM会为每个类创建一个java.lang.Class类的实例,通过该对象可以获取这个类的信息,然后通过使用java.lang.reflect包下得API以达到各种动态需求。
    • 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
  • 有哪些途径获取到Class对象,Class类的含义和作用是什么?
    • 每一个Class类的对象就代表了一种被加载进入JVM的类,它代表了该类的一种信息映射。开发者可以通过3种途径获取到Class对象。
    • 技术博客大总结
    • 第一种方式:Class的forName()方法的返回值就是Class类型,也就是动态导入类的Class对象的引用。
    • public static Class<?> forName(String className) throws ClassNotFoundException
    • 第二种方式:每个类都会有一个名称为Class的静态属性,通过它也是可以获取到Class对象的,示例代码如下:
      Class<Student> clazz = Student.class;   // 访问Student类的class属性
    • 第三种方式:Object类中有一个名为getClass的成员方法,它返回的是对象的运行时类的Class对象。因为Object类是所有类的父类,所以,所有的对象都可以使用该方法得到它运行时类的Class对象,示例代码如下:
      Student stu = new Student();
      Class<Student> clazz = stu.getClass(); // 调用Student对象的getName方法
  • 什么是class类?
    • .class文件:是由一个.java文件通过编译过程生成的.class文件。Class对象:当Java虚拟机加载一个.class文件到内存时,都会生成一个对应的Class对象,注意的是这个Class对象有且只有一个存在于内存当中。

8.0.0.2 有哪些方式可以提高反射效率?为何反射消耗性能?究竟是怎么影响的,举例说明?

  • 有哪些方式可以提高反射效率?

    • 善用API:比如,尽量不要getMethods()后再遍历筛选,而直接用getMethod(methodName)来根据方法名获取方法。
    • 技术博客大总结
    • 适当使用缓存:比如,需要多次动态创建一个类的实例的时候,有缓存的写法会比没有缓存要快很多:
    // 1. 没有缓存
    void createInstance(String className){
    return Class.forName(className).newInstance();
    } // 2. 缓存forName的结果
    void createInstance(String className){
    cachedClass = cache.get(className);
    if (cachedClass == null){
    cachedClass = Class.forName(className);
    cache.set(className, cachedClass);
    }
    return cachedClass.newInstance();
    }
  • 为何反射消耗性能?

8.0.0.3 java反射机制提供了什么功能?发射具有暴力访问权限,如何避免反射攻击?

  • java反射机制提供了什么功能?

    • 在运行时能够判断任意一个对象所属的类
    • 在运行时构造任意一个类的对象
    • 在运行时判断任意一个类所具有的成员变量和方法
    • 在运行时调用任一对象的方法技术博客大总结
    • 在运行时创建新类对象
  • 发射具有暴力访问权限,如何避免反射攻击?
  • 如何防止反射序列化攻击单例
    • 枚举单例

      public enum Singleton {
      INSTANCE {
      @Override
      protected void read() {
      System.out.println("read");
      }
      @Override
      protected void write() {
      System.out.println("write");
      }
      };
      protected abstract void read();
      protected abstract void write();
      }
    • class文件:
      public abstract class Singleton extends Enum{
      private Singleton(String s, int i){
      super(s, i);
      } protected abstract void read();
      protected abstract void write();
      public static Singleton[] values(){
      Singleton asingleton[];
      int i;
      Singleton asingleton1[];
      System.arraycopy(asingleton = ENUM$VALUES, 0, asingleton1 = new Singleton[i = asingleton.length], 0, i);
      return asingleton1;
      } public static Singleton valueOf(String s) {
      return (Singleton)Enum.valueOf(singleton/Singleton, s);
      } Singleton(String s, int i, Singleton singleton){
      this(s, i);
      } public static final Singleton INSTANCE;
      private static final Singleton ENUM$VALUES[]; static {
      INSTANCE = new Singleton("INSTANCE", 0){ protected void read(){
      System.out.println("read");
      } protected void write(){
      System.out.println("write");
      } };
      ENUM$VALUES = (new Singleton[] {
      INSTANCE
      });
      }
      }
      • 类的修饰abstract,所以没法实例化,反射也无能为力。关于线程安全的保证,其实是通过类加载机制来保证的,我们看看INSTANCE的实例化时机,是在static块中,JVM加载类的过程显然是线程安全的。对于防止反序列化生成新实例的问题还不是很明白,一般的方法我们会在该类中添加上如下方法,不过枚举中也没有显示的写明该方法。技术博客大总结
      //readResolve to prevent another instance of Singleton
      private Object readResolve(){
      return INSTANCE;
      }

8.0.0.4 通过反射获得泛型的实际类型参数?反射获取构造方法,变量,方法的方法是哪些?

  • 通过反射获得泛型的实际类型参数

    • 把泛型变量当成方法的参数,利用Method类的getGenericParameterTypes方法来获取泛型的实际类型参数
    • 例子:
      public class GenericTest {
      
          public static void main(String[] args) throws Exception {
      getParamType();
      } /*利用反射获取方法参数的实际参数类型*/
      public static void getParamType() throws NoSuchMethodException{
      Method method = GenericTest.class.getMethod("applyMap",Map.class);
      //获取方法的泛型参数的类型
      Type[] types = method.getGenericParameterTypes();
      System.out.println(types[0]);
      //参数化的类型
      ParameterizedType pType = (ParameterizedType)types[0];
      //原始类型
      System.out.println(pType.getRawType());
      //实际类型参数
      System.out.println(pType.getActualTypeArguments()[0]);
      System.out.println(pType.getActualTypeArguments()[1]);
      } /*供测试参数类型的方法*/
      public static void applyMap(Map<Integer,String> map){ } }
    • 输出结果:
      java.util.Map<java.lang.Integer, java.lang.String>
      interface java.util.Map
      class java.lang.Integer
      class java.lang.String
  • 反射获取构造方法,变量,方法的方法是哪些?技术博客大总结
    • 在反射包中,我们常用的类主要有Constructor类表示的是Class 对象所表示的类的构造方法,利用它可以在运行时动态创建对象、Field表示Class对象所表示的类的成员变量,通过它可以在运行时动态修改成员变量的属性值(包含private)、Method表示Class对象所表示的类的成员方法,通过它可以动态调用对象的方法(包含private)。

8.0.0.5 getGenericParameterTypes 与 getParameterTypes区别?

  • getGenericParameterTypes 与 getParameterTypes区别?

    • getGenericParameterTypes 与 getParameterTypes 都是获取构成函数的参数类型
    • 前者返回的是Type类型,后者返回的是Class类型,由于Type顶级接口,Class也实现了该接口,因此Class类是Type的子类,Type 表示的全部类型而每个Class对象表示一个具体类型的实例,如String.class仅代表String类型。由此看来Type与 Class 表示类型几乎是相同的,只不过Type表示的范围比Class要广得多而已。当然Type还有其他子类,如:
      • TypeVariable:表示类型参数,可以有上界,比如:T extends Number
      • ParameterizedType:表示参数化的类型,有原始类型和具体的类型参数,比如:List<String>
      • WildcardType:表示通配符类型,比如:?, ? extends Number, ? super Integer

8.0.0.6 反射有什么作用和应用?反射和注解相比,为何反射消耗性能,有什么优缺点?

  • 反射有什么作用和应用?

    • 含义:在运行状态中,对于任意一个类都能知道它的所有属性和方法,对于任何一个对象都能够调用它的任何一个方法和属性。
    • 功能:动态性,体现在:在运行时判断任意一个类所具有的属性和方法; 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时调用任意一个对象的方法;生成动态代理
  • 为何反射消耗性能
  • 有什么优缺点
    • 优点

      • 动态编译:运行时确定类型,绑定对象。动态编译最大限度的发挥了java的灵活性,体现了多态的应用,有利于降低类之间的耦合性。
      • 反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在开发中。它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。

其他介绍

01.关于博客汇总链接

02.关于我的博客

08.Java反射问题的更多相关文章

  1. java 反射的应用 以及通过反射 用到的工厂模式

    java反射详解 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案 ...

  2. Java反射实战

    一.背景 最近的项目中需要使用到Java 反射的知识,以前不怎么了解,也基本没怎么用过,抽出一片时间,来具体学习和实战下Java的反射!拿来和大家分享以及记录方便以后学习! 二.反射相关概念解析 1. ...

  3. Java 反射练习

    已同步更新至个人blog:http://dxjia.cn/2015/08/java-reflect/ 引用baidubaike上对JAVA反射的说明,如下:JAVA反射机制是在运行状态中,对于任意一个 ...

  4. java反射机制(工厂模式)

    http://www.phpddt.com/dhtml/338.html java里面没有typeof,js有. 我终于实现了用反射机制编写的工厂模式.java反射在工厂模式可以体现. 包含产品接口类 ...

  5. java反射 实例

    首先介绍几个概念: 1.Java反射的概念 反射含义:可以获取正在运行的Java对象. 2.Java反射的功能 1)可以判断运行时对象所属的类 2)可以判断运行时对象所具有的成员变量和方法 3)通过反 ...

  6. Java 反射之动态代理

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt205 利用Java反射机制你可以在运行期动态的创建接口的实现.java.la ...

  7. Java反射 : Declared的作用 ( 例如 : getMethods和getDeclaredMethods )

    import com.tangcheng.learning.service.lock.annotation.KeyParam; import lombok.Data; import lombok.Eq ...

  8. java反射(2)+Class.forName( )

    在上一篇文章中说说java反射(1)我们已经了解了反射的基本概念以及它的原理,但是我们知道反射只能能用它来做些什么呢? 其实在我们很多已经很熟的框架中都有它的身影,例如Hibernate框架中的关联映 ...

  9. Java知识总结:Java反射机制(用实例理解)

    概念理解: 反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来 实现对自己行为的描述( self-representation )和检测( examination) ,并能 ...

  10. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

随机推荐

  1. Linux shell的while循环

    while循环 #!/bin/bash #其中":"表示while循环的条件永远为真的意思 while : do read -p "Enter a number [1-5 ...

  2. CF1878C Vasilije in Cacak 题解

    题目传送门 简化题意 有 \(t\) 组询问,每次询问是否能从 \(1 \sim n\) 中选择 \(k\) 个数使得它们的和为 \(x\). 解法 考虑临界情况,从 \(1 \sim n\) 中选择 ...

  3. JS 疫情宅在家,学习不能停,七千字长文助你彻底弄懂原型与原型链,武汉加油!!中国加油!!(破音)

    壹 ❀ 引 原型与原型链属于老生常谈的问题,也是面试高频问题,但对于很多前端开发者来说,组织语言去解释清楚是较为困难的事情,并不是原型有多难,稍微了解的同学都知道原型这一块涉及太多知识.比如我们可以灵 ...

  4. NC16466 [NOIP2015]信息传递

    题目链接 题目 题目描述 有 n 个同学(编号为 1 到 n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为Ti的同学. 游戏开始时, ...

  5. NVME(学习笔记八)—Asymmetric Namespace Report

    8.20 非对称namespace访问报告 8.20.1 非对称namespace访问报告概况 非对称Namespace访问(ANA)在如下场景下产生,基于访问这个namespace的controll ...

  6. SpringCloud 注册中心Consul实战

    介绍 Consul是HashiCorp公司推出的开源工具,Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色.轻量级的特点.Consul是分布式的.高可用的. 可 ...

  7. Java集合框架学习(一)介绍

    介绍 Java集合框架是一组接口和类的集合,它使得存储和处理数据更加有效率. 该框架有一些类,有很多函数使得程序员更加容易的处理集合类型数据. 后面的教程就是针对这些常用类展开,配合例子代码来给大家一 ...

  8. 《系列一》-- 5、xml配置文件解析之[自定义]命名空间[标签]的解析

    阅读之前要注意的东西:本文就是主打流水账式的源码阅读,主导的是一个参考,主要内容需要看官自己去源码中验证.全系列文章基于 spring 源码 5.x 版本. Spring源码阅读系列--全局目录.md ...

  9. 【Azure Key Vault】是否有直接方法将Azure Key Vault中的机密名称/机密值到处成文件呢?

    问题描述 是否有直接方法将Azure Key Vault中的机密名称/机密值导出,保存为一个文件呢? 问题解答 Azure Key Vault 没有直接提供Secret 导出文件(如xlsx格式)的方 ...

  10. 【Azure 应用服务】Azure Function HTTP Trigger 遇见奇妙的500 Internal Server Error: Failed to forward request to http://169.254.130.x

    问题描述 使用 Azure Funciton App,在本地运行完全成功的Python代码,发布到Azure Function就出现了500  Internal Server Error. 而且错误消 ...