一,通过反射调用类中的方法
在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));
}
}
属性也是可以通过代码设置访问权限的。