反射是指java语言在运行时,能够通过类名动态获取此类的构造体、字段、方法。
(1)获取构造体
public static void getConstructor(){
try {
Class clazz = Class.forName("reflected.Student");//Student.class;
Constructor[] arrayCon = clazz.getConstructors();
for(Constructor c : arrayCon){
System.out.println(c);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
(2) 获取字段
public static void getField(){
try {
Class clazz = Class.forName("reflected.Student");
//获取public字段
Field[] fieldArray = clazz.getFields();
for(Field c : fieldArray){
System.out.println(c.getName());
}
//获取所有声明的字段
fieldArray = clazz.getDeclaredFields();
for(Field c : fieldArray){
System.out.println(c);
}
//根据名称获取字段名
Field field = clazz.getField("name");
System.out.println(field);
//通过get方法获取字段的值
Object obj = clazz.newInstance();
PropertyDescriptor pd = new PropertyDescriptor("name",clazz);
Method methodSet = pd.getWriteMethod(); //获取这个字段的set方法
methodSet.invoke(obj,"xjz"); //执行set方法,给这个字段赋值xjz
Method methodGet = pd.getReadMethod(); //获取这个字段的get方法
Object object = methodGet.invoke(obj); //执行get方法,获取这个字段的值
System.out.println("name值:" + object.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
(3)获取方法
public String show1(String s){
System.out.println("调用了:公有的,String参数的show1(): s = " + s);
return "新值:" + s;
}
public static void getMethod(){
try {
Class clazz = Class.forName("reflected.Student");
//获取public方法
Method[] methods = clazz.getMethods();
for(Method method : methods){
String name = method.getName();
System.out.println("Method:" + name);
}
//获取所有声明的方法
Method[] declaredMethods = clazz.getDeclaredMethods();
for(Method method : methods){
String name = method.getName();
System.out.println("DeclaredMethod:" + name);
}
//根据方法名获取方法、执行方法
Object obj = clazz.newInstance();
Method method = clazz.getMethod("show1", String.class); //String.class是参数类型
Object object = method.invoke(obj, "测试"); //测试是参数的值
System.out.println("InvokeMethod:" + object.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}