zoukankan      html  css  js  c++  java
  • 反射(三)

    一,通过反射调用类中的方法

    在Class类中使用以下的方法取得要调用方法的Method对象:

    public Method getMethod(String name,Class<?>...parameterTypes)

    取得Method对象之后,通过如下方法进行调用:

    public Object invoke(Object obj,Object...args)

    二,使用反射调用程序中的set和get方法

    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;


    interface info
    {
     public String getInfo();
     public String say(String name,String content);
     public void sayHello();
    }
    class Person implements info
    {
     private String name;
     private int age;
     public Person(){}
     public Person(String name)
     {
      this.name=name;
     }
     public Person(String name,int age)
     {
       this(name);
       this.age=age;
     }
     public String getInfo() {
      return "Hello";
     }
     public String say(String name, String content) {
      return "world";
     }
     public void sayHello() {
      System.out.println("new Year!");
     }
    }
    public class ReflectDemo {
     public static void main(String args[]) throws Exception
     {
      Class<?> c=Class.forName("Person");
      //调用类中无参,没有返回值的方法
      Method met=c.getMethod("sayHello");
         //执行方法
      met.invoke(c.newInstance());
      
      //调用有返回值的方法
      Method me=c.getMethod("getInfo");
         String val=(String)met.invoke(c.newInstance());
         System.out.println(val);
     
         //调用有返回值,有参数的方法
    //     Method m=c.getMethod("say", String.class,String.class);
    //     String val1=(String)m.invoke(c.newInstance(),"jin","zq");
    //     System.out.println(val1);
         Object o=c.newInstance();
         set("name","jin",o,String.class);
         get("name",o,String.class);
     } 
        /*
         *
         * @param name 属性名称
         * @param value 属性值
         * @param obj 要操作的对象     *
         * */
     public static void set(String name,String value,Object obj,Class<?> type) throws Exception
        {
      Method met=obj.getClass().getMethod("set"+initStr(name),type);
      met.invoke(obj, value);
      System.out.println(initStr(name));
        }
     public static void get(String name,Object obj) throws Exception
     {
      Method met=obj.getClass().getMethod("get"+initStr(name));
      Object value=met.invoke(obj);
      System.out.println(value);
     }
     public static String initStr(String name)
     {
      StringBuffer buf=new StringBuffer();
      buf.append(name.substring(0,1).toUpperCase()).append(name.substring(1));
         return buf.toString();
     }
    }

    三,通过反射直接操作属性

    import java.lang.reflect.Field;
    public class InvokeFieldDemo {

     public static void main(String args[]) throws Exception
     {
      Class<?> c=Class.forName("Person");
      Object obj=c.newInstance();
      Field nameField=c.getDeclaredField("name");
      nameField.setAccessible(true);//让属性可见
      nameField.set(obj,"jin");
      System.out.println(nameField.get(obj));
     }
    }

    属性也是可以通过代码设置访问权限的。

  • 相关阅读:
    Qt Installer Framework翻译(7-0)
    Qt Installer Framework翻译(4)
    Qt Installer Framework翻译(6-0)
    Qt Installer Framework翻译(5-4)
    Qt Installer Framework翻译(5-3)
    Qt Installer Framework翻译(5-2)
    Qt Installer Framework翻译(5-1)
    Qt Installer Framework翻译(5-0)
    Qt Installer Framework翻译(3-5)
    angularjs1.X进阶笔记(3)——如何重构controller
  • 原文地址:https://www.cnblogs.com/jinzhengquan/p/1948886.html
Copyright © 2011-2022 走看看