类中的普通方法只有在一个类产生实例化对象之后才可以调用。并且实例化对象的方式有三种。(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
此时完全看不见具体的操作类型,也就是说利用反射可以实现任意类指定方法的调用。
网友评论