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

类中的普通方法只有在一个类产生实例化对象之后才可以调用。并且实例化对象的方式有三种。(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);
    }


}


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


9003228-ae9ce94c600fa371.png
image.png

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

猜你喜欢

转载自blog.csdn.net/weixin_33769207/article/details/87040392