Java反射机制_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java反射机制

Java反射机制

 2013/5/19 14:13:30  asialee900715  程序员俱乐部  我要评论(0)
  • 摘要:今天和同事一起开发一个AndroidApp的时候,第一次接触到了反射机制这样一个东西,于是上网查了很多资料,看了一些文档。现在终于有了一点了解,故将其写下,大牛勿喷。首先,我们所学的编程语言大致可以分为两种,第一种为静态语言:C、C++、java,这些语言的的变量类型一旦确定将不可更改;还有一类为动态语言:Perl、Python这些语言的变量类型是可以更改的。但是java又区别于一般的静态语言,因为其具有动态机制,所以java可以加载一个在运行时才确定的Class,得知其完整的构造
  • 标签:Java 反射 反射机制

? 今天和同事一起开发一个Android App的时候,第一次接触到了反射机制这样一个东西,于是上网查了很多资料,看了一些文档。现在终于有了一点了解,故将其写下,大牛勿喷。

? 首先,我们所学的编程语言大致可以分为两种,第一种为静态语言:C、C++、java ,这些语言的的变量类型一旦确定将不可更改;还有一类为动态语言:Perl、Python ?这些语言的变量类型是可以更改的。但是java又区别于一般的静态语言,因为其具有动态机制,所以java可以加载一个在运行时才确定的Class,得知其完整的构造,获得具体的属性以及运行其成员方法。

? 所谓的java反射机制指的是:对于任意一个类,都能够知道它的完成结构,对于任意一个对象都能够调用它的方法,这种动态获取对象的信息以及动态调用对象方法的机制成为java反射机制。

? 这样的定义并不好理解,最好的方法还是动手coding:首先我们写一个很简单的类:

class="java" name="code">public class Person { 
   public String name;  
   public int age;     
   public String getName() {  
       return name;  
   }  
   public Person()
   {
   	name="liyahou";
   	age=10;
   }
   public Person(String name)
   {
   	this.name=name;
   	this.age=23;
   }
   public void setName(String name) {  
       this.name = name;  
   }  
   public int getAge() {  
       return age;  
   }  
   public void setAge(int age) {  
       this.age = age;  
   }  
   public String display()
   {
   	return this.name+"  "+this.age;
   }
}

?

现在我们用这个类为白老鼠,进行试验:

example1:获取属性值

/**
* @param owner 传入的实例
* @param filedName 要获取的成员名
* @利用反射机制获取类成员
*/
public void getProperty(Object owner,String filedName)
{
Class instance=owner.getClass();
try {
Field filed=instance.getField(filedName);
Object property=filed.get(owner);
System.out.println(property.toString());
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args)
{
                Person person=new Person();
person.setName("liyazhou");
ReflectDemo demo=new ReflectDemo();
demo.getProperty(person,"name");
}

?

结果:liyazhou

代码解析

Class instance=owner.getClass(); ? 获取该对象的class

Field filed=instance.getField(filedName); ?通过传入的属性名得到该属性

Object property=filed.get(owner); 通过对象去获取其属性的值

?

?

example2:利用反射机制执行一个类的方法

	/**
	 * @param owner
	 * @param methoadName
	 * @param args
	 * @throws NoSuchMethodException
	 * @throws SecurityException
	 * @throws IllegalAccessException
	 * @throws IllegalArgumentException
	 * @throws InvocationTargetException
	 * @利用反射机制执行类的方法
	 */
	public void invokeClassMethod(Object owner,String methoadName,Object[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
	{
		Class instance=owner.getClass();//得到该类的class
		Class[] Args=new Class[args.length];
		for(int i=0;i<Args.length;i++)
		{
			Args[i]=args[i].getClass();
		}//构造该函数的参数类型
		Method method=instance.getMethod(methoadName, Args);//构造该方法
		System.out.println(method.invoke(owner, args)+"");//运行
	}

?

?

?

example 3:构造实例

	public Object getNewInstance(String className, Object[] args)
	{
		try {
			Class instance=Class.forName(className);//得到该类的Class
			Class[] arg=new Class[args.length];
			for(int i=0;i<args.length;i++)
			{
				arg[i]=args[i].getClass();
			}//构造方法所需的参数类型
			Constructor con=instance.getConstructor(arg);//构造构造器
			return con.newInstance(args);//构造实例
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

?

?

?

?

将java反射机制应用到工厂模式中:

  1. package?Reflect;??
  2. ???
  3. interface?fruit{??
  4. ????public?abstract?void?eat();??
  5. }??
  6. ???
  7. class?Apple?implements?fruit{??
  8. ????public?void?eat(){??
  9. ????????System.out.println("Apple");??
  10. ????}??
  11. }??
  12. ???
  13. class?Orange?implements?fruit{??
  14. ????public?void?eat(){??
  15. ????????System.out.println("Orange");??
  16. ????}??
  17. }??
  18. ???
  19. class?Factory{??
  20. ????public?static?fruit?getInstance(String?ClassName){??
  21. ????????fruit?f=null;??
  22. ????????try{??
  23. ????????????f=(fruit)Class.forName(ClassName).newInstance();??
  24. ????????}catch?(Exception?e)?{??
  25. ????????????e.printStackTrace();??
  26. ????????}??
  27. ????????return?f;??
  28. ????}??
  29. }??
  30. class?hello{??
  31. ????public?static?void?main(String[]?a){??
  32. ????????fruit?f=Factory.getInstance("Reflect.Apple");??
  33. ????????if(f!=null){??
  34. ????????????f.eat();??
  35. ????????}??
  36. ????}??
  37. }??


现在就算我们添加任意多个子类的时候,工厂类就不需要修改。?

发表评论
用户名: 匿名