Java基础(十一)-----Java的反射机制(一)

2014-11-24 03:05:41 · 作者: · 浏览: 0

Java面向对象无处不在

众所周知,Java是纯粹的面向对象程序设计语言,并且这种思想深入到Java的各个方面。“一切皆为对象”,如:每个类的字节码文件用Class类来代表,所有字段用Field类表示,方法则用Method方法表示。既然是面向对象思想,那么对于这些类,都提供了一些对象的操作的方法。这也是理解反射技术必须所必需的。

反射技术的应用背景

反射技术的应用背景:对于已经开发完成的程序(桌面程序或者是开源框架),如果在不改动程序源代码的情况下,想让用户或者其他开发者添加功能,使用反射技术将是不错的选择。

Class类

Class类是反射技术的基石――所有的反射都建立在Class之上。Java 虚拟机在程序运行时为所有的对象维护一个被称为运行时的类型标示,虚拟机会利用这些标示来跟踪对象的“足迹”。Class类就是用来访问和保存这些信息。得到Class类一般有三种方法。代码示例:
package com.reflect.demo;

public class ReflectDemo {

	/*
	 *Java反射机制是在运行状态中,对于任意一个类(class文件),都能知道这个类所有属性和方法
	 * 
	 */
	
	public static void main(String[] args) {
		
		
		System.out.println(createClassDemo_3().getName());		

	}
	
	
	//利用Object类的getClass方法获得
	public static Class createClassDemo_1()
	{
		
		Person p =new Person();
		Class clazz=p.getClass();
		return  clazz;
		
	}
	
	//利用属性.Class得到
	public static Class createClassDemo_2()
	{
		
		Class clazz=Person.class;
		return clazz;
	}
	
	public static Class createClassDemo_3()
	{
		String className="com.reflect.demo.Person";
		Class clazz=null;
		try
		{
		 clazz=Class.forName(className);
		}catch(ClassNotFoundException e)
		{
			e.printStackTrace();
		}
		return clazz;
	}
}

对应的Person类的代码如下:
package com.reflect.demo;

public class Person {
	
	private int age;
	private String name;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Person(int age, String name) {
		super();
		this.age = age;
		this.name = name;
		System.out.println("Person param run");
	}
	public Person() {
		super();
		System.out.println("Person run");
	}
	
	public void show()
	{
		System.out.println(name+"...show run..."+age);
	}
	
	private void method()
	{
		System.out.println("method run");
	}
	
	public void paramMethod(String str,int num)
	{
		System.out.println("paramMethod run"+str+":"+num);
	}
	
	public static void staticMethod()
	{
		System.out.println("staticMethod run...");
	}
	


}



Constructor类

Constructor类代表一个类的构造方法,根据Class对象得到Constructor对象来从而得到一个类的构造方法(无参和有参)。Constructor类提供了一系列操作Constructor里面各个对象的方法。比如可以提取注释,提取异常,提取构造函数的参数类型...Constructor类的代码示例如下:
package com.reflect.demo;

import java.lang.reflect.Constructor;

public class ReflectDemo2 {

	
	public static void main(String[] args) {
		
		constructorDemo_2();
		
	}
	
	
	//得到无参的构造函数
	public static void constructorDemo_1()
	{
		String className="com.reflect.demo.Person";
		try
		{
			Class clazz= Class.forName(className);
			
			Constructor cons= clazz.getConstructor();
			Person p=(Person)cons.newInstance();
			
			
		}catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	
	
	//得到有参的构造函数。
	public static void constructorDemo_2()
	{
		String className="com.reflect.demo.Person";
		try
		{
			Class clazz= Class.forName(className);
			Constructor cons= clazz.getConstructor(int.class,String.class);
			
			Person p =(Person)cons.newInstance(21,"zhangsan");
			
			System.out.println(p.getAge());
		
		}catch(Exception e)
		{
			e.printStackTrace();
		}
		
	}
}


Field类

Field类代表一个类中字段。该字段可以是共有的,也可以是私有的,面对字段,我们可以改变字段的值,得到字段的值,得到该字段的修饰符等。
package com.refl