沒什么好說的代碼。要注意的是
1.獲得方法的修飾符的方法:Modifier.toString(met[i].getModifiers()) 它原本是用數(shù)字來表示的。比如說public是1,這里要用Modifier來把相應(yīng)的數(shù)字轉(zhuǎn)換成對應(yīng)的修飾符
2.獲得參數(shù)用的是Class<?> params[] = met[i].getParameterTypes();
interface Message {
public abstract void print();
}
abstract class info {
public abstract void get();
}
class MessageImpl extends info implements Message {
@Override
public void get() {
}
@Override
public void print() {
}
public void set() {
}
}
public class TestDemo {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("cn.mldn.demo.MessageImpl");
Method met[] = cls.getMethods(); // cls.getMethods()獲得的是所有的方法包括繼承來的。
for (int i = 0; i < met.length; i++) {
System.out.print(
Modifier.toString(met[i].getModifiers()) + " " + met[i].getReturnType().getSimpleName() + " ");
System.out.print(met[i].getName() + "(");
Class<?> params[] = met[i].getParameterTypes();
for (int j = 0; j < params.length; j++) {
System.out.print(params[j].getSimpleName() + " " + "arg");
if (j < params.length - 1) {
System.out.print(",");
}
}
System.out.print(")");
Class<?> exp[] = met[i].getExceptionTypes();
if (exp.length > 0) {
System.out.print(" throws ");
for (int j = 0; j < exp.length; j++) {
System.out.print(exp[j].getSimpleName() + " ");
if (j < exp.length - 1) {
System.out.print(",");
}
}
}
System.out.println();
}
}
}
以下是對方法的調(diào)用,一般來說我們要把類中的成員封裝。用invoke來調(diào)用。
import java.lang.reflect.Method;
import cn.mldn.util.StringUtil;
class Message {
private String content;
public String print(String str){
return str;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
public class TestDemo {
public static void main(String[] args) throws Exception {
String classname = "cn.mldn.demo.Message";
String property = "content";
String value = "北京下雨了";
Class<?> cls = Class.forName(classname);
Method setMet = cls.getMethod("set"+StringUtil.initcap(property),
String.class);//這里必須固定好參數(shù)的類型,增加了耦合
Method getMet = cls.getMethod("get"+StringUtil.initcap(property));
Object obj = cls.newInstance();
setMet.invoke(obj, value);
System.out.println(getMet.invoke(obj));
}
}
上面必須固定參數(shù)類型,我們可以通過Field類來優(yōu)化。
反射的reflect包中最核心的類一共有三個:Construct,Field,Method
Fidle就是成員。不要直接通過反射進(jìn)行屬性的調(diào)用。
field.setAccessible(true)
雖然這個方法可以破壞類的封裝,讓我們直接使用成員的值。但是不要用。
public class TestDemo {
public static void main(String[] args) throws Exception {
String classname = "cn.mldn.demo.Message";
String property = "content";
String value = "北京下雨了";
Class<?> cls = Class.forName(classname);
Field field = cls.getDeclaredField(property);
Method setMet = cls.getMethod("set"+StringUtil.initcap(property),
field.getType());//獲得成員的類型
Method getMet = cls.getMethod("get"+StringUtil.initcap(property));
Object obj = cls.newInstance();
setMet.invoke(obj, value);
System.out.println(getMet.invoke(obj));
}
}