java反射(一)

 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

这里,先写了一个javaBean类,然后通过反射先了解这个类的属性和方法,再然后通过反射来调用这些方法。

 

[java]  view plain copy
  1. package org.example.reflection;  
  2.   
  3. public class Person {  
  4.   
  5.     public String name;  
  6.   
  7.     private String sex;  
  8.   
  9.     protected Integer age;  
  10.   
  11.     public String getName() {  
  12.         return this.name;  
  13.     }  
  14.   
  15.     public void setName(String name) {  
  16.         this.name = name;  
  17.     }  
  18.   
  19.     public String getSex() {  
  20.         return this.sex;  
  21.     }  
  22.   
  23.     public void setSex(String sex) {  
  24.         this.sex = sex;  
  25.     }  
  26.   
  27.     public Integer getAge() {  
  28.         return this.age;  
  29.     }  
  30.   
  31.     public void setAge(Integer age) {  
  32.         this.age = age;  
  33.     }  
  34.   
  35.     private void speak() {  
  36.         System.out.println("I am a person");  
  37.     }  
  38.   
  39.     public void speak(String msg) {  
  40.         System.out.println(msg);  
  41.     }  
  42.   
  43. }  

 

[java]  view plain copy
  1. package org.example.reflection;  
  2.   
  3. import java.lang.reflect.Constructor;  
  4. import java.lang.reflect.Field;  
  5. import java.lang.reflect.Method;  
  6.   
  7. /** 
  8.  *  
  9.  * DOC 初步了解反射<br/> 
  10.  * 前三行代码表示通过三种方法可以获取一个类的类类型<br/> 
  11.  * 然后通过API,获取这个类的属性和方法,并且打印出来<br/> 
  12.  *  
  13.  */  
  14. public class ReflectionBase {  
  15.   
  16.     public static void main(String[] args) throws Exception {  
  17.         // Class clazz=Person.class;  
  18.         // Class clazz=new Person().getClass();  
  19.         // 获得类类型  
  20.         Class clazz = Class.forName("org.example.reflection.Person");  
  21.         // 获取该类的属性,要获得父类的属性的话,可以使用clazz.getFields();  
  22.         Field[] fields = clazz.getDeclaredFields();  
  23.         // 获取该类的方法,要获得父类的方法的话,可以使用clazz.getMehthods();  
  24.         Method[] methods = clazz.getDeclaredMethods();  
  25.         // 打印字段信息  
  26.         for (int i = 0; i < fields.length; i++) {  
  27.             System.out.println(fields[i].toString());  
  28.         }  
  29.         System.out.println("********************");  
  30.         // 打印方法信息  
  31.         for (int i = 0; i < methods.length; i++) {  
  32.             Method method = methods[i];  
  33.             // 打印方法名称  
  34.             System.out.println(methods[i].toString());  
  35.             Class<?>[] types = method.getParameterTypes();  
  36.             // 打印方法的输入参数信息  
  37.             for (int j = 0; j < types.length; j++) {  
  38.                 System.out.println(types[j]);  
  39.             }  
  40.             // 打印方法的返回类型信息  
  41.             Class<?> returnType = method.getReturnType();  
  42.             System.out.println(returnType);  
  43.         }  
  44.         System.out.println("********************");  
  45.         // 还可以获取抛出的异常信息和构造器信息  
  46.         Constructor[] constructors = clazz.getDeclaredConstructors();  
  47.         for (int i = 0; i < constructors.length; i++) {  
  48.             System.out.println("name=" + constructors[i].getName());  
  49.             System.out.println("class=" + constructors[i].getDeclaringClass());  
  50.             Class[] exceptionTypes = constructors[i].getExceptionTypes();  
  51.             for (int j = 0; i < exceptionTypes.length; j++) {  
  52.                 System.out.println(exceptionTypes[j]);  
  53.             }  
  54.         }  
  55.     }  
  56. }  

你可能感兴趣的:(java,反射)