`
在水伊方
  • 浏览: 106899 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

黑马程序员-java高新技术03

 
阅读更多

 ----------------------android培训java培训、java学习型技术博客、期待与您交流!----------------------

 

反射的基石——Class类:

Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class,Class类的各个实例对象分别对应的是各个类在内存中的字节码。一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示,这些对象显然具有相同的类型,这个类型就是Class类型。 

 

有3种方法可以得到各个字节码对应的实例对象

1.类名.class,例如,System.class

2.对象.getClass(),例如,new Date().getClass()

3.Class.forName("类名"),例如,Class.forName("java.util.Date");

 

 

反射:

反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是FieldMethodContructorPackage等等。

 

 

===============================Constructor类=============================== 

 

1.Constructor类代表某个类中的一个构造方法 

得到某个类中的所有的构造方法(不包括私有的构造方法): 

Constructor[ ] constructors= Class.forName("java.lang.String").getConstructors(); 

得到某一个构造方法:

Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);

如果getConstructor()方法中没有任何值,说明调用的是默认的构造方法  

 

创建实例对象:

通常方式:String str = new String(new StringBuffer("abc")); 

反射方式:String str = (String)constructor.newInstance(new StringBuffer("abc"));

 

 

 

=================================Method类================================

 

2.Method类代表某个类中的一个成员方法

得到某个类中的所有成员方法(不包括私有的成员方法):

Method[ ] methods = Class.forName("java.lang.String").getMethods();

得到某一个成员方法:

Method charAt = Class.forName("java.lang.String").getMethod("charAt", int.class);

 

如果传递给Method的对象的invoke()方法的第一个参数为null,则说明该Method对象对应的是一个静态方法

 

调用方法:

通常方式:String str = new String(new StringBuffer("abc"));

反射方式:System.out.println(charAt.invoke(str, 1));

 

 

==================================Field类================================

 

3.Field类代表某个类中的成员变量

得到某个类中的所有成员变量(不包括私有的成员变量):

Field[] fields = Class.forName("java.lang.String").getFields();

得到某一个成员变量:

Field field = Class.forName("className").getField("fieldName");

 

以下面的Person为例

public class Student { public String name; }

获得变量:

通常方式:System.out.println(new Student().name);

反射方式:System.out.println(Class.forName("cn.itcast.day1.Student").getField("name").

                                             get(new Student()));

 

 

数组的反射: 

具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象 

int[] a1 = new int[3];

int[] a2 = new int[4];

System.out.println(a1.getClass() == a2.getClass()); //返回true 

 

代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class

int[] a1 = new int[3];
System.out.println(a1.getClass().getSuperclass().getName()); //java.lang.Object
 

 

基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用

int[] a1 = new int[3];
Object[] aobj1 = a1;    //int是基本类型,不是Object类型,会报错
String[] a2 = new String[]{"a", "b", "c"};
Object[] aobj2 = a2;

 

利用反射获取数组的值:

	private static void readObject(Object obj) {
		if (obj.getClass().isArray()) {
			int len = Array.getLength(obj);
			for (int i = 0; i < len; i++){
				System.out.print(Array.get(obj, i));
			}
		} else {
			System.out.println(obj);
		}
	}

 

 

----------------------android培训java培训、java学习型技术博客、期待与您交流!----------------------

 

详情请查看:http://edu.csdn.net/heima

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics