美文网首页
反射机制5(反射调用普通方法)

反射机制5(反射调用普通方法)

作者: 秋笙fine | 来源:发表于2019-01-28 19:06 被阅读0次

    类中的普通方法只有在一个类产生实例化对象之后才可以调用。并且实例化对象的方式有三种。(new 克隆 反射)

    范例:定义一个类。

    
    class Book{
        private String title;
    
        /**
         * @param title the title to set
         */
        public void setTitle(String title) {
            this.title = title;
        }
        /**
         * @return the title
         */
        public String getTitle() {
            return title;
        }
    }
    

    这个类有无参构造方法,所以实例化对象的时候可以直接利用Class类中的newInstance方法获取实例化对象,然后我们需要获取普通方法时,调用Class类里的:
    public Method[] getMethods():取得一个类中的全部方法
    public Method getMethod(String name,Class<?>...parameterType):取得指定方法

    后面是跟的方法的参数类型,因为JVM是根据参数类型和个数来确定方法签名,区分不同方法的。

    以上两个操作返回java.lang.reflectMethod类的对象。
    这个类中有如下方法:
    public Object invoke(Object obj,Object...args)

    范例:反射调用普通方法(set,get方法)

    package TestDemo;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    
    class Book{
        private String title;
    
        /**
         * @param title the title to set
         */
        public void setTitle(String title) {
            this.title = title;
        }
        /**
         * @return the title
         */
        public String getTitle() {
            return title;
        }
    
    }
    
    public class TestDemo{
        
        public static void main(String[] args) throws Exception{
            Class<?> cls=Class.forName("TestDemo.Book");
            Object obj=cls.newInstance();//获取无参构造实例化对象 因为普通方法只能获取实例化对象调用
            //要操作的成员
            String fieldName="title";//
            Method setMet=cls.getMethod("set"+initcap(fieldName),String.class);
            Method getMet=cls.getMethod("get"+initcap(fieldName));
            setMet.invoke(obj, "Java Dev");//等价于Book类对象.setTitle("Java Dev")
            System.out.println(getMet.invoke(obj));
        }   
    
        public static String initcap(String str){//首字母大写方法
            return str.substring(0,1).toUpperCase()+str.substring(1);
        }
    
    
    }
    
    
    

    最终实现通过反射调用普通方法。


    image.png

    此时完全看不见具体的操作类型,也就是说利用反射可以实现任意类指定方法的调用。

    相关文章

      网友评论

          本文标题:反射机制5(反射调用普通方法)

          本文链接:https://www.haomeiwen.com/subject/rdczjqtx.html