• 反射中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....
    " + 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
  • 相关阅读:
    洛谷P2466 [SDOI2008]Sue的小球 题解 区间DP+费用提前计算
    中国国家集训队论文集目录(1999-2008)
    洛谷P1726 上白泽慧音 题解 强连通分量
    洛谷P1410 子序列 题解 动态规划
    树堆(Treap)学习笔记 2020.8.12
    伸展树(Splay)学习笔记
    git操作
    yii 缓存探究
    yii之srbac详解
    一个PDO类
  • 原文地址:https://www.cnblogs.com/qqzy168/p/3622712.html
Copyright © 2020-2023  润新知