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类型信息——反射机制的更多相关文章

  1. Java基础 -- 深入理解Java类型信息(Class对象)与反射机制

    一 RTTI概念 认识Claa对象之前,先来了解一个概念,RTTI(Run-Time Type Identification)运行时类型识别,对于这个词一直是 C++ 中的概念,至于Java中出现RT ...

  2. Java类型信息(RTTI和反射)

    要想在IT领域站得住脚,必须得不断地学习来强化自己,但是学过的技术不实践很容易便被遗忘,所以一直都打算开个博客,来记录自己学的知识,另外也可以分享给有需要的人! 最近在学习反射,为了更好地理解反射,就 ...

  3. 黑马程序员——【Java高新技术】——反射机制

    ---------- android培训.java培训.期待与您交流! ---------- 一.概述 1.Java反射机制:是指“在运行状态中”,对于任意一个类,都能够知道这个类中的所有属性和方法: ...

  4. Java 中的反射机制

    JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为ja ...

  5. JAVA类型信息——Class对象

    JAVA类型信息——Class对象 一.RTTI概要 1.类型信息RTTI :即对象和类的信息,例如类的名字.继承的基类.实现的接口等. 2.类型信息的作用:程序员可以在程序运行时发现和使用类型信息. ...

  6. 浅说Java中的反射机制(二)

    写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...

  7. 浅说Java中的反射机制(一)

    在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...

  8. 深入理解Java中的反射机制

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...

  9. 谈一谈java里面的反射机制

    首先来看看百度百科中是如何定义的: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方 ...

随机推荐

  1. linux安装ruby

    可以使用 sudo apt-get install ruby 的方式安装,但一般这种方式安装的版本比较旧.另外也可以用以下方式安装新的版本. 1. 首先更新软件源,使用国内的.参考:http://wi ...

  2. 在meteor中如何使用ionic组件tabs,及如何添加使用cordova plugin inappbrower

    更新框架: meteor update meteor框架的优点不言而喻,它大大减轻了App前后端开发的负担,今年5月又获得B轮2000万融资,代表了市场对它一个免费.开源开发框架的肯定.cordova ...

  3. Go语言示例-函数返回多个值

    Go语言中函数可以返回多个值,这和其它编程语言有很大的不同.对于有其它语言编程经验的人来说,最大的障碍不是学习这个特性,而是很难想到去使用这个特性. 简单如交换两个数值的例子: package mai ...

  4. Qt的QTabelWidget

    QTableWidget的用法总结  http://blog.csdn.net/zb872676223/article/details/39959061 [Qt]在QTableWidget中添加QCh ...

  5. verilog语法之memory存储器

    命名规则:reg[n-1:0] 存储器名[m-1:0] 说明:这是m个n位的存储器,该存储器的地址范围是0-(m-1) 举例:reg[3:0] memo[255:0] 说明:这是256个4位存储器,该 ...

  6. Java Day 16

    基本数据类型包装类 Integer.MAX_VALUE  Integer.parseInt(); intValue(); valueOf(); 自动装拆箱 如果是一个字节范围,数据共享 字符串中 数值 ...

  7. 微软职位内部推荐-SDEII for Windows Phone Apps

    微软近期Open的职位: Job title: Software Design Engineer II Location: China, Beijing Division: Operations Sy ...

  8. Ant学习---第一节:Ant安装和简单使用

    一.下载 ant 插件,路径如下: http://ant.apache.org/bindownload.cgi 二.安装 ant 插件,解压下载下来的 ant 插件,配置环境变量(最好系统环境变量), ...

  9. 软件工程——四则运算3(C#)

    一.设计思想 设计两个窗体,在第一个窗体中选择功能参数,在第二个窗体中显示所出题目. 二.源代码 Form1.cs: using System; using System.Collections.Ge ...

  10. 四则运算出题器(C++)-BUG修复

    定制题目数量这个功能测试: (1)输入题目数为负数时: 可正确处理: (2)输入题目数量为0时: 可正确处理: (3)输入题目数量为小数时: 程序运行出错: 错误分析: 因为代码中题目数量的变量Que ...