精华内容
下载资源
问答
  • 在JDK中,主要由以下类来实现 Java 反射机制,除了 Class 类,一般位于 java.lang.reflect 包中 java.lang.Class :一个类 java.lang.reflect.Field :类的成员变量(属性) java.lang.reflect.Method :类的成员...

    在JDK中,主要由以下类来实现 Java 反射机制,除了 Class 类,一般位于 java.lang.reflect 包中

    • java.lang.Class :一个类
    • java.lang.reflect.Field :类的成员变量(属性)
    • java.lang.reflect.Method :类的成员方法
    • java.lang.reflect.Constructor :类的构造方法
    • java.lang.reflect.Array :提供了静态方法动态创建数组,访问数组的元素

     


    【Java面试题与答案】整理推荐

     

    展开全文
  • 学习使用框架并不需要了解反射,但是如果想要自己写一个框架,那么就需要对反射机制很深入的了解。 1.2 什么是反射机制?   在程序运行状态中,对于任意一个类或对象,能够获取到这个类的所有属性和方法(包括...
  • 主要介绍了Java 反射反射的应用场景的相关资料,帮助大家更好的理解和学习Java反射的相关知识,感兴趣的朋友可以了解下
  • JAVA 反射机制是在运行状态中,对于任意一个类,能够知道这个类的所有属性和方法;对于任意一个对象,能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射...

    反射机制介绍

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

    获取 Class 对象的两种方式

    如果我们动态获取到这些信息,我们需要依靠 Class 对象。Class 类对象将一个类的方法、变量等信息告诉运行的程序。Java 提供了两种方式获取 Class 对象:

    1.知道具体类的情况下可以使用:

    Class alunbarClass = TargetObject.class;
    

    但是我们一般是不知道具体类的,基本都是通过遍历包下面的类来获取 Class 对象

    2.通过 Class.forName()传入类的路径获取:

    Class alunbarClass1 = Class.forName("cn.javaguide.TargetObject");
    

    代码实例

    简单用代码演示一下反射的一些操作!

    1.创建一个我们要使用反射操作的类 TargetObject

    package cn.javaguide;
    
    public class TargetObject {
        private String value;
    
        public TargetObject() {
            value = "JavaGuide";
        }
    
        public void publicMethod(String s) {
            System.out.println("I love " + s);
        }
    
        private void privateMethod() {
            System.out.println("value is " + value);
        }
    }
    

    2.使用反射操作这个类的方法以及参数

    package cn.javaguide;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class Main {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException {
            /**
             * 获取TargetObject类的Class对象并且创建TargetObject类实例
             */
            Class<?> tagetClass = Class.forName("cn.javaguide.TargetObject");
            TargetObject targetObject = (TargetObject) tagetClass.newInstance();
            /**
             * 获取所有类中所有定义的方法
             */
            Method[] methods = tagetClass.getDeclaredMethods();
            for (Method method : methods) {
                System.out.println(method.getName());
            }
            /**
             * 获取指定方法并调用
             */
            Method publicMethod = tagetClass.getDeclaredMethod("publicMethod",
                    String.class);
    
            publicMethod.invoke(targetObject, "JavaGuide");
            /**
             * 获取指定参数并对参数进行修改
             */
            Field field = tagetClass.getDeclaredField("value");
            //为了对类中的参数进行修改我们取消安全检查
            field.setAccessible(true);
            field.set(targetObject, "JavaGuide");
            /**
             * 调用 private 方法
             */
            Method privateMethod = tagetClass.getDeclaredMethod("privateMethod");
            //为了调用private方法我们取消安全检查
            privateMethod.setAccessible(true);
            privateMethod.invoke(targetObject);
        }
    }
    
    

    输出内容:

    publicMethod
    privateMethod
    I love JavaGuide
    value is JavaGuide
    

    静态编译和动态编译

    • **静态编译:**在编译时确定类型,绑定对象
    • **动态编译:**运行时确定类型,绑定对象

    反射机制优缺点

    • 优点: 运行期类型的判断,动态加载类,提高代码灵活度。
    • 缺点: 1,性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的 java 代码要慢很多。2,安全问题,让我们可以动态操作改变类的属性同时也增加了类的安全隐患。

    反射的应用场景

    反射是框架设计的灵魂。

    在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的 Spring/Hibernate 等框架也大量使用到了反射机制。

    举例:

    1. 我们在使用 JDBC 连接数据库时使用 Class.forName()通过反射加载数据库的驱动程序;
    2. Spring 框架的 IOC(动态加载管理 Bean)创建对象以及 AOP(动态代理)功能都和反射有联系;
    3. 动态配置实例的属性;

    推荐阅读:

    展开全文
  • 本文记叙前两篇的内容,主要讲PCB设计中关于反射的那些事儿(3) 路的反射和场的反射
  • JAVA反射

    2019-09-19 17:24:31
    JAVA反射1 动态语言2 反射机制概念(运行状态中知道类所有的属性和方法)3 反射的应用场合3.1 编译时类型和运行时类型3.2 编译时类型无法获取具体方法4 Java 反射 API5 反射使用步骤(获取 Class 对象、调用对象方法...

    1 动态语言

    动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化。比如常见的 JavaScript 就是动态语言,除此之外 Ruby,Python 等也属于动态语言,而 C、C++则不属于动态语言。从反射角度说 JAVA 属于半动态语言。
    在这里插入图片描述

    2 反射机制概念(运行状态中知道类所有的属性和方法)

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

    3 反射的应用场合

    3.1 编译时类型和运行时类型

    在 Java 程序中许多对象在运行是都会出现两种类型:编译时类型和运行时类型。 编译时的类型由声明对象时实用的类型来决定,运行时的类型由实际赋值给对象的类型决定 。如:
    Person p=new Student();
    其中编译时类型为 Person,运行时类型为 Student。

    3.2 编译时类型无法获取具体方法

    程序在运行时还可能接收到外部传入的对象,该对象的编译时类型为 Object,但是程序有需要调用该对象的运行时类型的方法。为了解决这些问题,程序需要在运行时发现对象和类的真实信息。然而,如果编译时根本无法预知该对象和类属于哪些类,程序只能依靠运行时信息来发现该对象和类的真实信息,此时就必须使用到反射了。

    4 Java 反射 API

    反射 API 用来生成 JVM 中的类、接口或者对象的信息。

    1. Class 类:反射的核心类,可以获取类的属性,方法等信息。
    2. Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性值。
    3. Method 类: Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。
    4. Constructor 类: Java.lang.reflec 包中的类,表示类的构造方法。

    5 反射使用步骤(获取 Class 对象、调用对象方法)

    反射使用步骤(获取 Class 对象、调用对象方法)

    1. 获取想要操作的类的 Class 对象,他是反射的核心,通过 Class 对象我们可以任意调用类的方法。
    2. 调用 Class 类中的方法,既就是反射的使用阶段。
    3. 使用反射 API 来操作这些信息。

    5.1 获取 Class 对象的 3 种方法

    5.1.1 调用某个对象的 getClass() 方法

    Person p=new Person();
    Class clazz=p.getClass();

    5.1.2 调用某个类的 class 属性来获取该类对应的 Class 对象

    Class clazz=Person.class;
    使用 Class 类中的 forName() 静态方法 ( 最安全 / 性能最好 )

    5.1.3 Class clazz=Class.forName(“类的全路径”); (最常用)

    当我们获得了想要操作的类的 Class 对象后,可以通过 Class 类中的方法获取并查看该类中的方法和属性。

    //获取 Person 类的 Class 对象
    Class clazz=Class.forName("reflection.Person");
    //获取 Person 类的所有方法信息
    Method[] method=clazz.getDeclaredMethods();
    for(Method m:method){
    	System.out.println(m.toString());
    }
    //获取 Person 类的所有成员属性信息
    Field[] field=clazz.getDeclaredFields();
    for(Field f:field){
    	System.out.println(f.toString());
    }
    //获取 Person 类的所有构造方法信息
    Constructor[] constructor=clazz.getDeclaredConstructors();
    for(Constructor c:constructor){
    	System.out.println(c.toString());
    }
    

    6 创建对象的两种方法

    6.1 Class 对象的 newInstance()

    使用 Class 对象的 newInstance()方法来创建该 Class 对象对应类的实例,但是这种方法要求该 Class 对象对应的类有默认的空构造器。

    6.2 Constructor 对象的 newInstance()

    先使用 Class 对象获取指定的 Constructor 对象,再调用 Constructor 对象的 newInstance()方法来创建 Class 对象对应类的实例,通过这种方法可以选定构造方法创建实例。

    //获取 Person 类的 Class 对象
    Class clazz=Class.forName("reflection.Person");
    //使用.newInstane 方法创建对象
    Person p=(Person) clazz.newInstance();
    //获取构造方法并创建对象
    Constructor c=clazz.getDeclaredConstructor(String.class,String.class,int.class);
    //创建对象并设置属性
    Person p1=(Person) c.newInstance("李四","男",20);
    

    注:以上内容来源网络收集和归纳,如有错误请不吝赐教。

    展开全文
  • 定义 反射机制是Java语言中一个非常...具体而言,反射机制的主要功能主要:①得到一个对象所属的类,②获取一个类的所有成员变量和方法,③在运行时创建对象,调用对象的方法。 反射机制的作用: 1,反编译:.c...

    定义
    反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许其对内部成员进行操作。由于反射机制能够实现在运行时对类进行装载,因此能够增加程序的灵活性,但是不恰当地使用反射机制,也会严重影响系统的性能。
    具体而言,反射机制的主要功能主要有:①得到一个对象所属的类,②获取一个类的所有成员变量和方法,③在运行时创建对象,调用对象的方法。

    反射机制的作用:
    1,反编译:.class–>.java
    2,通过反射机制访问java对象的属性,方法,构造方法等;

    先看一下sun为我们提供了那些反射机制中的类:
    java.lang.Class;
    java.lang.reflect.Constructor; java.lang.reflect.Field;
    java.lang.reflect.Method;
    java.lang.reflect.Modifier;

    很多反射中的方法,属性等操作我们可以从这四个类中查询。还是哪句话要学着不断的查询API,那才是我们最好的老师。

    Class c=Class.forName(“Employee”);
    Object o=c.newInstance(); 调用了Employee的无参数构造方法

    方法关键字
    getDeclareMethods() 获得所有的方法
    getReturnType() 获得方法的返回类型
    getParameterTypes() 获得属性的传入参数类型

    构造方法关键字
    getDeclaredConstructors() 获得所有的构造方法
    getDeclaredConstructor(参数类型.class,……) 获得特定的构造方法

    父类和父接口
    getSuperclass() 获取某类的父类
    getInterfaces() 获取某类实现的接口
    这样我们就可以获得类的各种内容,从而进行反编译
    反射机制获取类的方法有三种,我们分别展示如何获取Reflection包下的Student类

    Class.forName(“类的路径”)
    Class Student = Class.forName(“Reflection.Student”); //包名+类名
    类名.class
    Class Student = Reflection.Student.class;
    类实例.getClass()
    Student student = new Student(); Class Student =student.getClass();

    Class类中的6个重要方法
    1.getName()方法,返回一个String字符串,显示该类的名称。
    1.System.out.println(Student.getName()); //输出: Reflection.Student
    2.newInstance()方法, 由类调用该方法,根据该类的默认构造函数创建类的实例
    Object o = Student.newInstance();
    3.getClassLoader()方法,返回该类对象的对应的加载器。

    4.getComponentType()方法,返回类的组件类型的数组,如果这个类并不代表一个数组类,此方法返回null。
    5.getSuperClass()方法,返回某子类所对应的直接父类所对应的Class对象。
    6.isArray()方法,判定此Class对象所对应的是否是一个数组对象。

    反射机制获取类的方法
    获取类的构造方法
    getDeclaredConstructors() //获取类的所有构造方法
    getDeclaredConstructor(参数类型.class,……) //获取特定的构造方法

    获取类的普通方法
    getDeclaredMethods() //获取所有普通方法
    getDeclaredMethod(“方法名”,参数类型.class,……) //获取指定名称的方法
    getReturnType() //获取方法的返回类型
    getParameterTypes() //获得方法的传入参数类型

    new 创建对象,是静态加载类,在编译时刻就需要加载所有可能使用到的类

    通过动态加载类可以解决该问题。通过类类型创建该类的对象
    1、静态加载类,是编译时刻加载;动态加载类,是运行时刻加载
    2、new创建对象:是静态加载类,在编译时刻就需要加载所有的【可能使用到的类】。有一个类有问题(如不存在),都不能通过编译,会报错。
    3、Class.forName()通过动态加载类,可以用到一个类时,才进行加载。

    展开全文
  • JAVA反射机制是在运行状态中,对于任意一个类,能够知道这个类的所有属性和方法;对于任意一个对象,能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。...
  • java反射机制是在运行状态中,对于任意一个类,能够知道这个类的所有属性和方法;对于任意一个对象,能调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 ...
  • 大家知道,信号是以电磁波的形式传递的。 波从一个介质入射到另一个介质时,会产生反射。同样的,当我们信号传输遇见阻抗不连续时,信号会产生反射
  • Java反射有多强? 他拥有这五大神奇功能!

    万次阅读 多人点赞 2020-10-24 08:06:12
    Java反射是什么?Java反射有什么用?Java反射究竟多方便?让我们一起见证反射的伟大吧!
  • 通过java 反射技术,可以获取很多信息: 1.类名 2.属性,属性名 3.方法,方法名 4.注解
  • 反射用到了哪些接口,哪些类? JAVA反射机制是在运行状态中,对于任意一个类,能够知道这个类的所有属性和方法;对于任意一个对象,能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的...
  • 主要介绍了Java反射获取class对象方式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • java反射知识点

    2018-01-16 16:57:28
    我的代码里主要一下知识点: 1.获取Class对象的三种方式 2.获取构造方法并调用 3.获取成员方法 4.获取成员变量 5.反射数组 6.通过反射配置文件内容 7.通过反射越过泛型检查 8.其他一些文本笔记 读者需要补充的知识...
  • 谈谈Java中的反射机制

    2020-12-20 18:18:40
    另外,我们在eclipse或者IDEA中编辑Java代码时,它们是怎么知道我们的对象有哪些方法,输入一个点就能给提示呢? 带着问题我们来谈谈反射。 概念 反射:是将一个类的各个部分封装为其他对象,这就是反射机制。 看着...
  • JAVA的反射机制主要提供的功能: 1、在运行时判断任意一个对象所属的类; 2、在运行时构造任意一个类的对象; 3、在运行时判断任意一个类所具有的成员变量和方法; 4、在运行时调用任意一个对象的方法; ...
  • 反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)? 谈谈对 Java 注解的理解,解决了什么问题? 内部类了解吗?匿名内部类了解吗? BIO和NIO区别,4核cpu,100个http连接,用BIO和NIO分别需要多少个线程 ...
  • C#中反射的用途有哪些

    千次阅读 2014-08-07 13:08:24
    反射的用途: (1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。 (2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上...
  • .Net反射工具软件Reflector
  • JAVA REFLECT (java 反射) 取得类的继承结构 - 类所在的包; |- public Package getPackage() - 类的声明方式; |-取得全类名:public String getName() |-只取类名: public String getSimpleName() - 类所继承...
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类何不同?Java应用程序与小程序之间那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的...
  • c/c++ 结构体反射功能

    2016-09-22 17:37:43
    c/c++ 中如果要打印结构体,不需要再复杂的输入n行printf了,一行就搞定 char *pMsg = CLoadDumpDll::Dump("MyStruct",&my);...时间有限,目前还只是支持基本类型的打印,哪些类型,参考test .cpp。
  • 比如,一个光秃秃的对象,我们可以仅仅通过这个对象就能知道它所属的类、拥有哪些方法。 反射是指在PHP运行状态中,扩展分析PHP程序,导出或提出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取信息...
  • xml与反射.txt

    2020-08-05 14:39:17
    刚开始在使用jdbc时侯,在编写访问数据库时写到想吐,八个表,每个表都有增删改查中操作,那时候还不知道有反射 机制这个概念,所以就对不同的表创建不同的dao类,这样不仅开发速率慢,而且代码冗余的厉害,最要命...
  • Java中为什么需要反射反射要解决什么问题?
  • 思考:在讲反射之前,先思考一个问题,java中如何创建一个对象,哪几种方式? Java中创建对象大概这几种方式: 1、使用new关键字:这是我们最常见的也是最简单的创建对象的方式 2、使用Clone的方法:无论何时...
  • 前言 Java中的反射机制,使得我们可以在运行期获取Java类的字节码文件中的构造函数,成员变量,...Java的反射主要是从这些.class文件中获取我们想要得到的内容,那么Java中的反射能够得到哪些内容呢? 获取Class对象
  • 试述植被、水、岩石、雪、土壤的反射光谱具有哪些特点 植被 植被的反射波谱曲线(光谱特征)规律性明显而独特,主要分三段:可见光波段(0.4-0.76)一个小的反射峰,位置在0.55um(绿)附近,两侧在0.45um(绿)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 104,436
精华内容 41,774
关键字:

反射都有哪些