反射中getMethods 與 getDeclaredMethods 的區別


public Method[] getMethods()返回某個類的所有公用(public)方法包括其繼承類的公用方法,當然也包括它所實現接口的方法
public Method[] getDeclaredMethods()對象表示的類或接口聲明的所有方法,包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法。當然也包括它所實現接口的方法

 

 public static void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, InstantiationException  {
        Bean bean = new Bean("QQ", 18);
        System.out.println(bean);

        //使用反射
        String className = "com.my.test.Bean";
        
        Class<Bean> clas = (Class<Bean>) Class.forName(className);

        //生成一個實例
        Bean b = (Bean)clas.newInstance();
        b.setAge(20);
        b.setName("WW");
        System.out.println(b);
        
        //調用方法
        clas.getMethod("setName", String.class).invoke(bean, "Jerry");
        clas.getMethod("setAge", int.class).invoke(bean, 25);
        System.out.println("After reflection....\n" + bean);
    }

 

【轉】使用反射動態執行方法例子:

java利用反射動態執行類方法
Person類 
public class Person { 
String name; 
String day; 
public String getName() { 
return name; 
} 
public void setName(String name) { 
this.name = name; 
} 
public String getDay() { 
return day; 
} 
public void setDay(String day) { 
this.day = day; 
} 
public void printlinfo() throws RuntimeException, IOException{ 
System.out.println(name); 
System.out.println(day); 
String url="http://www.163.com"; 
   openURL(url); 

} 
public void openURL (String url)throws RuntimeException,IOException{ 
String urlx=null; 
urlx="rundll32 url.dll,FileProtocolHandler "+url; 


Process p=Runtime.getRuntime().exec(""+urlx); 

} 

} 




利用反映動態執行類的方法 
public static void print(byte[] b1,String tname,String tday) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException { 
    
    MyClassLoade myClassLoader=new MyClassLoade(); 
        Class c = myClassLoader.defineClass("Person", b1); 
        System.out.println(c.getName()); 
        Object object= c.newInstance(); 
        Field[] fields=c.getDeclaredFields(); 
        System.out.println(fields.length); 
        String args="java.lang.String"; 
        Method method1= c.getDeclaredMethod("setName", args.getClass()) ; 
        method1.invoke(object,new Object[] {tname}); 
        Method method2= c.getDeclaredMethod("setDay", args.getClass()) ; 
        method2.invoke(object,new Object[] {tday}); 
            Method method = c.getDeclaredMethod("printlinfo", null) ; 
        method.invoke(object);    
    
    } 


參考:利用反射實現JavaBean的自動賦值 
import java.lang.reflect.Method; 
import java.util.*; 
import javax.servlet.http.HttpServletRequest; 
import com.sns.exception.ApplicationException; 
public final class ParameterUtil { 
public static void setFormBean(HttpServletRequest request, Object bean) { 
Class c = bean.getClass(); 
Method[] ms = c.getMethods(); 
for(int i=0; i<ms.length; i++) { 
    String name = ms.getName(); 
    if(name.startsWith("set")) { 
     Class[] cc = ms.getParameterTypes(); 
     if(cc.length==1) { 
      String type = cc[0].getName(); // parameter type 
      try { 
        // get property name: 
        String prop = Character.toLowerCase(name.charAt(3)) + name.substring(4); 
        // get parameter value: 
        String param = getString(request, prop); 
        if(param!=null && !param.equals("")) { 
         //ms.setAccessible(true); 
         if(type.equals("java.lang.String")) { 
          ms.invoke(bean, new Object[] {param}); 
         } 
         else if(type.equals("int") || type.equals("java.lang.Integer")) { 
          ms.invoke(bean, new Object[] {new Integer(param)}); 
         } 
         else if(type.equals("long") || type.equals("java.lang.Long")) { 
          ms.invoke(bean, new Object[] {new Long(param)}); 
         } 
         else if(type.equals("boolean") || type.equals("java.lang.Boolean")) { 
          ms.invoke(bean, new Object[] { Boolean.valueOf(param) }); 
         } 
         else if(type.equals("java.util.Date")) { 
          Date date = DateUtil.parseDateTime(param); 
          if(date!=null) 
            ms.invoke(bean, new Object[] {date}); 
         } 
        } 
      } 
      catch(Exception e) { 
        e.printStackTrace(); 
      } 
     } 
    } 
} 
} 
} 
每當發現JavaBean中的setXxx()方法時,便自動尋找表單的對應字段xxx,如果找到,就利用反射調用此方法,將對應的字段值賦給JavaBean。 
由於表單傳遞的變量名和值全部是字符串,因此需要做某些轉換。目前,該程序能處理的數據類型包括:boolean,Boolean,int,Integer,long,Long,Date,不被支持的數據類型被自動忽略。你也可以很方便地添加新的類型。 
請 注意,只有public的set方法能夠被調用。如果你希望private或protected的set方法也能被調用,請將紅色標識的 getMethods()改為getDeclaredMethods(),以便獲得包括private和protected在內的所有方法,並將 ms.setAccessible(true);的注釋去掉,以便能正確調用private和protected方法。 
反射是Java語言非常強大的功能,但是由於反射會破壞對象封裝,並且反射調用的速度較慢,因此,只能在必要的工具類中使用。
#Java

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM