Java 反射(Reflect)详解

目录
  • 一 首先我们的去知道什么是反射?
  • 二(刨根问底)知道是什么还需要知道什么“成分”组成反射?
    • 2.1 Class 对象的获取及使用
    • 2.2 拿到碗筷就得去盛饭,拿到了Class就得去操作,获得属性
    • 2.3 吃饱饭,我还想学做饭,找到Class,但是我想去获取Class对象的实例。
    • 2.4 调用Class的实例对象的方法
    • 2.5 修改类的私有属性,由于是私有属性,所以需要去关闭程序的安全监测。
  • 三反射的性能
    • 3 .1 走了不同的路,就得比较不同路的对比(性能对比);
  • 四反射的的优缺点
    • 4.1反射的优点
    • 4.2反射的缺点
  • 五 反射的使用场合
  • 总结

一 首先我们的去知道什么是反射?

加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象 ,一个类只有一个Class对象,这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,通过这个镜子可以看到类的结构,所以我们形象的称为:反射 ,或者说动态(运行时)获取类信息和调用类方法

二(刨根问底)知道是什么还需要知道什么“成分”组成反射?

想要去实现反射想要借助一些类分别是 class,Constructor,Field,Method;

2.1 Class 对象的获取及使用

吃饭的先拿碗筷,反射就得先找先找 Class

找Class的有三种方式

1实例化对象获取该实例的 Class 对象

Person person = new Student();

Class s=person.getClass();

2通过类的全限定名获取该类的 Class 对象

Class s1 =Class.forName(“com.ma.reflect.Student”);

3通过类名.class

Class S2=Student.class;

2.2 拿到碗筷就得去盛饭,拿到了Class就得去操作,获得属性

代码案例

package com.ma.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class reflectTest6  {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
        //反射
        Class c=Class.forName("com.ma.reflect.User");
        System.out.println("获得包+类"+c.getName());//获得包+类
        System.out.println("获得类名"+c.getSimpleName());//获得类名
        //获得类的属性
        System.out.println("-------------------------");
        Field[]   fields=c.getFields();//的到public类
        for (Field field : fields) {
            System.out.println("获得类的Public 属性"+field); }
        System.out.println("-------------------------");
        //获得全部的类属性
        Field[] f1=c.getDeclaredFields();
        for (Field field : f1) {
            System.out.println("获得类的全部属性"+field); }
        System.out.println("-------------------------");
        //获得指定属性的值
        Field name=c.getDeclaredField("age");
        System.out.println("获得指定了属性的类型"+name);
        System.out.println("-------------------------");
        //获得指定方法的值
        Method[] methods=c.getMethods();
        System.out.println("获得所有的public方法");
        for (Method method : methods) {
            System.out.println("public类有"+method); }
        Method[] methods1=c.getDeclaredMethods();
        System.out.println("获得所有的public方法");
        for (Method method : methods1) {
            System.out.println("所有的方法="+method);
        }
        System.out.println("-------------------------");
       System.out.println("获得所有的public构造器");
        Constructor[] constructors=c.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println("public的构造器"+constructor);
        }
        System.out.println("获得所有的构造器");
        Constructor[] constructors1=c.getDeclaredConstructors();
        for (Constructor constructor : constructors1) {
            System.out.println("所有的构造器"+constructor);
        }
    }
}

2.3 吃饱饭,我还想学做饭,找到Class,但是我想去获取Class对象的实例。

Class user=Class.forName("com.ma.reflect.User");//获得Class对象
//构造对象
User user1=(User) user.newInstance();//无参方法
System.out.println(user1);
//通过构造器 创建有参方法
Constructor constructor=user.getDeclaredConstructor(String.class,int.class,int.class);
User user2= (User) constructor.newInstance("myt",28,213);
System.out.println(user2);

2.4 调用Class的实例对象的方法

Class user=Class.forName("com.ma.reflect.User");//获得Class对象
User user3=(User) user.newInstance();
//通反射去获取一个方法
Method setName=user.getDeclaredMethod("setName", String.class);
//invoke激活 (对象,参数)
setName.invoke(user3,"myt");
System.out.println(user3.getName());

2.5 修改类的私有属性,由于是私有属性,所以需要去关闭程序的安全监测。

//通过反射去调用方法

User user4=(User) user.newInstance();
Field name=user.getDeclaredField("name");//得到属性
//***修改权限 去实现对私有属性的修改 通过关闭程序的安全监测
name.setAccessible(true);
name.set(user4,"tym"); //private的属性无法直接去调用并且修改
System.out.println(user4.getName());

三反射的性能

3 .1 走了不同的路,就得比较不同路的对比(性能对比);

普通方法、反射、关闭安全检测的反射

public class reflectTest8 {
    //普通方法调用
    public  static  void   test(){
        User user=new User();
        Long startTime=System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            user.getName();
        }
        Long endTime=System.currentTimeMillis();
        System.out.println("普通方法"+(endTime-startTime)+"ms");
    }
    //反射方法调用
    public static  void   test1() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        User user=new User();
        Class c=Class.forName("com.ma.reflect.User");
        Method getName=c.getDeclaredMethod("getName",null);
        Long startTime=System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
              getName.invoke(user,null);
        }
        Long endTime=System.currentTimeMillis();
        System.out.println("反射方法"+(endTime-startTime)+"ms");
    }
    //反射方法 关闭检测调用
    public static   void   test2() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        User user=new User();
        Class c=Class.forName("com.ma.reflect.User");
        Method getName=c.getDeclaredMethod("getName",null);
        getName.setAccessible(true);
        Long startTime=System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            getName.invoke(user,null);
        }
        Long endTime=System.currentTimeMillis();
        System.out.println("反射方法 关闭检测"+(endTime-startTime)+"ms");
    }
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        test();
        test1();
        test2();
    }
}

四反射的的优缺点

4.1反射的优点

反射提高了Java程序的灵活性和扩展性,降低耦合性,提高自适应能力。它允许程序创建和控制任何类的对象,无需提前硬编码目标类

4.2反射的缺点

因为是JVM操作,所以对于性能来说会有所下降。
容易对程序源码造成一定的混乱。

五 反射的使用场合

在编译时根本无法知道该对象或类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java反射 PropertyDescriptor类案例详解

    JAVA中反射机制(JavaBean的内省与BeanUtils库) 内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则.如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为"值对象"(Value Object),或"VO".方法比较少.这些信息储存在类的私有变量中,通过set(

  • 详解Java反射创建对象

    一.什么是反射 Java Reflaction in Action中的解释:反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变.通俗的讲就是反射可以在运行时根据指定的类名获得类的信息 个人理解:就是我们对于创建对象我们除了通过 new关键字创建外,还能通过什么创建呢?private的属属性真的不能获取吗?反射就能做到打破这些所谓的规则反射和new创建对象谁的效率高? new 二.通过类对象调用newInstance()方法,适用于无参构造方法 2.1 类名.class p

  • Java中的反射机制基本运用详解

    目录 Java中的反射机制基本运用 1.什么是反射(reflect) 2.反射机制提供的功能 3.反射->获取类对象 4.反射->利用无参构造实例化对象 5.反射->利用有参构造实例化对象 6.反射->调用无参方法 7.反射->调用有参方法 8.反射->访问私有方法 9.反射->类加载路径 总结 Java中的反射机制基本运用 看完反射可以了解一下注解 注解annotation://www.jb51.net/article/221276.htm 1.什么是反射(re

  • Java反射机制基础详解

    目录 1.什么是Java反射机制? 2.反射机制原理 3.Class类介绍 3.1.Class类基本介绍 3.2.Class类对象的获取方法 Class.forname() 3.3 .可以获取Class对象的类型 4.java反射的作用? 5.反射API主要类 6.Java反射的优缺点 7.反射调用的优化方法 8.反射的基本使用例子 9.反射开放权限操作 总结 1.什么是Java反射机制? 在程序运行中动态地获取类的相关属性,同时调用对象的方法和获取属性,这种机制被称之为Java反射机制 下面给

  • 详解Java中的反射机制和动态代理

    一.反射概述 反射机制指的是Java在运行时候有一种自观的能力,能够了解自身的情况为下一步做准备,其想表达的意思就是:在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制.通俗点讲,通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以,这是一种动态获取类的信息以及动态调用对象方法的能力. 想要使用反射机制,就必须要先获取到该类

  • java反射机制最详解

    目录 java反射机制 什么是反射? 反射的功能: 反射常用类: 1.Class枚举类 2.Constructor构造器 3.Method方法类 4.Field变量类 反射运行指示图 通过反射获取对象 总结 java反射机制 什么是反射? 在java开发中有一个非常重要的概念就是java反射机制,也是java的重要特征之一.反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力,通过反射可以调用私有方法和私有属性,大部分框架也都是运用反射原理的

  • Java反射(JDK)与动态代理(CGLIB)详解

    目录 一.反射 二.动态代理 1.JDK代理 2.CGLIB代理 3.JDK代理与CGLIB代理对比 总结 一.反射 概念:在运行状态中,对于任意的一个类,都能够知道这个类的所有字段和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法 实现方法:JVM在第一次加载某个类时会生成一个Class对象,里面记录了这个类的信息 链接:类加载机制(留坑) 二.动态代理 动态代理的作用:在不改变原代码的基础上增加新的功能,如日志.权限检验等 反射在动态代理中的应用:由于知道原类的字段.方法等信息,才

  • Java 反射(Reflect)详解

    目录 一 首先我们的去知道什么是反射? 二(刨根问底)知道是什么还需要知道什么"成分"组成反射? 2.1 Class 对象的获取及使用 2.2 拿到碗筷就得去盛饭,拿到了Class就得去操作,获得属性 2.3 吃饱饭,我还想学做饭,找到Class,但是我想去获取Class对象的实例. 2.4 调用Class的实例对象的方法 2.5 修改类的私有属性,由于是私有属性,所以需要去关闭程序的安全监测. 三反射的性能 3 .1 走了不同的路,就得比较不同路的对比(性能对比): 四反射的的优缺点

  • Java 反射机制详解及实例

    Java 反射机制详解及实例 反射,当时经常听他们说,自己也看过一些资料,也可能在设计模式中使用过,但是感觉对它没有一个较深入的了解,这次重新学习了一下,感觉还行吧!            一,先看一下反射的概念: 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射是Java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高

  • Java反射技术详解及实例解析

    前言 相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解APT替代了,java反射有个开源框架jOOR相信很多人都用过,不过我们还是要学习反射的基础语法,这样才能自己写出优秀的框架,当然这里所讲的反射技术,是学习Android插件化技术.Hook技术等必不可少的! 一.基本反射技术   1.1 根据一个字符串得到一个类 getClass方法 String nam

  • Java 反射机制详解及实例代码

    Java反射详解 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案例1]通过一个对象获得完整的包名和类名 package Reflect; /** * 通过一个对象获得完整的包名和类名 * */ class Demo{ //other codes... } class hello{ public static void main(String[] args) {

  • Java反射机制详解

    本文较为详细的分析了Java反射机制.分享给大家供大家参考,具体如下: 一.预先需要掌握的知识(java虚拟机) java虚拟机的方法区: java虚拟机有一个运行时数据区,这个数据区又被分为方法区,堆区和栈区,我们这里需要了解的主要是方法区.方法区的主要作用是存储被装载的类 的类型信息,当java虚拟机装载某个类型的时候,需要类装载器定位相应的class文件,然后将其读入到java虚拟机中,紧接着虚拟机提取class 中的类型信息,将这些信息存储到方法区中.这些信息主要包括: 1.这个类型的全

  • Java反射机制详解_动力节点Java学院整理

    一.先看一下反射的概念: 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射是Java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高! 看概念很晕的,继续往下看. 二.反射机制的作用: 1.反编译:.class-->.java 2.通过反射机制访问java对象的属性,方法,构造方法等: 这样好像更容易理解一些,下边我们具

  • Java反射技术详解

    目录 前言 一.基本反射技术 1.1 根据一个字符串得到一个类 getClass方法 Class.forName Type属性 二.获取类的成员 获取类中特定的构造方法 调用构造方法 调用类的私有方法 获取类的私有字段并修改值 总结 前言 相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解APT替代了,java反射有个开源框架jOOR相信很多人都用过,不过我们还

  • Java中的反射机制详解

    Java中的反射机制详解 反射,当时经常听他们说,自己也看过一些资料,也可能在设计模式中使用过,但是感觉对它没有一个较深入的了解,这次重新学习了一下,感觉还行吧! 一,先看一下反射的概念: 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射是Java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高! 看概念很晕的,继续往下

  • Java动态代理和反射机制详解

    反射机制 Java语言提供的一种基础功能,通过反射,我们可以操作这个类或对象,比如获取这个类中的方法.属性和构造方法等. 动态代理:分为JDK动态代理.cglib动态代理(spring中的动态代理). 静态代理 预先(编译期间)确定了代理者与被代理者之间的关系,也就是说,若代理类在程序运行前就已经存在了,这种情况就叫静态代理 动态代理 代理类在程序运行时创建的代理方式.也就是说,代理类并不是在Java代码中定义的,而是在运行期间根据我们在Java代码中的"指示"动态生成的. 动态代理比

  • Java 类型信息详解和反射机制介绍

    RTTI RTTI(RunTime Type Information)运行时类型信息,能够在程序运行时发现和使用类型信息,把我们从只能在编译期知晓类型信息并操作的局限中解脱出来 传统的多态机制正是 RTTI 的基本使用:假设有一个基类 Shape 和它的三个子类 Circle.Square.Triangle,现在要把 Circle.Square.Triangle 对象放入 List<Shape> 中,在运行时,先把放入其中的所有对象都当作 Object 对象来处理,再自动将类型转换为 Shap

随机推荐