准备一个实体类:
package test.reflect; /** * 反射使用的实体类 * * @author liulei on 2018/11/28 */ public class User { //字段 private String username; private String pwd; private String uid="1001"; //构造方法 public User(){ } public User(String username){ this.username=username; } public User(String username,String pwd){ this.username=username; this.pwd=pwd; } //实例方法 public void function1(){ System.out.println("function1"); } public void function2(String username){ System.out.println("function2"); } public String function3(String username,String pwd){ System.out.println("function3"); return username; } public String getUid(){ return uid; } }
测试类:
package test.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 反射的测试类
*
* @author liulei on 2018/11/28
*/
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException {
//获取一个类对象
Class<?> c = Class.forName("test.reflect.User");
//获取一个无参数的构造器
Constructor<?> constructor = c.getConstructor();
//利用构造方法创建对象
Object o = constructor.newInstance();
//因为字段是私有的,所以不能这样获取
// Field field = c.getField(null);
Field[] declaredFields = c.getDeclaredFields();
//循环输出字段
for(int i=0;i<declaredFields.length;i++){
//设置私有字段可以访问,如果不设置这一步,就会报private错误
declaredFields[i].setAccessible(true);
System.out.println("ziduan:"+declaredFields[i].getName());
// System.out.println(declaredFields[i].toString());
}
//获取构造方法
System.out.println(c.getDeclaredConstructor(null));
System.out.println(c.getConstructor(String.class));
System.out.println(c.getConstructor(String.class,String.class));
//获取实例方法的名称
System.out.println(c.getMethod("function1").getName());
System.out.println(c.getMethod("function2", String.class).getName());
System.out.println(c.getMethod("function3", String.class, String.class).getName());
//method和invoke;invoke是调用实例方法
Method function1 = c.getDeclaredMethod("function1");
function1.invoke(o);
//获取实体类中的常量值
Method id= c.getDeclaredMethod("getUid");
//invoke方法是对有参数的方法进行调用
Object invoke = id.invoke(o);
System.out.println(invoke);
Method function3 = c.getDeclaredMethod("function3", String.class, String.class);
String name=function3.invoke(o,"zhangsan","lisi").toString();
System.out.println("1111111111");
System.out.println(name);
}
}