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

1、除了使用new创建对象之外,还可以用什么方法创建对象?

使用Java反射可以创建对象!

2、Java反射创建对象效率高还是通过new创建对象的效率高?

通过new创建对象的效率比较高。通过反射时,先找查找类资源,使用类加载器创建,过程比较繁琐, 所以效率较低

3、java反射的作用

反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意个对象,都能 够调用它的任意一个方法。在java中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。

这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

4、哪里会用到反射机制?

Class.forName('com.mysql.jdbc.Driver.class');//加载MySQL的驱动类

这就是反射。如spring等框架使用反射实现的。

5、反射的实现方式:

第一步:获取Class对象,有4中方法:

1)Class.forName(“类的路径”);

2) 类 名 .class

3)对象名.getClass()

4)基本类型的包装类,可以调用包装类的Type属性来获得该包装类的Class对象

6、实现Java反射的类:

1) Class:表示正在运行的Java应用程序中的类和接口注意: 所有获取对象的信息都需要Class类来实现。

2) Field:提供有关类和接口的属性信息,以及对它的动态访问权限。

3) Constructor:提供关于类的单个构造方法的信息以及它的访问权限

4) Method:提供类或接口中某个方法的信息

7、反射机制的优缺点:

优点:

1) 能够运行时动态获取类的实例,提高灵活性;

2) 与动态编译结合

缺 点 :

1)使用反射性能较低,需要解析字节码,将内存中的对象进行解析。

解决方案:

1、通过setAccessible(true)关闭JDK的安全检查来提升反射速度;

2、多次创建一个类的实例时,有缓存会快很多

3、ReflflectASM工具类,通过字节码生成的方式加快反射速度

2) 相对不安全,破坏了封装性(因为通过反射可以获得私有方法和属性)

8、Java 反射 API

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

1. Class 类:反射的核心类,可以获取类的属性,方法等信息。

2. Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性

值。

1. Method 类: Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。

1. Constructor 类: Java.lang.reflec 包中的类,表示类的构造方法。

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

1. 获取想要操作的类的 Class 对象,他是反射的核心,通过 Class 对象我们可以任意调用类的方法。

2. 调用 Class 类中的方法,既就是反射的使用阶段。

3. 使用反射 API 来操作这些信息。

10、获取 Class 对象有几种方法

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

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

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

 Class clazz = Person.class;

使用 Class 类中的 forName()静态方法(最安全/性能最好)

Class clazz = Class.forName("类的全限定名");

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

package com.test;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;class Person {String name;int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}}public class Demo {public static void main(String[] args) {try {//获取Person类的class对象Class clazz = Class.forName("com.test.Person");System.out.println("获取Person类的所有方法信息");Method[] method = clazz.getDeclaredMethods();for(Method m : method) {System.out.println(m.toString());}System.out.println("获取Person类的所有成员属性信息");Field[] field = clazz.getDeclaredFields();for(Field f : field) {System.out.println(f.toString());}System.out.println("获取 Person 类的所有构造方法信息");Constructor[] constructor=clazz.getDeclaredConstructors(); for(Constructor c:constructor){System.out.println(c.toString());}} catch (Exception e) {e.printStackTrace();}}}

运行结果:

获取Person类的所有方法信息

public java.lang.String com.test.Person.toString()

获取Person类的所有成员属性信息

java.lang.String com.test.Person.name

int com.test.Person.age

获取 Person 类的所有构造方法信息

public com.test.Person()

public com.test.Person(java.lang.String,int)

11、利用反射动态创建对象实例

Class 对象的 newInstance()

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

调用 Constructor 对象的 newInstance()

1. 先使用 Class 对象获取指定的 Constructor 对象,再调用 Constructor 对象的 newInstance()

方法来创建 Class 对象对应类的实例,通过这种方法可以选定构造方法创建实例。

package com.demo;import java.lang.reflect.Constructor;class Person {String name;int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}}public class Demo {public static void main(String[] args) {Person p1 = null;try {// 获取Person类的Class对象Class clazz = Class.forName("com.demo.Person");// 使用.newInstance方法创建对象Person p = (Person) clazz.newInstance();// 获取构造方法并创建对象Constructor c = clazz.getDeclaredConstructor(String.class, int.class);p1 = (Person) c.newInstance("张三", 20);} catch (Exception e) {e.printStackTrace();}//打印信息System.out.println(p1);}}

运行结果:

Person [name=张三, age=20]

反射创建对象_面试题汇集——java反射相关推荐

  1. 反射机制讲解,js和java反射机制的区别。

    JAVA为什么要用反射创建对象_为什么几乎所有的Java框架都要用到反射机制,她的魅力在哪里?..._18903290970的博客-CSDN博客说起Java的反射机制,大家应该不陌生吧,她是Java语 ...

  2. 反射创建对象_如何应用Java反射技术灵活地创建程序类的对象实例

    软件项目实训及课程设计指导--如何应用Java反射技术灵活地创建程序类的对象实例 1.如何应用属性配置文件实现对系统中的配置信息进行读写操作 Java中的属性配置文件主要可以作为软件应用系统及项目的配 ...

  3. java 反射的效率_如何提高使用Java反射的效率?

    前言 在我们平时的工作或者面试中,都会经常遇到"反射"这个知识点,通过"反射"我们可以动态的获取到对象的信息以及灵活的调用对象方法等,但是在使用的同时又伴随着另 ...

  4. java项目不要用反射_面试官:Java 反射是什么?我回答不上来!

    一.概念 反射就是把Java的各种成分映射成相应的Java类. Class类的构造方法是private,由JVM创建. 反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检 ...

  5. java 7 反射_【7】java 反射详解

    [7]java 反射详解 获取Class对象的方式: 1. Class.forName("全类名"); 将字节码加载进内存,返回Class对象,多用于配置文件,将类名定义在配置文件 ...

  6. 通过Java反射获取对象上的注解,java反射注解妙用-获取所有接口说明

    原标题:java反射注解妙用-获取所有接口说明 转载请注明出处:https://www.cnblogs.com/wenjunwei/p/10293490.html 前言 最近在做项目权限,使用shir ...

  7. Java反射的底层原理,以及Java反射的性能分析及优化

    java的反射技术,号称是编程界的九阳神功,也可以说是框架的灵魂.也正是这种反射机制使静态语言的java具备了动态语言的某些特质.就是有了反射,才让java动态,编程的时候更加灵活,能够动态获取信息以 ...

  8. java 反射 配置文件_简单模仿配置文件的反射机制

    //Student类 public class Student { public void love() { System.out.println("python"); } } / ...

  9. python反射机制_详解python之反射机制

    一.前言 deff1():print('f1')deff2():print('f2')deff3():print('f3')deff4():print('f4') a= 1 test.py impor ...

最新文章

  1. 智源论坛 | 智能处理器探索(3月21日)
  2. 文字抖动_如何用PS制作故障风文字效果
  3. 51单片机怎么显示当前时间_单片机初学者必看
  4. Java基础软件的安装及配置及Javascript的运行
  5. ionic3 隐藏子页面tabs
  6. 两个分数化简比怎么化_怎么化行最简形矩阵?
  7. LAMP配置虚拟目录
  8. codeblock的多个文件编译怎么_给一个iOS app配置多个环境变量
  9. 原神ios android,原神ios和安卓数据互通吗 原神ios和安卓能一起玩吗
  10. ENVI遥感图像处理方法(第二版) 邓书斌 及实验数据
  11. 28 | 机器学习:如何教会机器识别黑灰产?
  12. centos6 安装 directAdmin
  13. docker安装,阿里云镜像配置
  14. 《满族姓氏寻根大全·满族老姓全录》
  15. 光猫-新版水星路由器配置(WiFi连接不上后)
  16. java怎么写桌面日历_Win7桌面怎么添加日历记事本
  17. 数据分析京东笔记本电脑
  18. win2008找不到无线网络
  19. 数据分析报告——经典统计量的描述性分析:平均数方差、偏度峰度
  20. 财务软件性能测试要求,财务报表性能测试总结 - 泊 涯 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

热门文章

  1. Python数据科学学习进阶
  2. AngularJS从构建项目开始
  3. 【深度学习】生成对抗网络(GAN)的tensorflow实现
  4. 关于抢红包的_关于抢红包现象的材料作文
  5. python协程详解_彻底搞懂python协程-第一篇(关键词1-4)
  6. 计算机如何建筑材料结合所学知识,《技术与设计2》第三、四单元综合测试卷...
  7. javascript精雕细琢(二):++、--那点事
  8. 【01】如何在XMind中排列自由主题
  9. Leetcode: Increasing Triplet Subsequence
  10. 在使用SPSite对象时容易发生内存泄漏