java反射技术
Last modified:2013-04-06 23:45:44
***************************************
获得Class对象的方法:
Person.class:类名.class
new Person().getClass():对象.getClass()
Class.forName("java.lang.String"):Class.forName(完整类名)。(作用:获得类的字节码。有两种情况:如果这个类在内存中,则直接返回;如果内存中没有则通过类加载器加载到虚拟机内存中。以后要得到这个字节码就不用再加载了。在反射中主要使用这种方法,因为在写源程序的时候还不知道类的名字,也就是说我们可以使用一个变量来代替。)
一个字节码可以创建出多个实例对象来。
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。
只要是类型就对应一个Class实例对象。有九个预定义的Class对象:八个基本类型加一个void(空类型)。
Primitive Data Type:原生数据类型。
int.class.isPrimitive():isPrimitive(原始的)是否是基本数据类型。
Integer.TYPE:代表他所包装的那个基本数据类型的那份字节码,也就是基本数据类型的 Class对象(int.class)
数组不是基本数据类型(Primitive Data Type),是引用类型,判断是否是数组可以使用:isArray();
总之,只要是在源程序中出现的类型,都有各自的一份Class实例对象,例如:int[],void,String,int ……
反射(Reflect):
反射:就是把java类中的各种成分映射成相应的java类。
例如:一个java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类,表示java类的Class类显然要提供依系列的方法,来获得其中的变量,方法,构造函数,修饰符,包等信息,这些信息就是用相应类的实例对象表示,它们是Field,Method,Contructor,Package等等。
通过反射,我们可以得到各个类中相应成分的Class对象。
编译时与运行时的区别:
编译时,检查代码的语法错误。不能检查逻辑错误!
运行时,如果代码存在逻辑错误,那么就会报错。
Alt+shift+s:快速生成代码。
Constructor:
我们可以通过反射创建对象。
String str = new String("abc");
String str =
(String) String.class.getConstructor(StringBuffer.class)
.newInstance(new StringBuffer("abcde"));
如果通过空参数的构造方法创建一个对象,还可以通过Class.newInstance()方法。
例如:
String str =
(String)Class.forName("java.lang.Stirng").newInstance();
Field:
获得Field类对象:Field field = pt1.class.getField("字段名");
获得某个实例的字段值:field.get(pt1);
getField方法不能获得私有字段,想要获得可以通过getDeclaredField("字段名")(不论该字段可见不可见都能获得该字段的对象)。想要获取字段的值,可以先执行field.setAccessible(ture);然后再get(pt1),这就是所谓的暴力反射。
英文词汇:declared:声明的;Accessible:可接近,可到达;
public static void changeChar(Object obj) throws Exception { Field[] fields = obj.getClass().getDeclaredFields();//能看见所有的字段,包括私有的。 for (Field field : fields) { if (field.getType() == String.class) { field.setAccessible(true);//暴力反射; String oldValue = (String) field.get(obj); String newValue = oldValue.replace('a', 'b'); field.set(obj, newValue); } } }
对字节码的比较用“==”!当然用equals也可以。但是“==”更加合适!因为是同一份字节码。
Method:
方法与对象是没有关系的。我们通过获得方法对象后,再通过这个方法对象调用某个类执行这个方法。也就是先得到这个方法,然后在针对某个对象去调用这个方法。
通过反射的方式获得某个字节码里的方法对象,再用这个方法对象去作用于某个对象。
invoke:恳求;
调用方法:
通常:str.charAt(1);
反射:
Method methodCharAt =Class.forName("java.lang.String").getMethod("charAt",int.class); methodCharAt.invoke(str,1);
由方法去调用对象执行该方法。这是面向对象的思维模式,其实只是这个方法对象给str对象发出了一个恳求,请求被执行。之后str对象就发出一个执行该方法的信号。比如:司机刹车,司机其实是踩了刹车板,给汽车发了一个信号,汽车就进行刹车。到底是如何将车停下的,汽车的刹车方法最清楚!这里就是方法恳求被执行,对象发出信号执行它!
注意:如果Method对象第一个参数为null,说明这个Method对象对应一个静态方法。
相关推荐
在这个“JDBC_Java反射技术入门”资源中,初学者可以了解到如何使用Java进行数据库操作的基础知识,包括连接数据库、执行SQL语句、处理查询结果等。 1. **JDBC基础**: - **加载驱动**:在使用JDBC之前,我们需要...
在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用...
Java反射技术是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象以及它们的方法和属性。通过反射,开发者能够获取关于类的信息,并且能够在运行时动态地创建对象和调用方法,这为编程带来...
Java反射技术是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息,甚至能够动态调用方法和创建对象。这个技术的核心在于`java.lang.reflect`包中的类,如`Class`、`...
Java反射技术浅谈 Java作为一种广泛使用的编程语言,它的设计目标之一是提供一种灵活的编程方式,使程序能够在运行时识别和操作对象。为了实现这一目标,Java语言引入了反射机制,使得开发者能够动态地探索和操作...
java反射技术应用的很广泛,多看源码,对理解java反射的理解会有很好的认识,这个源码有我自己的理解在里边
### Java反射技术详解 #### 引言 Java反射技术,作为Java编程语言中的一项核心特性,赋予了Java程序在运行时动态操作类的能力。通过反射,程序可以动态地获取类的信息,创建对象,访问和修改类的成员变量,以及...
Java反射技术指的是在运行时动态地获取类的信息、调用对象的方法、操作类的属性等能力。通过反射,程序可以在运行时检查类、实例化对象、调用方法、获取和设置属性,甚至可以动态修改类的结构。 Java反射技术的核心...
Java反射技术是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、对象等的内部信息,包括但不限于类名、方法名、参数类型以及字段。通过反射,开发者可以实现动态调用方法、访问私有成员、创建...
Java反射技术浅谈 Java反射技术是一种可以访问、检测和修改程序本身状态或行为的能力。通过反射,Java程序可以加载一个运行时才知道名称的类,得到其完整内部信息,并创建其对象,或对其属性设值,或调用其方法。...
本文将详细介绍Java反射技术的核心概念及其应用。 #### 核心概念 1. **Class类**:Java反射的基础类是`Class`,每个类都对应一个`Class`实例。可以通过多种方式获取`Class`对象,例如使用类名直接获取(`MyClass....
Java反射技术是Java编程语言中一个强大的特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。通过反射,我们可以动态地获取类的信息(如类名、属性、方法等)并进行调用,甚至在不知道具体...
Java反射技术原理与用法实例分析 Java反射技术是Java语言中的一种动态语言技术,能够在运行时解析外部对象的信息。通过反射技术,可以动态地获取类以及类中的成员,并可以调用该类成员。 产生反射技术的需求: 在...
总结,Java反射技术是其强大之处,它赋予了Java代码在运行时动态操作类和对象的能力。但使用时需谨慎,平衡灵活性和性能,避免过度使用导致代码难以管理和效率下降。在理解其原理和应用场景的基础上,适当使用反射...
Java反射技术是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、字段和方法。在Java中,反射主要用于在未知类名或动态加载类的情况下进行编程,提供了对类的元数据(metadata)的访问,使得...
运行程序,指定一个要分析的类名称,如java.lang.Double,输出类中声明的属性、方法、构造函数等。
在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用...
基于Java反射技术实现简单IOC容器 Java反射技术是Java语言中一个非常重要的技术,通过反射技术可以在运行时检查和修改类的结构和行为。IOC容器是控制反转的缩写,全称是Inverse of Control,即控制反转。它是一种...
利用Java反射、IO、图形化技术相结合实现的一个类搜索小工具,可以直观的看到效果,代码不多,注释齐全,适合初阶段学习。
使用 Java 反射封装 JavaBean <br> 说明:这个程序在没有使用Hiberante时挺有用的 需要一个数据库查询语句 对应的JavaBean的全名(现在是Class,原来Class.getName()) 返回List包含多个JavaBean