`

core java interview point (6)

阅读更多

31. 反射的作用与原理。

java反射是java被视为动态语言的一个关键性质,它允许程序在运行时候通过Reflection APIs取得任何一个自身class的内部信息,包括modifiers(public static private..)。superclass(Object),实现值interfaces(Cloneable),也包括了fields和methods的所有信息,并可运行时改变fields内容或唤起methods。

 

Reflection enables java code to discover information about the fields, methods and constructions of loaded classes, and to use reflected fields, methods, and constructions to operate on their underlying counterparts, within security restrictions. The API accommodates applications that need access to either the public members of a target object(base on its runtime class) or the members declared by a given class. It also allows programs to suppress defualt reflective access control.

 

java反射机制允许程序在运行时候加载、探知、使用编译期间完全未知的classes,换言之,java可以加载一个运行时才得知名称的class,获得其完整的结构。

通过反射,我们可以在运行时获得程序或者程序集中每个类型的成员和成员信息。程序中的对象类型一般都是在编译期间就确定下来的,但是java reflection可以动态创建对象并调用属性,这样的对象的类型在编译期间是位置的。所以我们可以通过反射机制直接创建对象,jishizhegeduxiiang类型在编译器是未知的。

反射的核心是JVM在运行时才动态的加载类或调用方法、访问属性。它不需要事先(写代码或编译期)直到运行对象是谁。

 

 

首先我们看JVM:java virtual machine,用于将java编译成.class文件,是的java的可跨平台性。本身jvm就是一个程序,用于编译java。

preview

 假设代码:Object ob = new Object();

JVM启动后,代码编译成.class文件,然后被类加载器加载进jvm的内存中,类Object加载到方法区中,创建了Object类的class对象到堆中,注意这个不是new出来的对象,而是类的class类型对象,每个类只有一个class对象,作为方法区类的数据结构的接口。JVM创建对象前,会先检查类是否加载,寻找类对应的clas对象,若加载好了,则为你的对象分配内存,初始化也就是代码new Object();

这就是自己写好的代码,JVM直接执行就好。

但是在程序运行中,类没有加载进JVM中呢?在程序运行时,需要动态的区家在一些类,这些类可能之前用不到所以不用加载到JVM,比如数据库驱动程序,它依赖于具体的数据库实现。我们只需要依据实际需要配置相关驱动,这时候程序就能动态化的实现Class clazz = Class.forName("data_driver");data_driver自己配制,这样就实现了java的动态性,java反射的一个应用。

 

作用:

在我们使用的IDE工具eclipse或者Idea,当我们输入一个对象名称或者类,想调用他的方法或者属性时候,一按点号,编译器就能自动的列出所有可选项,就是反射。

---反射最重要的用途就是:开发各种通用框架。

spring配置框架,通过xml文件配置了bean等,为了保证这些框架的通用型,就需要根据配置文件加载不同的对象或者类,调用不同的方法-反射,运行时动态加载对象。

 

基本应用:

java反射框架主要提供以下功能:(反射都是在运行时)

 1)在运行时候判断一个对象所属的类;

 2)在运行时构造任意一个类的对象;

 3)在运行时判断任意一个类所具有的成员变量和方法(private也可以)

 4)在运行时调用任意一个对象的方法。

 

反射常用的类和函数,java反射机制的实现要借助于4个类:Class, Constructor, Field, Method

分别代表了:类对象,类的构造器对象,类的属性对象,类的方法对象。

Class类是所有反射的基础。

 

java.lang.reflectt包下:

Field类:提供类的成员属性信息

Method类:提供类的方法信息

Constractor类:提供类的构造器信息

Modifier类:修饰符工具类,用于判断和获取某个类、变量、方法的修饰符类型。

 

一、Class对象

1)获得Class对象:

Class.clazz = Class.forName(String className);

2)直接获取某个对象class

Class<?> clazz = Object.class;

Class<?> clazz = Integer.TYPE;

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

String s = new String("12");

Class clazz = s.getClass();

 

4)判断是否是某个类的实例:

java中 instanceof关键字用于判别是否是类的实例,Class对象中的isInstance()方法亦然。他是一个natice方法:

public native boolean isInstance(Object o);

 

5)创建实例:

 a.Class对象的newInstance()方法:Object str = s.newInstance();

 b.通过Class对象的getConstrustor获取Constructor对象,调用Constructor对象的newInstance()方法创建实例(用指定的构造器创建)。

 Class<?> s = String.class;

 Constructor con = s.getConstructor(String.class);

 Object  o = con.newInstance("12");

 

5)获取方法:

获取某个Classduxiiang的方法集合,主要有:

 a.getDeclaredMethods():返回类或者接口的所有方法,包括了各种权限的(共有、保护、默认、私有),  但是不包括继承的(父类)方法。

 public Mehod[] getDeclaredMethods() throw Exception;

 

 b.getMethods():方法返回某个类的所有public方法,包括了继承(父类)的public。

 public Method[] getMethods() throw Exception;

 

 c.getMethod(String, Class<<> ...):返回一个特定的方法,第一个参数是方法名称,第二个参数是后面参数  方法的参数对应的Class对象,能够获取到继承(父类)的方法。

 public Method getMethod(String name, Class<?> ... parameterType) throw Exception

 

6)获取构造器:

使用Class类的getConstructor()得到Constructor类的一个实例,Constructor类有一个newInstance()方法可以创建一个对象:

public T newInstance(Object ... initargs);

根据传入的参数获得对应的Constructor创建对象。

 

7)获取类的成员变量(属性)

getField(String name):访问公共的名字为name的成员变量(包括父类)

getDeclaredField(String name):访问类中的name名的字段(各种权限)

getFields():获取所有公共属性(父类)

getDeclaredFields():获取类中所有属性

 

8)调用方法:

我们从一个类中获取一个方法后,就可以invoke()调用这个方法

public Object invoke(Object clazzObj, Object ... args);

//第一个参数:对象名称,第二个参数:方法参数

分享到:
评论

相关推荐

    Core-Java-Interview-Questions.rar_core java interview

    "Core Java Interview Questions"这个资源集锦了面试中可能会遇到的一些关键问题,旨在帮助求职者更好地准备Java核心技术的面试。以下是根据描述和标签提炼出的一些核心Java知识点: 1. **Java基础** - 类与对象:...

    Core Java Interview Question Page 1.doc

    Core Java Interview Question Page 1

    Top 20 Core Java Interview Questions and Answers

    从国外网站上下载的Java面试题。可以看看国外公司的Java面试常用题,以及如何用英文回答。

    Core Java Interview

    这本书名为《Core Java Interview》,其内容是关于Java面试的,英文版本,是一本适合想要面试Java职位的求职者的实用指南。它由Sam Atkinson撰写,并在Leanpub网站上出售,于2016年5月21日发布。Leanpub是一种轻量级...

    CoreJava全套详细笔记资料.pdf

    CoreJava全套详细笔记资料.pdf CoreJava是Java编程语言的核心部分,涵盖了Java语言的基础知识和高级应用。以下是对给定文件的详细解读和知识点总结: 一、原码、反码、补码 * 原码是指一个数的二进制表示形式,...

    Core Java

    【Core Java】是Java编程的基础教程,主要涵盖了Java语言的核心概念和使用方法。在学习Core Java时,首先要理解以下几个关键知识点: 1. **类与对象**:类是面向对象编程的基础,是描述某一类事物共性的抽象,而...

    Java.Interview.Guide.How.to.Build.Confidence.With.pdf

    Java.Interview.Guide.How.to.Build.Confidence.With.a.Solid.Understanding.of.Core.Java.Principles.B015HF9SJQ.pdf Java.Interview.Guide.How.to.Build.Confidence.With.a.Solid.Understanding.of.Core.Java....

    达内Java培训-CoreJava全程笔记(WORD唐亮版)

    CoreJava DAY02 数据类型和控制结构 6 CoreJava DAY03 数组 11 CoreJava DAY04 15 CoreJava DAY05 面向对象 17 CoreJava DAY06 类的加载过程、实例化、继承、多态 20 CoreJava DAY07修饰符 26 CoreJava DAY08 常用类...

    java\CoreJava笔记\CoreJAVA_day01

    CoreJava是Java的基础,涵盖了Java Standard Edition (J2SE)的主要内容,包括基本语法、面向对象编程(OO)原则、核心类库的使用等。在学习CoreJava时,我们需要掌握以下几个关键知识点: 1. **编程思想**: - ...

    Java 核心技术 第八版-第1和2卷+源代码【Core Java 8th Edition】

    Java 核心技术 第八版-第1和2卷+源代码【Core Java 8th Edition】内附资源: Core Java. Volume I. Fundamentals, 8th Edition.pdf ; Core Java. Volume II. Advanced Features, 8th Edition.chm ; Core Java 8th ...

    corejava,java核心编程

    【标题】:“Core Java,Java核心编程” 【描述】:“Java语法基础,Java面向对象编程,图形用户界面(GUI)编程,Java网络编程:Socket编程” 【标签】:“corejava” 在计算机编程领域,Core Java是指Java的...

    Interview Questions in Core Java

    Interview Questions in Core Java 1.what is a transient variable? A transient variable is a variable that may not be serialized.

    Core Java.JAVA核心技术(中文版)

    《Core Java.JAVA核心技术(中文版)》是学习Java编程的重要参考资料,主要涵盖了Java语言的基础以及进阶知识。这本书深入浅出地讲解了Java的核心概念和技术,为读者提供了全面而细致的学习路径。以下是对该书内容的...

    Core Java( Java 核心) PDF 教材

    《Core Java》是由Sun Microsystems公司出版的一本权威的Java编程教材,它全面深入地介绍了Java语言的核心概念和技术。这本书是Java开发者的重要参考资料,对于初学者和有经验的开发者都具有很高的学习价值。以下是...

    Core Java for the Impatient azw3

    Core Java for the Impatient 英文azw3 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    Core Java 学习必备PPT(CoreJava教案)

    Core Java 学习必备PPT(CoreJava教案)

    达内 CoreJava老师笔记汇总

    CoreJava DAY01 Java概述 1 CoreJava DAY02 数据类型和控制结构 10 CoreJava DAY03 数组 20 CoreJava DAY04 27 CoreJava DAY05 面向对象 31 CoreJava DAY06 类的加载过程、实例化、继承、多态 37 CoreJava DAY07修饰...

    core java1&2

    《Core Java 1&2》是Java编程领域中两本非常经典的教材,分别对应于卷1和卷2,英文版提供了全面且深入的Java学习资源。这两本书由Cay S. Horstmann和Gary Cornell撰写,是许多程序员入门和进阶Java技术的重要参考书...

Global site tag (gtag.js) - Google Analytics