码迷,mamicode.com
首页 > 其他好文 > 详细

黑马程序员_反射(一)

时间:2015-04-19 14:27:39      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:

/*
1、反射:反射处理的对象是内存中的java类,即一个类的字节码对象。
     该字节码对象是这个类在内存中的代表。
            一个类是否加载到内存中来,就看内存中是否有这个类的字节码。
           该字节码对象是用来创建其代表的类的实例对象的。
           这个字节码对象也是用一个java类来描述的,叫做Class类,即Class类是用来描述java类的,java类这 
           一类事物有“类名”,“构造方法”,“方法列表”,“字段列表”,“访问权限”,“父类关系”,“所实现的接口”等信息需要描述。


1.1、处理方式有:获得"类名","构造方法","成员方法","成员变量"。这些通过字节码对象,即Class对象获得的东西也被封装成
对象,用类来描述。比如类名是普通的String,构造方法是Constructor类,成员方法是Method类,成员变量是Field。

       获得类中的这些“成分”有什么作用呢?
获得一个类的构造方法,可以通过该构造方法创建这个类的对象。
获得一个类的成员方法,可以在该类的对象或者该类上调用该方法。
获得一个类的字段,可以在查看一个具体的该类对象的这个属性的值,即操作一个具体对象的这个属性。

1。2、反射的应用:
    已经编写好的“类”的使用,分为两种:一种是“类”去调用“别的类”,一种是“别的类”去调用这个“类”。
而反射解决了,“类”去调用“别的类”的问题。在“别的类”还未知之前,完成“类”对“别的类”的调用,即通过参数的
方式,完成“类”对“别的类”的调用。————————这就是框架要解决的问题。

反射的最大应用就是作为开发框架的基础。比如:Struts,Hibernate,Spring等java开源框架。

{
什么是框架?
  框架就好比一个毛坯房,拿过来一个毛坯房,自己安上门窗,装修一下后就可以变成一个完整的可以居住的房子了,
而安装门窗和装修就可以相当于程序员在框架基础上继续完成开发,完成一些具体类的编写,这些具体类用来
供框架调用。使用框架就相当于买毛坯房,买毛坯房,降低了建房的难度,提高了建房的效率。使用框架降低了
开发的难度,提高了开发的效率,所以实际开发中大多使用框架来开发。

框架和类库的区别?

  类库是一个大的笼统的概念,简言之,就是成千上万个类,很多个类被有机的组织在一起,打包起来。比如JDK1.5,
java开发包,这就是一个类库。JDK中包含JRE,JRE是java运行环境,里面有对java语言的支持。而除去JRE之外的
jar包,就是一个个的类库。这些类库为java程序提供的支持,使得开发过程容易些,比如java.util包中提供很多
工具类。java.awt包提供对图像化界面开发的支持和工具,java.io包提供对输入输出的支持和工具。这些包就是
类库。
  类库为开发提供支持,提供便利,是通过“被调用”的方式来做到的。类库中的大多数类都是作为“被调用类”来在
我们的程序中使用的。它们是没有生命的,是为我们来服务的。
  而框架是相当于将一个应用程序的主体给开发完了,只留下一些更具体的细节需要我们来完善。框架相当于毛坯
房,是半成品,对于应用程序是相当程序的主体框架,这些主体框架上留有一个个接口(门窗),供程序员
来添加自己的类和代码(门和窗)。框架是有生命的,我们是为框架服务的,共同来完成了一个应用程序。
框架是用来调用程序员自己写的类和代码的。类库是被程序员的类来调用的。

框架和工具类的区别?

  工具类,是类库中的一类,是被程序员的类调用的,框架是调用程序员写的类的。工具类相当于门窗上的锁,
这些锁被门窗来调用。

当然框架的开发也是在类库的基础上完成的。都需要类库的支持。

}

      字节码对象 《=》 Class类的实例 《=》 描述类型的对象

2、Class类是用来描述类型的,不管是自定义的类型(类),还是8个基本数据类型,还是数组、void都是类型,
即用来“描述数据类型”的类。凡是程序中出现的类型有各自的Class类实例对象,包括int[],void,它们的实例名称是
类型.class,比如:int[].class,void.class,int.class

2.1 Class对象的获取方式:

Class类没有公共的构造方法,无法在外部创建Class对象。Class 对象是在加载类时由 Java 虚拟机以及通过
调用类加载器中的 defineClass 方法自动构造的。

Class 对象是在加载类时由 “Java 虚拟机”以及通过调用“类加载器”中的 defineClass 方法自动构造的。

@1、 类名.class //类字面值 例:Class cls1 = String.class 。
@2、 对象.getClass() //对象的getClass()方法 例: new StringBuffer().getClass()
@3、 Class.forName(类完整限定名); //Class类的静态方法 例: Class.forName("java.lang.String")

获得了Class对象就相当于获得一个 “类” ,也相当于获得了一种 “类型” 。

【Class 类的实例表示正在运行的 Java 应用程序中的类和接口以及数组和基本数据类型等。枚举是一种类,注释是一种接口。
每个数组属于被映射为 Class 对象,所有具有相同元素类型和维数的数组都共享该 Class 对象。
基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也
表示为 Class 对象。】


2.2 JVM预定义的9个Class实例对象:(boolean、byte、char、short、int、long、float 和 double)和关键字 void
它们都是原始数据类型,即Class.isPrimitive()返回true,而数组不是,一个Class实例是否是数组类型,
可以用方法Class.isArray()判断


反射API:所涉及的类有 Class、Constructor、Field、Method

具体使用可以查看帮助文档,在接下来的反射中讲解具体使用例子

*/
利用反射获取一个类的构造方法:

package cn.ccec ;

import java.lang.reflect.*;

class  ReflectTest
{
	public static void main(String[] args) throws Exception
	{
		System.out.println("Helloddddd World!");
		getConstructor();
	}
	public static void getConstructor()throws Exception
	{
		Class cls = String.class;//得到字节码对象
		Constructor constructor = cls.getConstructor(StringBuffer.class);//得到构造函数
		String str = (String)constructor.newInstance(new StringBuffer("abc")); //利用构造函数创建对象
		System.out.println(str);
		System.out.println(void.class.isPrimitive());//测试是否是原始类型
	}
}

  

黑马程序员_反射(一)

标签:

原文地址:http://www.cnblogs.com/wllbelief-win/p/4439048.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!