★ 构造类对象
使用构造器新建对象。根据指定的参数类型找到相应的构造函数,传入相应参数调用执行,以创建一个新的对象实例。
代码演示:
package cn.hncu.reflect.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.junit.Test;
/**
*
* 利用类反射访问(调用)构造器、方法、属性
*
*@author <a"283505495@qq.com">lxd</a>
*@version 1.0 2017-4-19 下午6:29:50
*@fileName ReflectOperateObj.java
*/
public class ReflectOperateObj {
@Test
public void constructorDemo() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{
Class c=Class.forName("cn.hncu.reflect.test.UserModel2");
Object obj=c.newInstance();
System.out.println("1:"+obj.toString());
Class[] parameterTypes=new Class[2];
parameterTypes[0]=String.class;
parameterTypes[1]=int.class;
Constructor con=c.getDeclaredConstructor(parameterTypes);
Object[] initargs=new Object[2];
initargs[0]=new String("Jack");
initargs[1]=new Integer(23);
Object obj2=con.newInstance(initargs);
System.out.println("2:"+obj2);
}
★ 调用方法
根据方法名称执行方法。根据方法名与参数类型匹配指定的方法,传入相应参数与对象进行调用执行。若是静态方法,则不需传入具体对象。
代码演示:
@Test
public void methodDemo() throws Exception{
Class c=Class.forName("cn.hncu.reflect.test.UserModel2");
Method m=c.getDeclaredMethod("toString", null);
Object user=c.newInstance();
Object str=m.invoke(user, null);
System.out.println("1:"+str);
Class[] parameterTypes=new Class[2];
parameterTypes[0]=int.class;
parameterTypes[1]=double.class;
Method m2=c.getDeclaredMethod("sum", parameterTypes);
Object resObj=m2.invoke(c.newInstance(), new Object[]{23,100.12} );
System.out.println("2:"+resObj);
Method m3=c.getDeclaredMethod("abc", null);
m3.invoke(c.newInstance(), null);
}
★ 获取与设置属性值
根据属性名称读取与修改属性的值,访问非静态属性需传入对象为参数。
代码演示:
@Test
public void fieldDemo() throws Exception{
Class c=Class.forName("cn.hncu.reflect.test.UserModel2");
Field fld=c.getField("MAX");
fld.set(null, 222);
Object v1=fld.get(null);
System.out.println("1:"+v1);
Field fld2=c.getField("value");
Object v2=fld2.get(c.newInstance());
System.out.println("v2:"+v2);
}
暴力访问所有成员:
代码演示:
@Test
public void violenceDemo() throws Exception{
Class c=Class.forName("cn.hncu.reflect.test.UserModel2");
Method m=c.getDeclaredMethod("psum", new Class[]{int.class,double.class,float.class});
m.setAccessible(true);
Object resStr=m.invoke(c.newInstance(), new Object[]{23,2.1,12f});
System.out.println(resStr);
}
}