一、获取类的属性,构造函数
package com.whzl.reflect;
import java.lang.reflect.*;
public class ReflectHello {
/**
* @param args
*/
public static void main(String[] args) {
StringBuffer sb;
try {
//首先获取Class
Class cls = Class.forName("com.whzl.Hello");
//获取类的属性(Field)
Field fs[] = cls.getFields();
System.out.println("----------Field------------");
for(Field f:fs)
{
sb = new StringBuffer();
//默认取得的修饰符为整数,由几个修饰符叠加。需要用Modifier的toString转化一下
//String FieldM = "Field修饰符:" + Modifier.toString(f.getModifiers());
sb.append(Modifier.toString(f.getModifiers()));
//获取变量类型
//String FieldT = "Field类型:" + f.getType();
sb.append(" " + f.getType().getName());
//获取变量名称
//String FieldN = "Field名称:" + f.getName()
sb.append(" " + f.getName());
//f.get(),返回指定对象上此Field的值,因此需要传入对象。需要传入对象
//String FieldV = "Field值:" + f.get(cls.newInstance());
sb.append(" = " + f.get(cls.newInstance()));
System.out.println(sb.toString());
Object object = cls.newInstance();
System.out.println("修改前:" + f.get(object));
f.set(object, "修改了!嘎嘎!");
System.out.println("修改后:" + f.get(object));
sb = null;
}
System.out.println("---------Constructor--------");
Constructor cs[] = cls.getConstructors();
for(Constructor c: cs)
{
//首先获取修饰符
System.out.print(Modifier.toString(c.getModifiers()));
//构造方法名称
System.out.print(" " + c.getName());
//获取参数类
Class ts [] = c.getParameterTypes();
for(Class t:ts)
{
System.out.print(" " + t.getName());
}
System.out.println();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、调用构造函数
package com.whzl.reflect;
import java.lang.reflect.Constructor;
import com.whzl.Hello;
public class CallHelloConstructor {
/**
* @param args
*/
public static void main(String[] args) {
try {
//获得类
Class cls = Class.forName("com.whzl.Hello");
//构造函数是根据参数类型去寻找的
Class parmsType [] = new Class[3];
parmsType[0] = String.class;
parmsType[1] = String.class;
parmsType[2] = Integer.TYPE;
Constructor con = cls.getConstructor(parmsType);
//设置参数
Object obj[] = new Object[3];
obj[0] = "风影";
obj[1] = "程序员";
obj[2] = 25;
//实例化
Hello hello = (Hello)con.newInstance(obj);
//调用无参构造方法
cls.getConstructor(null).newInstance(null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、调用方法
package com.whzl.reflect;
import java.lang.reflect.Method;
public class CallHelloMethod {
/**
* @param args
*/
public static void main(String[] args) {
try
{
//获得类
Class cls = Class.forName("com.whzl.Hello");
//获取所有的方法
Method [] ms = cls.getMethods();
for(Method m:ms)
{
System.out.print(m.getName());
System.out.print(" " + m.getReturnType().getName());
Class ts [] = m.getParameterTypes();
for(Class t:ts)
{
System.out.print(" " + t.getName());
}
System.out.println();
}
//我们这里调用sayHelloToSb,通过方法名和参数类型获取方法,多参数可以使用数组
Method m = cls.getMethod("sayHelloToSb", String.class);
//设置参数
//实例化对象
System.out.println("------------------------------");
Object obj = cls.newInstance();
System.out.println("------------------------------");
//调用方法,并设置参数的值,多参数可以使用数组
Object result = m.invoke(obj, "Jay Chou");
System.out.println(result);
}
catch(Exception e)
{
}
}
}