反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。
----》要想这样使用,首先你必须得到class文件对象,其实也就是得到Class类的对象。
获取class文件对象的方式:
A:Object类的getClass()方法 Person p = new Person();
Class c = p.getClass();
B:数据类型的静态属性class Class c = Person.class;
C:Class类中的静态方法 Class.forName("zj_tech_test.Person")
public static Class forName(String className)
通过反射获取构造方法
Class c= Class.forName("zj_tech_test.Person")
Construct con=c.getConstructor();// 返回的是构造方法对象
Object obj = con.newInstance();//实例化
Person p=(Person)obj;
然后可以通过p调用方法。
获取所有的成员变量
Class c= Class.forName("zj_tech_test.Person")
Field[] fields = c.getFields();
获取所有的成员变量
Field[] fields = c.getDeclaredFields();
// 获取单个的成员变量
// 获取age并对其赋值
Field addressField = c.getField("age");
// 获取
私有成员
并对其赋值
// NoSuchFieldException
Field nameField = c.getDeclaredField("name");
nameField.setAccessible(true);//私有方法要可见
nameField.set(obj, "林青霞");//设置值
// 获取所有的方法
// Method[] methods = c.getMethods(); // 获取自己的包括父亲的公共方法
// Method[] methods = c.getDeclaredMethods(); // 获取自己的所有的方法
第一个参数表示的方法名,第二个参数表示的是方法的参数的class类型
public Method getMethod(Stringname,Class<?>...parameterTypes)
eg.
// public void method(String s)
Method m2 = c.getMethod("method", String.class);
//调用方法invoke()
// 返回值是Object接收,第一个参数表示对象是谁,第二参数表示调用该方法的实际参数
// public Object invoke(Object
obj
,Object...
args
)
eg. //public String getString(String s, int i)
Constructor con = c.getConstructor();
Object
obj
= con.newInstance();
Method m3 = c.getMethod("getString",
String.class
,
int.class
);
Object objString = m3.invoke(
obj
, "
hello
",
100
);