深入理解Java反射机制汇总
Java中的反射机制详解

Java中的反射机制详解Java作为一种编程语言,具有许多强大的特性和功能。
其中,反射机制是其中的重要部分之一。
通过反射机制,Java程序可以在运行时动态地获取类的信息、构造对象、调用方法和访问属性等。
本文将详细介绍Java中的反射机制。
一、什么是反射机制?Java中的反射机制指的是在程序运行时动态获取类的信息并对其进行操作的能力。
通过反射机制,Java程序可以在运行时获取类的属性、方法和构造器等信息,并对其进行操作。
利用反射机制可以实现动态代理、框架开发、自动化测试等功能。
二、反射机制的基本原理Java程序在编译时会将类的信息编译成.class文件。
在程序运行时,JVM会将.class文件加载到内存中,并生成一个Class对象,该对象包含了类的所有信息。
通过Class对象,Java程序可以获取类的构造器、方法、属性等信息,并对它们进行操作。
三、反射机制的使用Java中的反射机制主要通过ng.reflect包中的类和接口实现。
在这个包中,最常用的类包括Class、Constructor、Method和Field等。
下面我们将分别介绍这些类的用法。
1、Class类Class类是Java中用来表示类的类。
在Java程序中,每个类都有一个对应的Class对象,可以使用该对象获取类的信息。
获取Class对象有以下三种方式:(1)使用类的.class属性获取:Class clazz = MyClass.class;(2)使用Class的forName()方法获取:Class clazz = Class.forName("com.example.MyClass");(3)使用对象的getClass()方法获取:MyClass obj = new MyClass();Class clazz = obj.getClass();通过Class对象可以获取类的信息,如:(1)类的名称:String name = clazz.getName(); // com.example.MyClass(2)类的简单名称:String simpleName = clazz.getSimpleName(); // MyClass(3)类的包路径:Package pkg = clazz.getPackage(); // com.example(4)类的修饰符:int modifiers = clazz.getModifiers(); // 返回访问修饰符列表(5)类的父类:Class superClass = clazz.getSuperclass(); // 返回父类的Class对象2、Constructor类Constructor类用于描述类的构造器。
JAVA反射机制详解

反射概述1反射的概述1.1什么是反射每个.class文件被加载到内存后都是一个Class类的对象!例如Demo.class加载到内存后它是Class<Demo>类型的一个对象。
反射就是通过Class对象获取类型相关的信息。
一个Class对象就表示一个.class文件,可以通过Class对象获取这个类的构造器、方法,以及成员变量等。
反射是Java的高级特性,在框架中大量被使用!我们必须要了解反射,不然无法学好JavaWeb 相关的知识!1.2反射相关类与反射相关的类:●Class:表示类;●Field:表示成员变量;●Method:表示方法;●Constructor:表示构造器。
2Class类2.1获取Class类获取Class类的三种基本方式:●通过类名称.class,对基本类型也支持;Class c = int.class;Class c = int[].class;Class c = String.class●通过对象.getClass()方法Class c = obj.getClass();●Class.forName()通过类名称加载类,这种方法只要有类名称就可以得到Class;Class c = Class.forName(“cn.itcast.Demo”);2.2Class类的常用方法●String getName():获取类名称,包含包名;●String getSimpleName():获取类名称,不包含包名;●Class getSupperClass():获取父类的Class,例如:new Integer(100).getClass().getSupperClass()返回的是Class<Number>!但new Object().getSupperClass()返回的是null,因为Object没有父类;●T newInstance():使用本类无参构造器来创建本类对象;●boolean isArray():是否为数组类型;●boolean isAnnotation():是否为注解类型;●boolean isAnnotationPresent(Class annotationClass):当前类是否被annotationClass注解了;●boolean isEnum():是否为枚举类型;●boolean isInterface():是否为接口类型;●boolean isPrimitive():是否为基本类型;●boolean isSynthetic():是否为引用类型;2.3通过反射创建对象3ConstructorConstructor表示一个类的构造器。
java反射机制总结--ITeye技术网站

首页资讯精华论坛问答博客专栏群组更多 ▼您还未登录 !登录注册jczghost博客微博相册收藏留言关于我java反射机制总结博客分类:java-高级JavaStrutsBean框架Mobile经过多方面的资料搜集整理,写下了这篇文章,本文主要讲解java的反射和内省机制,希望对大家有点帮助,也希望大家提出不同的看法!1).反射是java的基础技术,在我们用到的框架如:struts,spring,hibernate,junit等都用到了反射技术,所以了解反射对我们来说也很重要。
要了解反射技术,必须要了解一个类Class类。
2).平时我们定义class的时候都是小写,这里讲的Class是大写,此时它代表一类事物,java类用于描述一类事物的共性,如该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则是由这个类的实例对象来确定,不同的事物对象有不同的属性值。
java程序中的java类,属于同一类事物,描述这类事物的Java类名就是Class.,就比如众多的人可以用一个Person类表示一样,众多的java类用Class来表示。
3).Class类代表Java类,它(Class类)的各个实例对象分别对应各个类在内存中的字节码,那么什么叫字节码呢? java源程序被编译成一堆二进制的class代码,当我们需要用到某个类时,首先把类的字节码加载到内存中来,然后再用该字节码去复制一个个的实例对象来,每份字节码都是Class类的实例对象,即Class类的实例对象就代表内存中字节码。
如:public static void main(String[] args) throws Exception {Class cls1 = Date.class;//cls1代表Date类在内存中的字节码Class cls2 = String.class;//cls2代表String类在内存中的字节码Class cls3 = String.class;//cls3代表String类在内存中的字节码System.out.println(cls2 == cls3);//true:同一份字节码在内存中的地址相同}4).一个类被类加载器加载到内存中,占用一片存贮空间,这个空间里的内容就是这个类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间分别用一个个的对象来表示,这些对象显然具有相同的类型,这个类型就是Class类型.5).如何得到各个字节码对应的实例对象?(Class类型):即得到字节码的三种方式:.)类名.class 例如:System.class//写程序的时候就知道类的名称.)对象.getClass() 例如:new Date().getClass().)Class.forName() 例如:Class.forName("java.util.Date");//类的字符串的完整名称做反射的时候常用第三种,因为写源程序的时候不知道类的名称,在运行的时候根据传递的字符串来创建.例如:public static void main(String[] args) throws Exception {Date nowDate = new Date();Class cls1 = nowDate.getClass();//getClass()方法返回创建该对象的字节码Class cls2 = Date.class;Class cls3 = Class.forName("java.util.Date");System.out.println(cls1);// class java.util.DateSystem.out.println(cls1 == cls2);// trueSystem.out.println(cls1 == cls3);// true//这说明三个应用变量引用的是同一份字节码}例如:public static void main(String[] args) throws Exception {Date nowDate = new Date();Date tomDate = new Date();System.out.println(nowDate == tomDate);// falseSystem.out.println(nowDate.getClass() == tomDate.getClass());// true//同一个类的字节码是相同的(即使是不同的实例对象.getClass()依然是相等的).}6)Class.forName()的作用:得到这个类的字节码,包含下面两种情况.这个类的字节码已经加载到Java虚拟机中,只需要找到返回..这个类的字节码在Java虚拟机没找到,于是用类加载器加载,然后把类的字节码缓存起来再返回..7)8个基本类型和一个void共9个预定义的Class实例对象例如:public static void main(String[] args) throws Exception {System.out.println(int.class.isPrimitive());//trueSystem.out.println(int.class == Integer.class);//falseSystem.out.println(int.class == Integer.TYPE);//true,TYPE表示基本类型 Class实例。
Java反射机制

Java反射机制一、Java反射机制1、什么是java语言的反射机制JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
2、Java反射机制主要提供了以下功能:●在运行时判断任意一个对象所属的类getClass()●在运行时构造任意一个类的对象●在运行时判断任意一个类所具有的成员变量和方法●在运行时调用任意一个对象的方法●生成jdk动态代理3、Java反射的用途Java 语言的反射机制提供了一种非常通用的动态连接程序组件的方法。
它允许你的程序创建和维护任何类的对象(服从安全限制),而不需要提前对目标类进行硬编码。
这些特征使得反射在创建与对象一同工作的类库中的通用方法方面非常有用。
例如,反射经常被用于那些数据库,XML,Eclipse或者其它的外部的框架中,如Struts,Spring,Hibernate。
初始化语句块:每创建对象new一次,都会执行;静态static初始化语句块:第一次创建new时,执行一次;之后不再执行;二、类加载机制与ClassLoader1、什么是类加载器Classloader与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序。
当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头CodeSegment(代码段)运行,负责加载Java class的这部分就叫做Class Loader。
因此Classloader也叫做类加载器。
2、Java类加载机制●类加载是动态执行的,也就是说当我们用到的时候才会去加载,如果不用的话,就不会去加载我们的类。
●类加载有两种方式:第一种就是new一个对象的时候,另一种就是当一个类的静态代码被调用的时候●静态初始化语句块在加载时只执行一次,而初始化语句块在每次new出新的对象是都会执行,等同于构造方法中的语句。
java反射原理 通俗易懂

java反射原理通俗易懂Java反射原理通俗易懂Java的反射是指在运行时动态地获取类的信息并操作类的属性、方法等。
通过反射,我们可以在编译时无法确定的情况下,获取类的字段、方法、构造方法等信息,并可以动态地创建对象、调用方法、操作属性等。
反射为Java提供了一种强大的机制,使得我们可以在运行时动态地操作类,极大地提高了代码的灵活性和扩展性。
那么,Java反射的原理是什么呢?简单来说,反射机制是通过在运行时通过类的全限定名获取该类的字节码文件,然后通过字节码文件获取类的各种信息,从而实现对类的操作。
下面我们具体来看反射的原理。
1. 获取类的字节码文件在Java中,每个类都会被编译成一个字节码文件,反射机制首先需要获取类的字节码文件。
Java提供了两种获取字节码文件的方式:(1)通过对象的getClass()方法获取字节码文件。
例如,Object obj = new Object(); Class<?> clazz = obj.getClass();(2)通过类的.class属性获取字节码文件。
例如,Class<?> clazz = Object.class;2. 获取类的各种信息通过类的字节码文件,我们可以获取该类的各种信息,包括类的字段、方法、构造方法等。
Java提供了Class类的一系列方法来获取这些信息,例如:(1)获取类的字段:Field[] fields = clazz.getDeclaredFields();(2)获取类的方法:Method[] methods = clazz.getDeclaredMethods();(3)获取类的构造方法:Constructor<?>[] constructors = clazz.getDeclaredConstructors();通过这些方法,我们可以获取到类的字段名、方法名、参数类型等信息。
3. 动态操作类的字段、方法等通过反射,我们可以在运行时动态地操作类的字段、方法等。
java反射机制原理详解

java反射机制原理详解Java反射机制是指在Java语言的运行时期可以检查、操作自己的程序结构和内部数据状态的机制,它可以在加载或运行Java程序时,发现和使用程序中的类、接口、构造器、方法等对象来实现运行时的特定操作。
一、Java反射原理1、运行时提供反射机制在Java中,类将在运行时编译成字节码,在运行期间就会被CLR(Common Language Runtime)把字节码翻译成机器指令处理。
因此,Java虚拟机系统是一个能在堆内存中动态加载类、执行类中的方法、创建实例对象的运行环境,并且它是能对对象提供反射机制的可执行环境。
2.Java类提供反射机制Java类定义了一些工具类,用来提供反射机制,其中包括Class, Field, Method等类,它们都存储在ng.reflect包中,并且可以用其中的方法或API在运行时执行操作。
Class类是Java反射机制提供的重要工具,它标识一个类型在JVM(Java虚拟机)当中所对应的实例,可以通过构造函数或者类的class属性来获取Class类实例,我们可以用它来做一个触发类,用来访问类的结构,他的字节码,方法等等。
Field类提供一个 get() 方法,用来获取指定对象中的具体域的值,并有几个参数,比如:可以指定是否忽略访问权限限制。
Method类的一个 invoke() 方法,可以调用某个对象的特定方法,并接收参数作为它的返回值。
Constructor类表示一个构造函数。
它也定义了一个invoke() 方法,可以通过调用它来实例化一个对象。
二、 Java反射机制应用1、框架设计由于Java反射机制可以在运行时加载类,使得在程序运行时可以根据某种特定要求来加载对象,这对框架设计可以大有裨益,特别是像Velocity这样的模板引擎,重构后的加载模板时可以采用反射技术动态加载指定的模板类。
2、动态代理动态代理是一种常用的AOP手段,在动态代理中Java反射机制可以用来解耦代理类和被代理类,可以在不知道具体功能实现的情况下实现对代理类对应对象的操作。
Java语言反射机制详解

Java语言反射机制详解Java语言反射机制是指在运行时,动态获取类的信息及操作类的属性和方法的能力。
它使得程序可以在运行时动态加载和运行代码,提供了一种强大的机制来检查、操作、修改运行时行为的类和对象。
在本文中,我们将详细介绍Java语言反射机制的原理、应用场景以及具体的实现方法。
一、反射机制的原理反射机制基于Java中的class类,即描述具体类的模板。
通过获取一个类的class对象,我们可以获取该类的构造方法、字段、方法以及注解等信息,并对其进行操作。
反射机制的主要原理包括以下几点:1. 获取class对象:通过Class类的静态方法forName(),我们可以根据类的全限定名获取对应的Class对象。
例如:Class clazz = Class.forName("com.example.MyClass");2. 创建实例:通过Class对象的newInstance()方法,我们可以创建该类的实例。
例如:MyClass myClass = (MyClass) clazz.newInstance();3. 获取字段:通过Class对象的getField()方法可以获取公共字段,而通过getDeclaredField()方法可以获取所有字段。
例如:Field field = clazz.getDeclaredField("fieldName");4. 调用方法:通过Method类的对象,我们可以对类的方法进行调用。
例如:Method method = clazz.getDeclaredMethod("methodName", parameterTypes);Object result = method.invoke(myClass, arguments);二、反射机制的应用场景Java反射机制的应用场景非常广泛,下面我们将介绍几个常见的应用场景:1. 动态加载类:通过类的全限定名,我们可以在运行时动态加载一个类,而不需要在编译时就将类引入到代码中。
java反射机制的底层原理

java反射机制的底层原理Java是一种面向对象的编程语言,其强大之处在于具备了面向对象的特性,如封装、继承和多态。
然而,有时候我们需要在运行时动态地获取或操作一个对象的属性和方法,这就需要用到Java的反射机制。
本文将深入探讨Java反射机制的底层原理,以帮助读者更好地理解其工作原理。
一、什么是反射机制?反射机制是指在运行时动态地获取一个类的信息,包括类名、类的属性和方法等。
通过反射机制,我们可以在运行时获取到类的信息,并可以在运行时操作类的属性和方法。
这为程序的灵活性和可扩展性提供了很大的便利。
二、反射机制的实现原理Java的反射机制是通过`ng.reflect`包下的一些类和接口实现的。
在这个包中,主要涉及到以下几个核心类:1. `Class`类:代表一个类的信息,包括类名、类的构造方法、属性和方法等。
通过`Class`类的实例,我们可以获取到一个类的所有信息。
2. `Field`类:代表一个类的属性。
通过`Field`类,我们可以获取或设置一个对象的属性值。
3. `Method`类:代表一个类的方法。
通过`Method`类,我们可以调用一个对象的方法。
4. `Constructor`类:代表一个类的构造方法。
通过`Constructor`类,我们可以创建一个类的实例。
Java的反射机制是通过`Class`类来实现的。
每个类都有一个隐含的静态成员变量`class`,它指向表示该类的`Class`对象。
我们可以通过类的静态成员变量`class`来获取到一个类的`Class`对象,然后通过`Class`对象可以获取到类的所有信息。
三、反射的应用场景反射机制在Java中有很多应用场景,下面列举几个常见的应用场景:1. 动态代理:动态代理是一种常见的设计模式,通过反射机制可以在运行时动态地生成代理类,来实现面向切面编程。
2. 注解处理器:注解是Java中的一种特殊语法,通过反射机制可以在运行时扫描和处理注解,实现自定义的注解处理器。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
深入理解Java反射机制本文较为详细的分析了Java反射机制。
分享给大家供大家参考,具体如下:一、预先需要掌握的知识(java虚拟机)java虚拟机的方法区:java虚拟机有一个运行时数据区,这个数据区又被分为方法区,堆区和栈区,我们这里需要了解的主要是方法区。
方法区的主要作用是存储被装载的类的类型信息,当java虚拟机装载某个类型的时候,需要类装载器定位相应的class文件,然后将其读入到java虚拟机中,紧接着虚拟机提取class 中的类型信息,将这些信息存储到方法区中。
这些信息主要包括:1、这个类型的全限定名2、这个类型的直接超类的全限定名3、这个类型是类类型还是接口类型4、这个类型的访问修饰符5、任何直接超接口的全限定名的有序列表6、该类型的常量池7、字段信息8、方法信息9、除了常量以外的所有类变量10、一个到class类的引用等等(读者可以参考《深入java虚拟机》这本书的叙述)Class类:Class类是一个非常重要的java基础类,每当装载一个新的类型的时候,java虚拟机都会在java堆中创建一个对应于新类型的Class实例,该实例就代表此类型,通过该Class实例我们就可以访问该类型的基本信息。
上面说到在方法区中会存储某个被装载类的类型信息,我们就可以通过Class实例来访问这些信息。
比如,对于上面说到的信息Class中都有对应的方法,如下:1、getName();这个类型的全限定名2、getSuperClass();这个类型的直接超类的全限定名3、isInterface();这个类型是类类型还是接口类型4、getTypeParamters();这个类型的访问修饰符5、getInterfaces();任何直接超接口的全限定名的有序列表6、getFields();字段信息7、getMethods();方法信息等等(读者可以自己参看jdk帮助文档,得到更多的信息)二、java反射详解反射的概念:所谓的反射就是java语言在运行时拥有一项自观的能力,反射使您的程序代码能够得到装载到JVM中的类的内部信息,允许您执行程序时才得到需要类的内部信息,而不是在编写代码的时候就必须要知道所需类的内部信息,这使反射成为构建灵活的应用的主要工具。
反射的常用类和函数:Java反射机制的实现要借助于4个类:Class,Constructor,Field,Method;其中class代表的是类对象,Constructor-类的构造器对象,Field-类的属性对象,Method -类的方法对象,通过这四个对象我们可以粗略的看到一个类的各个组成部分。
其中最核心的就是Class类,它是实现反射的基础,它包含的方法我们在第一部分已经进行了基本的阐述。
应用反射时我们最关心的一般是一个类的构造器、属性和方法,下面我们主要介绍Class 类中针对这三个元素的方法:1、得到构造器的方法Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数,Constructor[] getConstructors() -- 获得类的所有公共构造函数Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关)2、获得字段信息的方法Field getField(String name) -- 获得命名的公共字段Field[] getFields() -- 获得类的所有公共字段Field getDeclaredField(String name) -- 获得类声明的命名的字段Field[] getDeclaredFields() -- 获得类声明的所有字段3、获得方法信息的方法Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法Method[] getMethods() -- 获得类的所有公共方法Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型,获得类声明的命名的方法Method[] getDeclaredMethods() -- 获得类声明的所有方法应用反射的基本步骤:1、获得你想操作的类的Class对象;方法一:Classc=Class.forName("ng.String") //这种方式获得类的Class对象需要包名.类名方法二:对于基本数据类型可以用形如Class c=int.class或Class c=Integer.TYPE的语句方法三:Class c=MyClass.class2、调用Class中的方法得到你想得到的信息集合,如调用getDeclaredFields()方法得到类的所有属性;3、处理第2步中得到的信息,然后进行你想做的实际操作。
反射实例:下面我将针对类的构造器、属性和方法分别举三个例子,向大家演示一下反射的应用过程。
1、构造器步骤为:通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例import ng.reflect.*; public class ConstructorDemo{ public ConstructorDemo(){ }public ConstructorDemo(int a, int b){ System.out.println("a="+a+"b="+b); } public static void main(String args[]){ try { Class cls =Class.forName("包名.ConstructorDemo"); Class partypes[] =new Class[2]; partypes[0] = Integer.TYPE; partypes[1] =Integer.TYPE; Constructor ct=Constructor(partypes); Object arglist[] =new Object[2]; arglist[0] = newInteger(37); arglist[1] = newInteger(47); Object retobj = ct.newInstance(arglist); } catch (Throwable e) { System.err.println(e);} } }2、属性步骤为:通过反射机制得到某个类的某个属性,然后改变对应于这个类的某个实例的该属性值import ng.reflect.*; public class FieldDemo1{ public double d; public static void main(String args[]){ try { Class cls = Class.forName("FieldDemo1"); Field fld = cls.getField("d"); FieldDemo1 fobj = new FieldDemo1(); System.out.println("d = " + fobj.d); fld.setDouble(fobj, 12.34); System.out.println("d = " + fobj.d); } catch (Throwable e){ System.err.println(e); } } }3、方法步骤为:通过反射机制得到某个类的某个方法,然后调用对应于这个类的某个实例的该方法//通过使用方法的名字调用方法import ng.reflect.*; public class MethodDemo1{ public int add(int a, int b){ return a + b; } public static void main(String args[]){ try { Class cls =Class.forName("MethodDemo1"); Class partypes[] = new Class[2]; partypes[0] = Integer.TYPE; partypes[1] = Integer.TYPE; Method meth = cls.getMethod("add",partypes); MethodDemo1 methobj = new MethodDemo1(); Object arglist[] = new Object[2]; arglist[0] = new Integer(37); arglist[1] = new Integer(47); Object retobj= meth.invoke(methobj, arglist); Integer retval = (Integer)retobj; System.out.println(retval.intValue()); } catch (Throwable e) { println(e); } } }三、java反射的应用(Hibernate)我们在第二部分中对java反射进行了比较系统的阐述,也举了几个简单的实例,下面我们就来讨论一下java反射的具体应用。
前面我们已经知道,Java反射机制提供了一种动态链接程序组件的多功能方法,它允许程序创建和控制任何类的对象(根据安全性限制)之前,无需提前硬编码目标类。
这些特性使得反射特别适用于创建以非常普通的方式与对象协作的库。
例如,反射经常在持续存储对象为数据库、XML或其它外部格式的框架中使用。
下面我们就已Hibernate框架为例像大家阐述一下反射的重要意义。
Hibernate是一个屏蔽了JDBC,实现了ORM的java框架,利用该框架我们可以抛弃掉繁琐的sql语句而是利用Hibernate中Session类的save()方法直接将某个类的对象存到数据库中,也就是所涉及到sql语句的那些代码Hibernate帮我们做了。
这时候就出现了一个问题,Hibernate怎样知道他要存的某个对象都有什么属性呢?这些属性都是什么类型呢?如此,它在向数据库中存储该对象属性时的sql语句该怎么构造呢?解决这个问题的利器就是我们的java反射!下面我们以一个例子来进行阐述,比如我们定义了一个User类,这个User类中有20个属性和这些属性的get和set方法,相应的在数据库中有一个User表,这个User表中对应着20个字段。