java 反射机制

简介: 今天和同事一起开发一个Android App的时候,第一次接触到了反射机制这样一个东西,于是上网查了很多资料,看了一些文档。现在终于有了一点了解,故将其写下,大牛勿喷。   首先,我们所学的编程语言大致可以分为两种,第一种为静态语言:C、C++、java ,这些语言的的变量类型一旦确定将不可更改;还有一类为动态语言:Perl、Python  这些语言的变量类型是可以更改的。但是j

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

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

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

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

Java代码 
  1. public class Person {   
  2.    public String name;    
  3.    public int age;       
  4.    public String getName() {    
  5.        return name;    
  6.    }    
  7.    public Person()  
  8.    {  
  9.     name="liyahou";  
  10.     age=10;  
  11.    }  
  12.    public Person(String name)  
  13.    {  
  14.     this.name=name;  
  15.     this.age=23;  
  16.    }  
  17.    public void setName(String name) {    
  18.        this.name = name;    
  19.    }    
  20.    public int getAge() {    
  21.        return age;    
  22.    }    
  23.    public void setAge(int age) {    
  24.        this.age = age;    
  25.    }    
  26.    public String display()  
  27.    {  
  28.     return this.name+"  "+this.age;  
  29.    }  
  30. }  

 

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

example1:获取属性值

Java代码 
  1. /** 
  2. * @param owner 传入的实例 
  3. * @param filedName 要获取的成员名 
  4. * @利用反射机制获取类成员 
  5. */  
  6. public void getProperty(Object owner,String filedName)  
  7. {  
  8. Class instance=owner.getClass();  
  9. try {  
  10. Field filed=instance.getField(filedName);  
  11. Object property=filed.get(owner);  
  12. System.out.println(property.toString());  
  13. catch (NoSuchFieldException e) {  
  14. // TODO Auto-generated catch block  
  15. e.printStackTrace();  
  16. catch (SecurityException e) {  
  17. // TODO Auto-generated catch block  
  18. e.printStackTrace();  
  19. catch (IllegalArgumentException e) {  
  20. // TODO Auto-generated catch block  
  21. e.printStackTrace();  
  22. catch (IllegalAccessException e) {  
  23. // TODO Auto-generated catch block  
  24. e.printStackTrace();  
  25. }  
  26. }  
  27. public static void main(String[] args)  
  28. {  
  29.                 Person person=new Person();  
  30. person.setName("liyazhou");  
  31. ReflectDemo demo=new ReflectDemo();  
  32. demo.getProperty(person,"name");  
  33. }  

 

结果:liyazhou

代码解析:

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

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

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

 

 

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

Java代码 
  1. /** 
  2.  * @param owner 
  3.  * @param methoadName 
  4.  * @param args 
  5.  * @throws NoSuchMethodException 
  6.  * @throws SecurityException 
  7.  * @throws IllegalAccessException 
  8.  * @throws IllegalArgumentException 
  9.  * @throws InvocationTargetException 
  10.  * @利用反射机制执行类的方法 
  11.  */  
  12. public void invokeClassMethod(Object owner,String methoadName,Object[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException  
  13. {  
  14.     Class instance=owner.getClass();//得到该类的class  
  15.     Class[] Args=new Class[args.length];  
  16.     for(int i=0;i<Args.length;i++)  
  17.     {  
  18.         Args[i]=args[i].getClass();  
  19.     }//构造该函数的参数类型  
  20.     Method method=instance.getMethod(methoadName, Args);//构造该方法  
  21.     System.out.println(method.invoke(owner, args)+"");//运行  
  22. }  

 

 

 

example 3:构造实例

Java代码 
  1. public Object getNewInstance(String className, Object[] args)  
  2. {  
  3.     try {  
  4.         Class instance=Class.forName(className);//得到该类的Class  
  5.         Class[] arg=new Class[args.length];  
  6.         for(int i=0;i<args.length;i++)  
  7.         {  
  8.             arg[i]=args[i].getClass();  
  9.         }//构造方法所需的参数类型  
  10.         Constructor con=instance.getConstructor(arg);//构造构造器  
  11.         return con.newInstance(args);//构造实例  
  12.     } catch (ClassNotFoundException e) {  
  13.         // TODO Auto-generated catch block  
  14.         e.printStackTrace();  
  15.     } catch (NoSuchMethodException e) {  
  16.         // TODO Auto-generated catch block  
  17.         e.printStackTrace();  
  18.     } catch (SecurityException e) {  
  19.         // TODO Auto-generated catch block  
  20.         e.printStackTrace();  
  21.     } catch (InstantiationException e) {  
  22.         // TODO Auto-generated catch block  
  23.         e.printStackTrace();  
  24.     } catch (IllegalAccessException e) {  
  25.         // TODO Auto-generated catch block  
  26.         e.printStackTrace();  
  27.     } catch (IllegalArgumentException e) {  
  28.         // TODO Auto-generated catch block  
  29.         e.printStackTrace();  
  30.     } catch (InvocationTargetException e) {  
  31.         // TODO Auto-generated catch block  
  32.         e.printStackTrace();  
  33.     }  
  34.     return null;  
  35. }  

 

 

 

 

将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. }  


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

相关文章
|
12天前
|
存储 算法 Java
Java HashSet:底层工作原理与实现机制
本文介绍了Java中HashSet的工作原理,包括其基于HashMap实现的底层机制。通过示例代码展示了HashSet如何添加元素,并解析了add方法的具体过程,包括计算hash值、处理碰撞及扩容机制。
|
2天前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
15 5
Java反射机制:解锁代码的无限可能
|
1天前
|
存储 缓存 安全
🌟Java零基础:深入解析Java序列化机制
【10月更文挑战第20天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
9 3
|
1天前
|
安全 Java UED
深入理解Java中的异常处理机制
【10月更文挑战第25天】在编程世界中,错误和意外是不可避免的。Java作为一种广泛使用的编程语言,其异常处理机制是确保程序健壮性和可靠性的关键。本文通过浅显易懂的语言和实际示例,引导读者了解Java异常处理的基本概念、分类以及如何有效地使用try-catch-finally语句来处理异常情况。我们将从一个简单的例子开始,逐步深入到异常处理的最佳实践,旨在帮助初学者和有经验的开发者更好地掌握这一重要技能。
7 2
|
3天前
|
Java 数据库连接 开发者
Java中的异常处理机制####
本文深入探讨了Java语言中异常处理的核心概念,通过实例解析了try-catch语句的工作原理,并讨论了finally块和throws关键字的使用场景。我们将了解如何在Java程序中有效地管理错误,提高代码的健壮性和可维护性。 ####
|
4天前
|
Java
Java中的反射机制与应用实例
【10月更文挑战第22天】Java作为一门面向对象的编程语言,提供了丰富的特性来支持对象的创建、操作和交互。其中,反射机制是Java的一项核心特性,它允许程序在运行时动态地获取类的信息、创建对象、调用方法、访问属性等。本文将从三个部分探讨Java中的反射机制及其应用实例:一是反射机制的基本概念和原理;二是反射机制在Java中的应用场景;三是通过实例深入理解反射机制的使用方法和技巧。
10 4
|
5天前
|
安全 Java 程序员
深入浅出Java中的异常处理机制
【10月更文挑战第20天】本文将带你一探Java的异常处理世界,通过浅显易懂的语言和生动的比喻,让你在轻松阅读中掌握Java异常处理的核心概念。我们将一起学习如何优雅地处理代码中不可预见的错误,确保程序的健壮性和稳定性。准备好了吗?让我们一起踏上这段旅程吧!
20 6
|
3天前
|
存储 运维 Java
💻Java零基础:深入了解Java内存机制
【10月更文挑战第18天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
15 1
|
6天前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
20 5
|
7天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
34 5