反射中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语言非常强大的功能,但是由于反射会破坏对象封装,并且反射调用的速度较慢,因此,只能在必要的工具类中使用。
posted @ 2016-11-21 16:42  旧巷里的旧少年  阅读(307)  评论(0编辑  收藏  举报