黑马程序员_java 反射

 ------- android培训、java培训、期待与您交流! ----------

反射
反射只要知道其类对象就可以获得其内部所有属性对象和方法对象。只要知道其类的实例对象就可以获得其类对象。
Class类。不同于关键字class,他是对java中各个类的封装,是对所有类的抽象描述,而某一个具体的类就是其实例对象。同一个类的实例对象获得的类类型对象是同一个,是由同一个字节码地址类文件实例化出的对象。
类名的获取方法,其实是类类型对象的获取,获取Class的该类实例对象,这个对象!=该类,只是内容为该类还包含该类的字节码地址。类有类,类的成员也有对应的类。类的类中封装了获取类中成员类的对象的方法。如下面的Construct类的对象就是该类中的构造函数,可以通过获取该类的类对象,即内容为该类的类对象,并调用其中的方法或得该类中Construct类的对象,该对象以构造函数为其内容。这里充分体现了面向对象的思想,万物皆对象。
getclass();
Class.forName("");
八种基本数据类型的获取方法,int.class;String.class;void也是一个类对象void.class;这些都是Class类的一个实例对象类
类名的判断
isPrimitive();是否是基本类型;如String.class.isPrimitive()返回false;String不是基本数据类型
与基本数据类型包装类类型比较;如int.class==Interger.TYPE;(后者是类中封装的静态字段)
Class.isArray();判断类时否是一个数组。
总之只要是在源程序中出现的类型,都有各自的Class实例对象。

反射就是把Java类中的各种成分映射成相应的Java类。即将类中的各个成员抽象成相应的Java类。
如Field,Method,Contructor,Package等

Constructor类即构造方法类。
Constructor[] getConstructors();获取所有的构造方法对象,返回的是一个数组。
Constructor getConstructor(param);获取一个构造方法对象,参数就是参数类型类对象
获取构造方法对象之后再通过newInstance(initargs)获得一个新的对象实例,参数为指定初始化参数
如String.class.getConstructor(int.class);

成员变量Field类
int x=5;
Field fieldY=person.getClass().getField("x");这里fieldY的值并不是5;而是x的字节码值。就像是把变量x当做对象,而Field就是他的类,fieldY就是指向变量x对象的引用,x的值是x对象的内容,fieldY的值是对象x的地址,比较时==比较的是地址,equals重写之后比较的是内容,此处fieldY!==x,因为==比较的两端前者是地址值后者是x对象的内容变量x值所以不相等。

根据类名调用另一个程序的main方法
首先获得该类类对象,然后通过getMethod方法或得Method类对象。
Method类对象中的innvoke方法开始调用。

数组的反射
数组也是一种类型,也具有类类Class。与Object类的关系
可以获得数组类Array类,另有一个Arrays工具类其中有对数组对象操作的方法。这样就可以借助反射获得数组类并通过Arrays类直接操作数组,比如遍历不用再写for循环去遍历了。

反射的实用,实现框架功能。即事先不知道要调用的类,写好框架之后通过事先配置好的文件利用反射技术去调用事后添加的类。事后添加的类只需要符合配置文件即可,与事先写好的框架结合。

时间: 2024-11-07 09:15:21

黑马程序员_java 反射的相关文章

黑马程序员_Java反射机制

一切的操作都将使用Object完成,类,数组的引用都可以使用Object来接收 1,认识Class类 以前要是想知道一个类中的属性,成员变量,方法等等的信息的话,需要通过new这个类的对象才能得到这些信息,但是在Java中,也允许一个实例化对象找到一个类的完整的信息,这个类就是Class类,Class类是继承Object类的. 正常方式:  引入需要的"包.类"名称 >取得实例化对象 反射方式:  实例化对象>得到完整的"包.类"名称 getClass(

黑马程序员_java反射的简单使用

反射概述: 一个已经写好的应用程序,后期要添加新功能,但一般无法获取该应用程序的源码,无法直接在该应用程序中用new创建对象,该怎么办?既然子类不确定,可以通过对外提供配置文件的形式,将不确定的信息存储到配置文件中即可.该应用程序需要在设计时写好如何读取配置文件信息?怎么做呢,先存储指定的子类名,根据具体的名称找该类并进行加载和对象的创建,这些动作都在前期定义软件时写好. 没有类之前就将创建对象的动作完成了.这就是动态的获取指定的类,并使用类中的功能,这就是反射技术.反射技术的出现大大的提高了程

黑马程序员_JAVA 基础加强学习笔记

一.面向对象 (一)继承  1.继承的好处: (1) 提高了代码的复用性. (2) 让类与类之间产生了关系,提供了另一个特征多态的前提. 注意: 子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();  如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数. 如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数. 2.final特点

黑马程序员_Java基础加强(下)

8.注解类 注解相当于一种标记,加了注解就等于打上了某种标记,没加就等于没打特殊标记,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记就去干什么事,标记可以加在包.类.字段.方法,方法的参数以及局部变量上. 注解的应用结构图: 为注解增加属性 定义基本类型的属性和应用属性 在注解类中增加String color(); @MyAnnotation(color = "red") 用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法 MyAnno

黑马程序员_Java基础加强(上)

1.静态导入 静态导入是jdk1.5版本以后出现的新特性,一般是指导入静态方法,如:import static java.lang.System.out 是指导入系统输出的静态方法. 例: import static java.lang.System.out //导入java.lang包下的System类的静态方法out public class StaticImport { public static void main(String[] args) { int x=1; x++; out.p

黑马程序员_Java高新技术

1  JDK5的新特性 1.1 静态导入       在API中那些不需要new对象的类,可以在类文件的开头,import static java.lang.Math.*;这里把Math中的所有的静态方法都导入了,在类中不需要调用Math类就能直接用Math的方法了 package cn.wjd.staticimport; import static java.lang.Math.*; public class StaticImport { public static void main(Str

黑马程序员——高新技术---反射

黑马程序员——高新技术---反射 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 反射把Java类中的各种成分映射成相应的Java类,例如一个Java类中用一个Class类的对象表示,一个类中的组成部分:成员变量,方法,构造方

黑马程序员_Java IO(下)

1,字符编码 在Java程序的开发中最常见的是ISO8859-1,GBK/GBK2312,unicode,UTF编码. ISO8859-1:属于单字节编码,最多只能表示0-255的字符范围,主要在英文上应用. GBK/GB2312:中文的国际编码,专门用来表示汉字,是双字节编码,如果在此编码中出现中文,则使用ISO8859-1编码,GBK可以表示简体中文和繁体中文,而GB2312只能表示简体中文,GBK兼容GB2312 unicode:Java中使用此编码方式,是最标准的一种编码,使用十六进制进

黑马程序员_Java多线程

- - - - - android培训.java培训.期待与您交流! - - - - - - 进程:正在进行中的程序.其实进程就是一个应用程序运行时的内存分配空间.进程负责的是应用程序的空间的标示. 线程:其实就是进程中一个程序执行控制单元,一条执行路径.线程负责的是应用程序的执行顺序. 一个进程至少有一个线程在运行,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序. 每个线程在栈区中都有自己的执行空间,自己的方法区.自己的变量. jvm在启动的时,首先有一个主线程,负责程序的执行,