- 浏览: 87390 次
- 性别:
- 来自: 西安
最新评论
-
xuhang1128:
good
Spring源码解析 BeanPostProcessor的实现 -
zhudaokun:
呵呵……好帖,收藏一下
Spring源码解析1 IOC容器的初始化
反射:运行时类型
如果你不知道某个对象的确切类型,RTTI可以告诉你,但有一个限制:这个类型在编译时必须已知,这样才能使用RTTI识别它,并利用这些信息做一些有用的时。换句话说,在编译时,编译器必须知道所有要通过RTTI来处理的类。
当通过反射与一个未知类型的对象打交道时,Java虚拟机只是简单地检查这个对象,看它属于哪个特定的类,就像RTTI那样。在用它做其他事情之前必须先加载那个类的Class对象。因此,那个类的.class文件对于Java虚拟机来说必须是可获得的:要么在本地机器上,要么可以通过网络获得。所以RTTI和反射之间真正的区别是:对RTTI来说,编译器在编译时打开和检查.class文件。而对于反射机制来说,.class文件在编译时是不可获取的,所以是在运行时打开和检查.class文件。
尽管Java不是动态语言,但却有着一个非常突出的动态相关机制:Reflection.这个字的意思是"反射,印象,倒影",用在Java身上指的是我们可以在运行时加载,探知,使用编译期间完全未知的classes.换句话说,Java程序可以加载一个在运行时才得知名称的class,获取器完整的构造(但不包括methods定义),并生成器对象实体,或对其fields设置,或调用其methods这种“看透class”的能力被称为introspection(内省,内观,反省).
反射机制主要提供了以下功能:
1在运行时判断任意一个对象所属的类。
2 在运行时构造任意一个类的对象
3 在运行时构造任意一个类所具有的成员变量和方法。
4 在运行时调用一个对象和方法。
反射主要用到类在java.lang.reflect包下:
Class类,表示一个类
Field类 :代表类的成员变量即属性
Method类:代表类的方法
Constructor类: 代表类的构造方法
Array类:提供了动态创建数组,以及访问数组元素的静态方法
获取某个类的对应的Class对象的方式
使用类的.class语法
通过类的对象getClass()方法
通过Class对象的forName()方法
对于包装类可以通过.TYPE语法方式
反射机制主要强调的是运行时,还有就是只知道类名(准确的说是class文件,因为是编译好,运行时获取的),就可以得到类中的所有信息,包括private的。某种程度上可以说不安全。
简单运用:类方法提取器:
import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.regex.Pattern; public class ShowMethods { private static String usage="usage:\n"+"ShowMethods qualified.class.name\n" +"To show all methods in class or :\n"+ "ShowMethods qualified.class.name word\n" +"To search for methods involving 'word'"; private static Pattern p=Pattern.compile("\\w+\\."); public static void main(String[] args){ if(args.length<1){ System.out.println(usage); System.exit(0); } int lines=0; try { Class<?> c=Class.forName(args[0]); Method[] methods=c.getMethods(); Constructor[] ctors=c.getConstructors(); if(args.length==1){ for(Method method:methods){ System.out.println(p.matcher(method.toString()).replaceAll("")); } for(Constructor ctor:ctors){ System.out.println(p.matcher(ctor.toString()).replaceAll("")); } lines=methods.length+ctors.length; }else{ for(Method method:methods){ if(method.toString().indexOf(args[1])!=-1){ System.out.println(p.matcher(method.toString()).replaceAll("")); lines++; } } for(Constructor ctor:ctors){ if(ctor.toString().indexOf(args[1])!=-1){ System.out.println(p.matcher(ctor.toString()).replaceAll("")); lines++; } } } } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
输入的第一项是你用来加载的类的全限定名称,第二项是用来过滤该类或其继承类的方法:
你可以通过输入:java.net.Socket 或者 java.net.Socket Object来看输出结果的不同。
发表评论
-
MapReduce
2011-03-07 11:55 18621.什么是MapReduce? MapRedu ... -
java Web
2010-10-20 19:55 62response.sendRedirect(): Web服务 ... -
JDK动态代理
2010-10-05 14:12 2406注意在使用JDK提供的动态代理要求我们的目标对象必须实现接 ... -
如何判断两个类之间的差异
2010-08-16 09:35 1028代码实现 package net.mindview.util ... -
HashSet和散列码的研究
2010-08-10 19:13 1615散列表(Hash table,也叫 ... -
持有对象Arrays.asList异常解决办法
2010-08-08 17:50 1281添加一组元素 package com.day1; im ... -
java编程思想 IO13 源码 文件解压缩
2010-05-09 15:21 1603package com.io; import java.io ... -
java编程思想 IO12 源码 文件加锁
2010-05-09 12:37 1873package com.io; import java.io ... -
java编程思想 IO11 源码 内存映射访问与性能
2010-05-08 21:32 1875package com.io; import java. ... -
java编程思想 IO10 文件操作源码
2010-05-08 16:05 1241package com.dirlist; import ... -
java编程思想 IO9 文件操作源码
2010-05-06 22:00 1020缓冲器的详细应用: package com.dirlist; ... -
java编程思想 IO8 文件操作源码
2010-05-06 20:24 1010通道与缓冲器的探究 pa ... -
java编程思想 IO7 文件操作源码
2010-05-06 09:42 1393希望大家留言一起讨论 ... -
java编程思想 IO6 文件操作源码
2010-05-05 23:26 1666package com.dirlist; import ... -
java编程思想 IO5 文件操作源码
2010-05-05 11:24 1428package com.dirlist; import ... -
java编程思想 IO4源码
2010-05-03 17:24 833目录的检查及创建 package com.dirlist; ... -
java编程思想 IO3源码
2010-05-03 16:27 1214利用策略设计模式来进行目录的遍历和文件的过滤 package ... -
java编程思想 IO2源码
2010-05-03 15:32 1171package net.mindview.util; impo ... -
java静态内部类
2010-05-03 11:31 2062引用别人的博客 在一 ... -
java编程思想 IO1源码
2010-05-03 09:48 1335目录列表器与目录过滤器的运用 package com.dirl ...
相关推荐
java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者能够在运行时动态地获取类的信息(如类名、方法名、参数类型)并调用方法,创建对象,甚至...
JAVA反射机制应用 JAVA反射机制是JAVA语言中的一种动态机制,它能够在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。这种动态获取的信息以及动态...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...
Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中在java.lang.reflect包下,包括Class、Constructor、Method和...
### Java反射机制深入理解 #### 一、反射机制概述 Java反射机制是一种强大的工具,它允许程序在运行时检查和操作任何类、方法、构造函数和字段等元素。这种能力对于构建灵活的应用程序和框架非常有用,特别是那些...
Java反射机制是Java语言提供的一种强大工具,它允许在程序运行时动态地获取类的信息以及对类的对象进行操作。在Java中,静态编译时类型检查确保了代码的稳定性,但有时我们需要在运行时根据需求动态地创建对象、调用...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...
Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...
这篇博文"Java反射机制学习(二)"可能深入探讨了如何利用反射进行动态类型处理、访问私有成员以及创建对象等核心概念。在这里,我们将详细讨论Java反射的基本用法及其在实际开发中的应用。 1. **什么是反射**: ...
java反射机制和动态代理的原理,熟悉反射机制和动态代理
### Java反射机制详解 #### 一、Java反射机制概述 Java反射机制是Java语言的一个重要特性,它允许程序在运行时获取类的信息并操作对象。Java反射机制的主要作用包括:获取类的所有属性和方法、构造动态实例、调用...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。这种机制使得Java具有高度的灵活性和动态性,可以在编译时未知类的情况下进行类的加载、实例化、方法调用等操作...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这个特性使得Java具备了高度的灵活性,能够在运行时动态地发现和使用类的属性和方法,即使这些信息在编译时...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、字段和方法的信息,打破了通常编译时静态绑定的限制。通过反射,我们可以动态地创建对象,调用方法,访问和修改字段值,甚至...
### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射机制相关的题目。这是因为Java反射机制不仅是Java语言的一项重要特性,也是理解Java动态特性的关键所在。通过本文,我们将深入探讨Java反射...
java反射机制核心代码,小弟一直弄不明白,怎么通过反射来调用私有成员方法,看了这个后,你可以随心调用private方法,和属性,记得添加setAccessable(true),哦,要不还是不行,如:method.setAccessable(true);
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。通过反射,开发者可以在程序执行时发现并访问类的字段(fields)、方法(methods)以及构造器(constructors),...