JAVA类型信息——反射机制
JAVA类型信息——反射机制
一、反射机制概述
1、反射机制:就是java语言在运行时拥有的一项自我观察的能力,java通过这种能力彻底了解程序自身的情况,并为下一步的动作做准备。
2、反射机制的功能
1) 在运行时判断任意一个对象所属的类。
2) 在运行时构造任意一个类的对象(新建类的实例)。
3) 在运行时判断任意一个类所具有的成员变量和方法。
4) 在运行时调用任意一个对象的方法。
3、反射机制的支持
在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中。
|
类名 |
功能概述 |
|
AccessibleObject |
该类是域(field)对象、方法(method)对象、构造函数(constructor)对象的基础类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。 |
|
Array |
提供动态地生成和访问JAVA数组的方法 |
|
Constructor |
提供一个类的构造函数的信息以及访问类的构造函数的接口。 |
|
Field |
提供一个类的域的信息以及访问类的域的接口。 |
|
Method |
提供一个类的方法的信息以及访问类的方法的接口。 |
|
Modifier |
提供了 static 方法和常量,对类和成员访问修饰符进行解码。 |
|
Proxy |
提供动态地生成代理类和类实例的静态方法。 |
|
ReflectPermision |
指定权限。 |
4、获取Class对象的三种方法
|
方法 |
实例 |
|
Object:getClass() |
MyObject ob_aMyObject; Class ob_aClass = ob_aMyObject.getClass(); |
|
Class.forName() |
Class ob_bClass = Class.forName(“MyObject”); |
|
类字面常量 .class |
Class ob_cClass = MyObject.class; |
5、Method类(方法对象)
|
方法 |
功能 |
|
getMethods() |
获得类的所有公共方法列表。 |
|
getMethod(String name, Class[] params) |
使用特定的参数类型,获得命名的公共方法 |
|
getDexlaredMethods() |
获取类中定义了的方法列表。 |
|
getDeclaredMethod(String name, Class[] params) |
使用特写的参数类型,获得类声明的命名的方法 |
6、Constructor类(构造器对象)
|
方法 |
功能 |
|
getConstructors() |
无参,获得类的所有公共构造函数列表。 |
|
getConstructors( Class[] prarams) |
获得使用特殊的参数类型的公共构造函数列表。 |
|
getDeclaredConstructors( Class[] prarams) |
获得使用特定参数类型的公共构造函数(与接入级别无关)。 |
|
getDeclaredConstructors() |
获得类的所有构造函数(与接入级别无关)列表。 |
7、Field类(属性对象)
|
方法 |
功能 |
|
getField(String name) |
获得命名的公共字段 |
|
getFields() |
获得类的所有公共字段列表。 |
|
getDeclaredField(String name) |
获得类声明的命名的字段。 |
|
getDeclaredFields() |
获得类声明的所有字段列表。 |
二、应用举例
1、获取系统Date类的方法
import java.lang.reflect.Method;
public class DateMethodsRtti {
public static void main(String[] args) throws Exception {
Class<?> ob_aClass = Class.forName("java.util.Date");
Method[] ob_aMethod_Array = ob_aClass.getDeclaredMethods();
for(int i=0; i<ob_aMethod_Array.length; i++) {
System.out.println(ob_aMethod_Array[i].toString());
}
}
}
运行结果:显示Date所有的方法。
2、下例中的copy()显示了创建一个与参数对象具有同样类型的对象,并且把参数对象中的所有属性拷贝到新建的对象中。
class Customer{
private Long id;
private String name;
private int age;
public Customer() {}
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
public Long getId() {return id;}
public void setId(Long id) {this.id = id;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public int getAge() {return age;}
public void setAge(int age) {this.age = age;}
}
public class ReflectTester {
public Object copy(Object object) throws Exception{
//获得对象的类型。
Class<?> ob_aClass = object.getClass();
System.out.println("Class : " + ob_aClass.getName());
//通过默认构造方法创建一个新的对象。
Object ob_aObject = ob_aClass.getConstructor(new Class[] {}).newInstance(new Object[] {});
//获得对象的所有属性
Field[] ob_aField_Array = ob_aClass.getDeclaredFields();
for(int i=0; i<ob_aField_Array.length; i++) {
Field ob_aField = ob_aField_Array[i];
String fieldName = ob_aField.getName();
String firstLetter = fieldName.substring(0, 1).toUpperCase();
//获得和属性对应的getXXX()方法的名字
String getMethodName = "get" + firstLetter + fieldName.substring(1);
//获得和属性对应的setXXX()方法的名字
String setMethodName = "set" + firstLetter + fieldName.substring(1);
//获得和属性对应的getXXX()方法
Method getMethod = ob_aClass.getMethod(getMethodName, new Class[] {});
//获得和属性对应的setXXX()方法
Method setMethod = ob_aClass.getMethod(setMethodName, new Class[] {ob_aField.getType()});
//调用远对象的getXXX()方法
Object ob_bObject = getMethod.invoke(object, new Object[] {} );
System.out.println(fieldName + ":" + ob_bObject);
setMethod.invoke(ob_aObject, new Object[] {ob_bObject});
}
return ob_aObject ;
}
public static void main(String[] args) throws Exception{
Customer ob_aCustomer = new Customer("Tom", 21);
ob_aCustomer.setId(new Long(1));
Customer ob_bCustemer = (Customer)
new ReflectTester().copy(ob_aCustomer);
System.out.println("Copy information :" + ob_bCustemer.getId() + " " + ob_bCustemer.getName() + " " + ob_bCustemer.getAge());
}
}
运行结果:
Class : rtti.Customer
id:1
name:Tom
age:21
Copy information :1 Tom 21
网络文章推荐:http://blog.chinaunix.net/uid-24337578-id-177320.html
http://www.cnblogs.com/Quincy/archive/2011/06/19/2084557.html
JAVA类型信息——反射机制的更多相关文章
- Java基础 -- 深入理解Java类型信息(Class对象)与反射机制
一 RTTI概念 认识Claa对象之前,先来了解一个概念,RTTI(Run-Time Type Identification)运行时类型识别,对于这个词一直是 C++ 中的概念,至于Java中出现RT ...
- Java类型信息(RTTI和反射)
要想在IT领域站得住脚,必须得不断地学习来强化自己,但是学过的技术不实践很容易便被遗忘,所以一直都打算开个博客,来记录自己学的知识,另外也可以分享给有需要的人! 最近在学习反射,为了更好地理解反射,就 ...
- 黑马程序员——【Java高新技术】——反射机制
---------- android培训.java培训.期待与您交流! ---------- 一.概述 1.Java反射机制:是指“在运行状态中”,对于任意一个类,都能够知道这个类中的所有属性和方法: ...
- Java 中的反射机制
JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为ja ...
- JAVA类型信息——Class对象
JAVA类型信息——Class对象 一.RTTI概要 1.类型信息RTTI :即对象和类的信息,例如类的名字.继承的基类.实现的接口等. 2.类型信息的作用:程序员可以在程序运行时发现和使用类型信息. ...
- 浅说Java中的反射机制(二)
写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...
- 浅说Java中的反射机制(一)
在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...
- 深入理解Java中的反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
- 谈一谈java里面的反射机制
首先来看看百度百科中是如何定义的: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方 ...
随机推荐
- Spring框架中的IOC和DI的区别
上次面试被问到IOC和DI的区别时,没怎么在意,昨天又被问到,感觉有点可惜.今晚总算抽点时间,查看了spring官方文档.发现,IoC更像是一种思想,DI是一种行为.为了降低程序的耦合度,利用spri ...
- ASP.NET MVC掉过的坑_MVC初识及MVC应用程序结构
APS.Net MVC 浅谈[转] 来自MSDN 点击访问 MVC 理论结构 模型-视图-控制器 (MVC) 体系结构模式将应用程序分成三个主要组件:模型.视图和控制器. ASP.NET MVC 框架 ...
- 59.DDR3_IP核文件设置
在ISE软件生成DDR3 IP核时,会产生很多文件,其中user_design,example_design里面分别是用户接口文件和自带的仿真测试文件.在user_design里的rtl中,这些文件是 ...
- Python实现kNN(k邻近算法)
Python实现kNN(k邻近算法) 运行环境 Pyhton3 numpy科学计算模块 计算过程 st=>start: 开始 op1=>operation: 读入数据 op2=>op ...
- Labview实现字符串加密
Labview实现字符串加密 对字符串进行加密,规则是每个字母后移5 位 例如A 变为F,b 变为g,x 变为c,y 变为d- 实现效果 后端实现
- 2.1孙鑫C++
0.vc++6.0 工程---win32控制台程序 文件---c++ 1.建立结构体 #include <iostream.h> struct Point { int ...
- 说明&总目录
1. 说明 1.1 这是一个乱七八糟的博客,包含遇到的各类问题,甚至会有奇♂怪的东西~ 1.2 作者目前本科生,懒虫一只,喜欢吃喝玩乐看动漫,更喜欢睡觉 1.3 文章难免有错,欢迎指出 1.4 语死早 ...
- Quartz.NET Windows
Quartz.NET Windows 服务示例 想必大家在项目中处理简单的后台持续任务或者定时触发任务的时候均使用 Thread 或者 Task 来完成,但是项目中的这种需求一旦多了的话就得将任务调度 ...
- Kakfa
Kakfa分布式集群搭建 本位以最新版本kafka_2.11-0.10.1.0版本讲述分布式kafka集群环境的搭建过程.服务器列表: 1 2 3 172.31.10.1 172.31.10.2 17 ...
- 宣讲ppt的技巧
这是一个L运营商的项目,项目规模比较大,中兴的客户群体定位主要是电信运营商,运营商的项目做起来非常累,不是一般的小公司能玩的,一般项目要经过这几个过程,前期信息获得——技术交流引导——实验局测试——投 ...