构造类对象
使用构造器新建对象。根据指定的参数类型找到相应的构造函数,传入相应参数调用执行,以创建一个新的对象实例。
private static void operateConstructor(String className) throws Exception{
Class clazz = Class.forName(className);
//调无参public的构造方法,太简单了,直接调newInstance();
//Object obj = clazz.newInstance();
//相当于要实现: Person p = new Person("Jack",10);
//1先获取“Person(String name, int age)”这个构造方法--Constructor对象--con
Class parameterTypes[] = new Class[2]; //组织形参
parameterTypes[0] = String.class;
//parameterTypes[1] = int.class;//※※※Person类中的构造方法为“public Person(String name, int age)”时,OK。但构造方法为“public Person(String name, Integer age)”时,WA。
//parameterTypes[1] = Integer.class; //当构造方法为“public Person(String name, int age)”时,不行,因为它会在匹配构造方法时,严格匹配第2个参数为“Integer”的构造方法,不会自动装箱拆箱
parameterTypes[1] = Integer.TYPE; //※※※该TYPE属性即是int。当Person类中的构造方法为“public Person(String name, int age)”时,OK。但构造方法为“public Person(String name, Integer age)”时,WA。
Constructor con = clazz.getConstructor(parameterTypes);
//2然后把参数“Jack,10”传入,调用该"Constructor对象--con"的newInstance方法,进行创建对象
//组织实参
Object params[] = new Object[2];
params[0] = new String("Jack");
params[1] = new Integer(20);
//调用构造方法
Object retObj = con.newInstance(params);
System.out.println(retObj);
}
调用方法
根据方法名称执行方法。根据方法名与参数类型匹配指定的方法,传入相应参数与对象进行调用执行。若是静态方法,则不需传入具体对象。
private static void callMethod(String className) throws Exception{
Class clazz = Class.forName(className);
//※调用空参方法
//1先获取Method对象
Method method = clazz.getMethod("toString", null);
Object obj = clazz.newInstance();
//2再执行该Method对象的invoke()方法
Object returnValue = method.invoke(obj, null);//obj.toString();
//Person p = new Person("Jack",30);
//Object returnValue = method.invoke(p, null);
System.out.println(returnValue);
//※调用带参数的方法
//1先获取Method对象--m--需要先构造形参,通过形参找到对应的方法
Class paramTypes[] = new Class[2];
paramTypes[0] = Integer.TYPE;
paramTypes[1] = double.class;
Method m = clazz.getMethod("sum",paramTypes );
//2再执行该Method对象的invoke()方法 -----需要一个对象obj,还需要相应的实参
Object obj2 = clazz.newInstance();
Object params2[] = new Object[2];
params2[0] = 100;
params2[1] = 123.5;
Object retObj2 = m.invoke(obj2,params2 );
System.out.println("retObj2= "+retObj2);
//※调用静态方法
Method m2 = clazz.getMethod("show", null);
m2.invoke(null, null);//对象用null
}
获取设置属性
根据属性名称读取与修改属性的值,访问非静态属性需传入对象为参数。
private static void changeFieldValue(String className) throws Exception{
Class clazz = Class.forName(className);
Field fld = clazz.getField("age");
Object p = clazz.newInstance();
//fld.setInt(p, 100);
//System.out.println(fld.getInt(p));
fld.set(p, 66);
Object retObj = fld.get(p);
System.out.println(retObj);
}