允许在运行时通过Java Reflection APIS(即java.lang.Reflect.*;)来取得已知名字的class类的相关信息,动态地生成此类,并调用其方法或修改其生命围绕private的域的方法。
通过类名动态生成类,并对该类的动态属性----方法,进行操作。
2. 实例说明
package com.lxh.reflact;
public class A {
@SuppressWarnings("unused")
private String name = "ddd";
protected int age;
// 构造方法
public A() {
}
public A(String name, int age) {
this.name = name;
this.age = age;
}
// 普通方法
protected void showMess() {
System.out.println("Hello World ...");
}
public void showMess2(String s) {
System.out.println("Hello World2 ...\t" + s);
}
@SuppressWarnings("unused")
private void showMess3() {
System.out.println("Hello World3 ...");
}
@SuppressWarnings("unused")
private void showMess4(String s) {
System.out.println("Hello World4 ...\t" + s);
}
}
package com.lxh.reflact;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 通过java反射实现对目标类的字段和属性进行操作
*/
public class ReflectTest {
@SuppressWarnings("rawtypes")
public static void main(String[] args) {
try {
Class<?> a = Class.forName("com.lxh.reflact.A");
System.out.println(A.class.isInstance(a));
System.out
.println("$$$$$$$$$$$$$$$$$$$$$$$$反射获取所有方法$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
Method met[] = a.getDeclaredMethods();
// Method.setAccessible(met, true);// // 可以获取private,protected类型的方法
for (Method m : met) {
System.out.println(m);
}
System.out
.println("$$$$$$$$$$$$$$$$$$$$$$$$反射获取构造方法$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
Constructor cons[] = a.getConstructors();
for (Constructor con : cons) {
System.out.println(con);
}
System.out
.println("$$$$$$$$$$$$$$$$$$$$$$$反射获取单个方法并执行$$$$$$$$$$$$$$$$$$$$$$$$$$$");
Object obj2 = a.newInstance();
Class arg[] = new Class[] { String.class };// 注意对有参函数调用的辅助参数
Method m2 = a.getDeclaredMethod("showMess4", arg);
System.out.println(m2);
m2.setAccessible(true);
m2.invoke(obj2, "lxh"); // 此时能调用private修饰的方法
System.out
.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$反射获取所有字段及值$$$$$$$$$$$$$$$$$$$$$$$");
Field fds[] = a.getDeclaredFields();
Field.setAccessible(fds, true);// 可以获取private,protected类型的字段
for (Field f : fds) {
System.out.println(f.getName() + "\t" + f.get(a.newInstance()));
}
System.out
.println("======================获取单个字段并进行修改======================");
Object obj = a.newInstance();
Field f = a.getDeclaredField("name");
f.setAccessible(true);// 可以操作private,protected类型的字段
System.out.print("原 值:\t");
System.out.println("name:\t" + f.get(obj));
f.set(obj, "lxh4");
System.out.print("更新后:\t");
System.out.println("name:\t" + f.get(obj));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
package com.lxh.reflact;
/**
* java反射机制实例的判断
*/
public class ReflectTest2 {
public static void main(String[] args) {
try {
Class<?> a = Class.forName("com.lxh.reflact.A");
Object obj = a.newInstance();
System.out.println("============判断a是否为A类的一个实例===========");
System.out.println(a+"\t"+a.isInstance(a)); // ---->false,原因同 A.class.isInstance(A.class)
System.out.println(a.isInstance(obj));// true
System.out.println(a.getClass().isInstance(a));// true
System.out.println("============判断a.newInstance()是否为A类的一个实例:");
System.out.println("a:"+a+"\tb:"+obj);
System.out.println(a.isInstance(obj));// ---->true
System.out.println(a.getClass().isInstance(obj));// false
System.out.println("============判断a是否A类属于同一个类:");
System.out.println(a.isAssignableFrom(obj.getClass()));// true
System.out.println(a+", "+a.getClass()+"\t\t"+a.isAssignableFrom(a.getClass()));// ---->false
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}

package com.lxh.reflact;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.springframework.util.ReflectionUtils;
/**
* 使用反射工具类操作目标类方法
*/
public class ReflectTest3 {
@SuppressWarnings("rawtypes")
public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
Method m1 = ReflectionUtils.findMethod(A.class, "showMess");
m1.setAccessible(true);
m1.invoke(A.class.newInstance(), new Object[]{});
Class arg[] = new Class[] { String.class };// 注意对有参函数调用的辅助参数
Method m2 = ReflectionUtils.findMethod(A.class, "showMess4", arg);
m2.setAccessible(true);
System.out.println(m2);
m2.invoke(A.class.newInstance(), new String("lxh"));
}
}
小结:
1. Java反射机制的作用:
<1> 在运行时判断任意一个对象所属的类;
<2> 在运行时获取类的对象;
<3> 在运行时获得类所具有的成员变量和方法等;
2. java反射机制应用层次概括