反射机制应用

来源:互联网 发布:淘宝上二手手机可信吗 编辑:程序博客网 时间:2024/05/21 07:58

public static void setGdN(StatReport srObj,int n,String val){
  
  try{
  
  //Method strGd = StatReport.class.getMethod("setGd"+n);
  Method   strGd   =StatReport.class.getMethod("setGd"+n,new   Class[]{String.class});
  Object[] args={new String(val)};   
  strGd.invoke(srObj, args);
  
  } catch (Exception e) {
   System.err.println(n+"------err---"+srObj+"---"+e.getMessage()); 
  }        
  
 }

 

 

关键字: java reflect

  • 1. 使用反射得到对象的属性. 注: 属性的使用,同样也受private,public等作用域的限制.

Java代码

   
  1. public class FieldClass {   
  2.     public String publicField = "ss"// public 属性   
  3.     private Double privateField = new Double(22.22); // private 属性   
  4.     public static Boolean staticField = true// static 属性   
  5. }  
  6.  import java.lang.reflect.Field;   
  7. import junit.framework.TestCase;  
  8.  
  9.  public class FieldTestCase extends TestCase {   
  10.     public void testField() throws Exception {   
  11.         FieldClass test = new FieldClass();   
  12.   
  13.         Field field1 = FieldClass.class.getField("publicField");   
  14.         assertEquals(field1.get(test), test.publicField); 
  15.       // 能够使用test.intPublicField,则也可以使用反射得到值   
  16.      try {   
  17.             Field field2 = FieldClass.class.getField("privateField");   
  18.         } catch (Exception e) {   
  19.             assertTrue(e instanceof java.lang.NoSuchFieldException);
  20.           // 由于doubleField是private的, 不可被外部直接调用   
  21.         }   
  22.   
  23.         Field field3 = FieldClass.class.getField("staticField");   
  24.         assertTrue((Boolean) field3.get(FieldClass.class));   
  25.     }   
  26. }  

 

 

 

  • 2. 使用反射得到对象的无参方法.

 

Java代码

  1. public class MethodClass {   
  2.     public String publicMehod() {   
  3.         return "public";   
  4.     }   
  5.        
  6.     private String privateMethod() {   
  7.         return "private";   
  8.     }   
  9.        
  10.     public static String staticMethod() {   
  11.         return "static";   
  12.     }   
  13. }   
  14. import java.lang.reflect.Method;   
  15. import junit.framework.TestCase;
  16. public class MethodTestCase extends TestCase {   
  17.     public void testMethod() throws Exception {   
  18.         MethodClass test = new MethodClass();   
  19.   
  20.         Method method1 = MethodClass.class.getMethod("publicMehod"new Class[] {});   
  21.         assertEquals(method1.invoke(test, new Object[] {}), "public");   
  22.   
  23.         try {   
  24.             Method method2 = MethodClass.class.getMethod("privateMethod"new Class[] {});   
  25.         } catch (Exception e) {   
  26.             assertTrue(e instanceof NoSuchMethodException);   
  27.         }   
  28.   
  29.         Method method3 = MethodClass.class.getMethod("staticMethod"new Class[] {});   
  30.         assertEquals(method3.invoke(MethodClass.classnew Object[] {}), "static");   
  31.     }   
  32. }  

 

  • 3. 使用反射得到对象的有参方法.

 

Java代码

  1. public class ArguementMethodClass {   
  2.     public String methodWithNoArguement() {   
  3.         return "no";   
  4.     }   
  5.        
  6.     public String methodWithOneArgument(String arg) {   
  7.         return "one";   
  8.     }   
  9.        
  10.     public String methodWithTwoArguments(String arg0, String arg1) {   
  11.         return "two";   
  12.     }   
  13.        
  14.     public String methodWithArrayArguments(String[] argArray) {   
  15.         return "array";   
  16.     }   
  17.        
  18.     public String methodWithMoreArguments(String... args) {   
  19.         return "more";   
  20.     }   
  21. }   
  22. import java.lang.reflect.Method;   
  23. import junit.framework.TestCase;
  24. public class ArgumentMethodTestCase extends TestCase {   
  25.     public void testArgumentMethod() throws Exception {   
  26.         ArguementMethodClass test = new ArguementMethodClass();   
  27.   
  28.         Method method1 = ArguementMethodClass.class.getMethod("methodWithNoArguement"new Class[] {});   
  29.         method1.invoke(test, new Object[] {});   
  30.   
  31.         Method method2 = ArguementMethodClass.class.getMethod("methodWithOneArgument"new Class[] { String.class });   
  32.         assertEquals(method2.invoke(test, new Object[] { "aa" }), "one");   
  33.   
  34.         Method method3 = ArguementMethodClass.class.getMethod("methodWithTwoArguments"new Class[] { String.class, String.class });   
  35.         assertEquals(method3.invoke(test, new Object[] { "aa""bb" }), "two");   
  36.   
  37.         Method method4 = ArguementMethodClass.class.getMethod("methodWithArrayArguments"new Class[] { String[].class });   
  38.         assertEquals(method4.invoke(test, new Object[] { new String[] { "aa" } }), "array");   
  39.   
  40.         Method method5 = ArguementMethodClass.class.getMethod("methodWithMoreArguments"new Class[] { String[].class });   
  41.         assertEquals(method5.invoke(test, new Object[] { new String[] { "aa" } }), "more");   
  42.     }   
  43. }  
  • 4. 重载的处理.

 

Java代码

  1. public class OverloadMethodClass {   
  2.     public String sameMethod() {   
  3.         return "one";   
  4.     }   
  5.        
  6.     public String sameMethod(String arg) {   
  7.         return "two";   
  8.     }   
  9. }   
  10. import java.lang.reflect.Method;   
  11. import junit.framework.TestCase;
  12. public class OverloadMthodTestCase extends TestCase {   
  13.     public void testOverrideMethod() throws Exception {   
  14.         OverloadMethodClass test = new OverloadMethodClass();   
  15.   
  16.         Method method1 = OverloadMethodClass.class.getMethod("sameMethod"new Class[] {});   
  17.         assertEquals(method1.invoke(test, new Object[] {}), "one");   
  18.   
  19.         Method method2 = OverloadMethodClass.class.getMethod("sameMethod"new Class[] { String.class });   
  20.         assertEquals(method2.invoke(test, new Object[] { "aa" }), "two");   
  21.     }   
  22. }  
原创粉丝点击