? 今天和同事一起开发一个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反射机制应用到工厂模式中:
现在就算我们添加任意多个子类的时候,工厂类就不需要修改。?