Java反射机制与应用

本文详细介绍Java反射API的五大核心操作:判断对象是否属于反射得到的类、获取类的所有属性字段、获取类的某个public属性值、获取类的所有方法及执行类的某个方法,并通过实例演示这些操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常用方法

①. 判断对象是否属于反射得到的类(isInstance

[java]  view plain  copy
  1. class S {   
  2. }    
  3. public class IsInstance {   
  4.    public static void main(String args[]) {   
  5.       try {   
  6.            Class cls = Class.forName("S");   
  7.            boolean b1 = cls.isInstance(new Integer(37));   
  8.            System.out.println(b1);   
  9.            boolean b2 = cls.isInstance(new S());   
  10.            System.out.println(b2);   
  11.       }   
  12.       catch (Throwable e) {   
  13.            System.err.println(e);   
  14.       }   
  15.    }   
  16. }  

在这个例子中创建了一个S 类的 Class 对象,然后检查一些对象是否是S的实例。结果输出false和true。说明Integer(37) 不是,但 new S()是。


②. 获取某个反射类的所有属性字段

[java]  view plain  copy
  1. /** 
  2.  * 获取反射类的所有属性字段 
  3.  *  
  4.  * @param ownerClass 反射的类 
  5.  * @return 
  6.  * @throws Exception 
  7.  */  
  8. public Field[] getProperty(Class ownerClass) throws Exception {  
  9.   
  10.     //获取该类所有属性字段  
  11.     //Field[] fields = ownerClass.getFields();//只获取public访问权限的属性字段(包括父类的)  
  12.     Field[] fields = ownerClass.getDeclaredFields();//只获取该类的所有访问权限的属性(不含父类)  
  13.       
  14.     //输出所有属性字段  
  15.     for(int i=0;i<fields.length;i++){  
  16.         System.out.println("属性:"+fields[i]);  
  17.     }  
  18.   
  19.     return fields;  
  20. }  



③. 获取反射类的某个public属性值

[java]  view plain  copy
  1. /** 
  2.  * 获取反射类的某个public属性值 
  3.  *  
  4.  * @param ownerClass 反射的类 
  5.  * @param fieldName 属性名 
  6.  * @return 
  7.  * @throws Exception 
  8.  */  
  9. public Object getProperty(Object owner,String fieldName) throws Exception {  
  10.       
  11.     //得到对象所属类  
  12.     Class ownerClass = owner.getClass();  
  13.   
  14.     //获取该类的某个属性  
  15.     Field field = ownerClass.getField(fieldName);  
  16.       
  17.     //获取某个对象的特定属性  
  18.     Object property = field.get(owner);  
  19.       
  20.     //输出该属性信息  
  21.     System.out.println(fieldName+"的属性值:"+property.toString());  
  22.   
  23.     return property;  
  24.   
  25. }  


④.获取反射类的该中的所有方法

[java]  view plain  copy
  1. /** 
  2.  * 获取反射类的该中的所有方法 
  3.  * @param ownerClass 反射的类 
  4.  * @return 
  5.  * @throws Exception 
  6.  */  
  7. public Method[] getMethods(Class ownerClass) throws Exception {  
  8.   
  9.     //获取该类所有方法  
  10.     //Field[] fields = ownerClass.getMethods();//只获取public访问权限的方法(包括父类的)  
  11.     Method[] methods = ownerClass.getDeclaredMethods();//只获取该类的所有访问权限的方法(不含父类)  
  12.   
  13.     //输出所有方法  
  14.     for(int i=0;i<methods.length;i++){  
  15.         System.out.println("方法:" +methods[i]);  
  16.     }  
  17.   
  18.     return methods;  
  19. }  

⑤. 执行反射类的该中的某个方法

[java]  view plain  copy
  1. /** 
  2.  * 执行反射类的该中的某个方法 
  3.  * @param ownerClass 反射的类 
  4.  * @param methodName 方法名 
  5.  * @return 
  6.  * @throws Exception 
  7.  */  
  8. public Object invokeMethod(Object owner,String methodName,Object[] args) throws Exception {  
  9.   
  10.     //得到对象所属类  
  11.     Class ownerClass = owner.getClass();  
  12.   
  13.     //获取该类的某个方法  
  14.     Method method = ownerClass.getMethod(methodName, null);  
  15.       
  16.     //执行某个对象的方法  
  17.     Object result = method.invoke(owner, args);  
  18.       
  19.     //输出结果信息  
  20.     System.out.println("结果返回值:"+ result);  
  21.   
  22.     return result;  
  23. }  


实例演示方法:

[java]  view plain  copy
  1. /** 
  2.  * 测试反射常用方法 
  3.  */  
  4. public void refTest(){  
  5.     String className = "com.java.reflecttest.Student";  
  6.   
  7.     try {  
  8.           
  9.         //通过反射机制,使用类装载器,装载该类  
  10.         Class<?> stu = Class.forName(className);  
  11.         Object objStu = stu.newInstance();  
  12.                   
  13.           
  14.         //获取反射类的所有属性  
  15.         System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");  
  16.         System.out.println("调用 getProperty 方法,获取Student类的所有属性");  
  17.         getProperty(stu);  
  18.           
  19.           
  20.         //获取反射类的某个属性值  
  21.         System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");  
  22.         System.out.println("调用 getProperty 方法,获取Student类的NAME属性值");  
  23.         getProperty(objStu,"NAME");  
  24.           
  25.           
  26.         //获取反射类的所有方法  
  27.         System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");  
  28.         System.out.println("调用 getMethods 方法,获取Student类的所有方法");  
  29.         getMethods(stu);  
  30.           
  31.         //执行反射类的getInfo方法  
  32.         System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");  
  33.         System.out.println("调用 invokeMethod 方法,执行Student类的getInfo方法");  
  34.         invokeMethod(objStu, "getInfo"null);  
  35.           
  36.           
  37.     } catch (Exception e) {  
  38.         e.printStackTrace();  
  39.     }  
  40. }  



演示所用的Student类 

[java]  view plain  copy
  1. package com.java.reflecttest;  
  2.   
  3. /** 
  4.  * 学生信息类 
  5.  *  
  6.  * @author Longxuan 
  7.  * 
  8.  */  
  9. public class Student {  
  10.   
  11.     /** 
  12.      * 学号 
  13.      */  
  14.     private String stuId ;  
  15.       
  16.     /** 
  17.      * 学号 
  18.      */  
  19.     public String STUID;  
  20.       
  21.     /** 
  22.      * 姓名 
  23.      */  
  24.     private String name ;  
  25.       
  26.     /** 
  27.      * 姓名 
  28.      */  
  29.     public String NAME;  
  30.   
  31.     /** 
  32.      * 年龄 
  33.      */  
  34.     private int age;  
  35.       
  36.     /** 
  37.      * 年龄 
  38.      */  
  39.     public int AGE;  
  40.       
  41.     /** 
  42.      * 班级 
  43.      */  
  44.     private String classid;  
  45.       
  46.   
  47.   
  48.       
  49.     public String getStuId() {  
  50.         return stuId;  
  51.     }  
  52.   
  53.     public void setStuId(String stuId) {  
  54.         this.stuId = stuId;  
  55.     }  
  56.   
  57.     public String getName() {  
  58.         return name;  
  59.     }  
  60.   
  61.     public void setName(String name) {  
  62.         this.name = name;  
  63.     }  
  64.   
  65.     public int getAge() {  
  66.         return age;  
  67.     }  
  68.   
  69.     public void setAge(int age) {  
  70.         this.age = age;  
  71.     }  
  72.   
  73.     public String getClassid() {  
  74.         return classid;  
  75.     }  
  76.   
  77.     public void setClassid(String classid) {  
  78.         this.classid = classid;  
  79.     }  
  80.       
  81.       
  82.     /** 
  83.      * 输出学生信息 
  84.      */  
  85.     public void getInfo(){  
  86.         System.out.println("学生信息:\n学号:"+stuId+"\t姓名:"+name+"\t年龄:"+age+"\t班级:"+classid);  
  87.     }  
  88.       
  89.     /** 
  90.      * 构造函数 
  91.      */  
  92.     public Student(){  
  93.         init();  
  94.     }  
  95.       
  96.       
  97.     /** 
  98.      * 私有初始化方法 
  99.      */  
  100.     private void init(){  
  101.         this.name = "张三";  
  102.         this.stuId ="1001";  
  103.         this.age = 14;  
  104.         this.classid = "A001";  
  105.         this.NAME = name;  
  106.         this.AGE = age;  
  107.         this.STUID = stuId;  
  108.     }  
  109.       
  110. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值