java 反射学习

来源:互联网 发布:中国人口 知乎 编辑:程序博客网 时间:2024/06/01 10:17

实例一:获得完整的类名

[java] view plain copy
  1. package reflection.getclassname;  
  2.   
  3. //获得完整的类名  
  4. public class GetClassName {  
  5.   
  6.     public String getNameByClass() {  
  7.           
  8.         String name = "";  
  9.         System.out.println("通过类本身获得对象");  
  10.         Class UserClass = this.getClass();  
  11.         System.out.println("获得对象成功!\n");  
  12.           
  13.         System.out.println("通过类对象获得类名");  
  14.         name = UserClass.getName();  
  15.         System.out.println("获得类名成功!");  
  16.         return name;  
  17.     }  
  18.     public static void main(String[] args) {  
  19.           
  20.         GetClassName gcn = new GetClassName();  
  21.         System.out.println("类名为:"+gcn.getNameByClass());  
  22.     }  
  23.   
  24. }  

运行结果:

通过类本身获得对象
获得对象成功!

通过类对象获得类名
获得类名成功!
类名为:reflection.getclassname.GetClass Name       



实例二:获得类的属性

[java] view plain copy
  1. package reflection.getfields;  
  2.   
  3. import java.lang.reflect.Field;  
  4.   
  5. //获得类的属性  
  6. public class GetFields {  
  7.   
  8.     public static void getFieldNames(String className) {  
  9.           
  10.         try {  
  11.             //获得类名  
  12.             Class c = Class.forName(className);  
  13.             //获得所有属性  
  14.             Field[] fds = c.getFields();  
  15.               
  16.             for (int i=0; i<fds.length; i++)  
  17.             {  
  18.                 String fn = fds[i].getName();  
  19.                 Class tc = fds[i].getType();  
  20.                 String ft = tc.getName();  
  21.                 System.out.println("该属性的名字为:"+fn+",该属性的类型为:"+ft);  
  22.             }  
  23.         }catch (Exception e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.     }  
  27.       
  28.     public static void main(String[] args) {  
  29.         GetFields.getFieldNames("reflection.getfields.FieldInfo");  
  30.     }  
  31.   
  32. }  

运行结果:

该属性的名字为:id,该属性的类型为:java.lang.String

该属性的名字为:username,该属性的类型为:java.lang.String    



实例三:获得类实现的接口

[java] view plain copy
  1. package reflection.getinterfaces;  
  2.   
  3. //获得类实现的接口  
  4. public class GetInterfaces {  
  5.   
  6.     public static void getInterfaces(String className) {  
  7.         try {  
  8.             //取得类  
  9.             Class cl = Class.forName(className);  
  10.             Class[] ifs = cl.getInterfaces();  
  11.             for (int i = 0; i<ifs.length;i++)  
  12.             {  
  13.                 String IName = ifs[i].getName();  
  14.                 System.out.println("该类实现的接口名字为:"+IName);  
  15.             }  
  16.         }catch (Exception e) {  
  17.             e.printStackTrace();  
  18.         }  
  19.     }  
  20.       
  21.     public static void main(String[] args) {  
  22.         GetInterfaces.getInterfaces("reflection.getinterfaces.Student");  
  23.     }  
  24.   
  25. }  

运行结果:

该类实现的接口名字为:reflection.getinterfaces.Person    



实例四:获得类及其属性的修饰符

[java] view plain copy
  1. package reflection.getmodifiers;  
  2.   
  3. import java.lang.reflect.Field;  
  4. import java.lang.reflect.Modifier;  
  5.   
  6. import reflection.UserInfo;  
  7.   
  8. //获得类及其属性的修饰符  
  9. public class GetModifiers {  
  10.   
  11.     private String username = "liu shui jing";  
  12.     float f = Float.parseFloat("1.000");  
  13.     public static final int i = 37;  
  14.       
  15.     //获得类的修饰符  
  16.     public static String useModifiers(UserInfo ui) {  
  17.           
  18.         Class uiClass = ui.getClass();  
  19.         int m = uiClass.getModifiers();  
  20.         return Modifier.toString(m);  
  21.           
  22.     }  
  23.       
  24.     //获得本类属性的修饰符  
  25.     public void checkThisClassModifiers() {  
  26.           
  27.         Class tc = this.getClass();       
  28.         Field fl[] = tc.getDeclaredFields();  
  29.       
  30.         for(int i=0;i<fl.length;i++)  
  31.         {  
  32.             System.out.println("第"+(i+1)+"个属性的修饰符为:"+Modifier.toString(fl[i].getModifiers()));  
  33.         }  
  34.           
  35.     }  
  36.     public static void main(String[] args) {  
  37.           
  38.         //获得类的修饰符  
  39.         UserInfo ui =new UserInfo();  
  40.         System.out.println("获得这个类的修饰符:"+GetModifiers.useModifiers(ui)+"\n");  
  41.           
  42.         //获得本类属性的修饰符  
  43.         GetModifiers gm = new GetModifiers();  
  44.         gm.checkThisClassModifiers();  
  45.           
  46.     }  
  47.   
  48. }  
运行结果:

获得这个类的修饰符:public

 

第1个属性的修饰符为:private

第2个属性的修饰符为:

第3个属性的修饰符为:public static final      



实例五:获得类的构造函数

[java] view plain copy
  1. package reflection.getconstructor;  
  2.   
  3. import java.lang.reflect.Constructor;  
  4.   
  5. //获得类的构造函数  
  6. public class GetConstructor {  
  7.   
  8.     //构造函数一  
  9.     GetConstructor(int a) {  
  10.           
  11.     }  
  12.       
  13.     //构造函数二  
  14.     GetConstructor(int a, String b) {  
  15.           
  16.     }  
  17.       
  18.     public static void getConstructorInfo(String className) {  
  19.         try {  
  20.             //获得类的对象  
  21.             Class cl =Class.forName(className);  
  22.             System.out.println("获得类"+className+"所有的构造函数");  
  23.             Constructor ctorlist[] = cl.getDeclaredConstructors();  
  24.             System.out.println("遍历构造函数\n");  
  25.             for(int i =0 ; i<ctorlist.length; i++)  
  26.             {  
  27.                 Constructor con = ctorlist[i];  
  28.                 System.out.println("这个构造函数的名字为:"+con.getName());  
  29.                 System.out.println("通过构造函数获得这个类的名字为:"+con.getDeclaringClass());  
  30.                   
  31.                 Class cp[] = con.getParameterTypes();  
  32.                 for (int j=0; j<cp.length; j++)  
  33.                 {  
  34.                     System.out.println("参数 "+j+" 为 "+cp[j]+"\n");  
  35.                 }  
  36.             }  
  37.         }catch (Exception e) {  
  38.                 System.err.println(e);            
  39.         }  
  40.     }  
  41.     public static void main(String[] args) {  
  42.         GetConstructor.getConstructorInfo("reflection.getconstructor.GetConstructor");  
  43.     }  
  44.   
  45. }  

运行结果:

获得类reflection.getconstructor.GetConstructor所有的构造函数

遍历构造函数

 

这个构造函数的名字为:reflection.getconstructor.GetConstructor

通过构造函数获得这个类的名字为:class reflection.getconstructor.GetConstructor       

参数 0 为 int

 

这个构造函数的名字为:reflection.getconstructor.GetConstructor

通过构造函数获得这个类的名字为:class reflection.getconstructor.GetConstructor

参数 0 为 int

 

参数 1 为 class java.lang.String



实例六:获得父类

[java] view plain copy
  1. package reflection.getparentclass;  
  2.   
  3. //获得父类  
  4. public class GetParentClass {  
  5.   
  6.     public static String getParentClass(UserInfoMore uim) {  
  7.           
  8.         //获得父类  
  9.         Class uimc = uim.getClass().getSuperclass();  
  10.         System.out.println("获得父类的名字为:"+uimc.getName());  
  11.         return uimc.getName();  
  12.           
  13.     }  
  14.       
  15.     public static void searchParentClass() {  
  16.           
  17.     }  
  18.       
  19.     public static void main(String[] args) {  
  20.           
  21.         UserInfoMore uim = new UserInfoMore();  
  22.         System.out.println("成功获得UserInfoMore的父类:"+GetParentClass.getParentClass(uim));  
  23.           
  24.     }  
  25.   
  26. }  

运行结果:

获得父类的名字为:reflection.UserInfo

成功获得UserInfoMore的父类:reflection.UserInfo   



实例七:获得类的方法

[java] view plain copy
  1. package reflection.getmethod;  
  2.   
  3. import java.lang.reflect.Method;  
  4.   
  5. //获得类的方法  
  6. public class GetMethod {  
  7.   
  8.     public static void getMethods(String className) {  
  9.         try {  
  10.             System.out.println("开始遍历类"+className+".class");  
  11.             //获得类名  
  12.             Class cls = Class.forName(className);  
  13.             //利用方法获得所有该类的方法  
  14.             System.out.println("利用类的getDeclaredMethods获得类的所有方法");  
  15.             Method ml[] =cls.getDeclaredMethods();  
  16.             System.out.println("遍历获得的方法数组\n");  
  17.             for (int i = 0 ;i<ml.length;i++)  
  18.             {  
  19.                 System.out.println("开始遍历第"+(i+1)+"个方法");  
  20.                 Method m = ml[i];  
  21.                 System.out.println("开始获取方法的变量类型");  
  22.                 Class ptype[] = m.getParameterTypes();  
  23.                 for (int j=0; j<ptype.length; j++)  
  24.                 {  
  25.                     System.out.println("方法参数"+j+"类型为"+ptype[j]);  
  26.                 }  
  27.                 Class gEx[] = m.getExceptionTypes();  
  28.                 for (int j=0 ; j<gEx.length; j++)  
  29.                 {  
  30.                     System.out.println("异常"+j+"为"+ gEx[j]);  
  31.                 }  
  32.                   
  33.                 System.out.println("该方法的返回值类型为:"+m.getReturnType()+"\n");  
  34.                   
  35.             }  
  36.         }catch (Exception e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.     }  
  40.       
  41.     public static void main(String[] args) {  
  42.         GetMethod.getMethods("reflection.UserInfo");  
  43.     }  
  44.   
  45. }  

运行结果:

开始遍历类reflection.UserInfo.class

利用类的getDeclaredMethods获得类的所有方法         

遍历获得的方法数组

 

开始遍历第1个方法

开始获取方法的变量类型

该方法的返回值类型为:class java.lang.String

 

开始遍历第2个方法

开始获取方法的变量类型

该方法的返回值类型为:class java.lang.Integer

 

开始遍历第3个方法

开始获取方法的变量类型

方法参数0类型为class java.lang.String

该方法的返回值类型为:void

 

开始遍历第4个方法

开始获取方法的变量类型

该方法的返回值类型为:class java.lang.String

 

开始遍历第5个方法

开始获取方法的变量类型

方法参数0类型为class java.lang.Integer

该方法的返回值类型为:void

 

开始遍历第6个方法

开始获取方法的变量类型

该方法的返回值类型为:class java.lang.String

 

开始遍历第7个方法

开始获取方法的变量类型

方法参数0类型为class java.lang.String

该方法的返回值类型为:void

 


这次实例不少吧,而且这些小例子都比较简单,相信大家都可以轻松秒懂。上面一些例子的代码并不是完整的,有些只有一些关键代码,如果想要完整的代码请戳下面的链接。最后祝大家学习愉快!

原创粉丝点击