Java中反射技术点记录

来源:互联网 发布:长歌门成男脸型数据 编辑:程序博客网 时间:2024/05/20 07:52
为了避免遗忘,将Reflect中常用方法和步骤记录下来。
  1. 测试所用的person类如下:
package neuq.test;public class Person {private String name;private int age;public Person(String name, int age) {super();this.name = name;this.age = age;}public Person(){super();}
public static void staticMethod(){System.out.println("staticMethod run!!");};public void paramMethod(String name,int age){System.out.println(name+"--------"+age);}public void noParamMethod(){System.out.println("noParamMethod run!!!!");}}

2.JUnit测试代码如下:
package neuq.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;public class ReflectTest {/* * 测试拿到Class的三种方法 *  * @author:Dean * @data:2014-6-23 */@Testpublic void testGetClass() throws ClassNotFoundException{//方法一:一般不用Person p=new Person();Class c1=p.getClass();//方法二:很少用Class c2=Person.class;//方法三:常用String className="neuq.test.Person";Class c3=Class.forName(className);System.out.println(c1);System.out.println(c2);System.out.println(c3);}/* * 测试通过指定的构造器实例化对象。 * @author:Dean * @date:1994-6-23 *  */@Testpublic void testGetSpecifiedConstructor() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException,IllegalAccessException, IllegalArgumentException, InvocationTargetException{//通过类名拿到ClassString className="neuq.test.Person";Class clazz=Class.forName(className);//通过Class对象拿到Constructor,并制定参数类型。Constructor constructor=clazz.getConstructor(String.class,int.class);//通过Constructor实例化对象。Person p=(Person) constructor.newInstance("Dean",20);System.out.println(p);}/* * 测试反射字段的方法&以及暴力访问 *  * @author:Dean * @date:2014-6-23 */@Testpublic void testGetField() throws Exception{//首先拿到Class对象,并实例化String className="neuq.test.Person";Class clazz=Class.forName(className);Constructor constructor=clazz.getConstructor(String.class,int.class);Object obj=constructor.newInstance("Dean",20);/* * 拿到字段,并设置值 * 私有属性只能根据getDeclaredXXX()拿到。否则会出NoSuchXXX异常 */Field field=clazz.getDeclaredField("name");String value="Sam";//暴力访问私有属性,设置可访问性。field.setAccessible(true);field.set(obj, value);}/* *测试反射 静态方法 带参数的方法 不带参数的方法 * @ staticMethod() * @paramMethod() * @noParamMethod() *  * @author:Dean * @date:2014-6-23 */@Testpublic void testGetMethod() throws Exception{//先拿到Class的对象String className="neuq.test.Person";Class clazz=Class.forName(className);Constructor constructor=clazz.getConstructor(String.class,int.class);Object obj=constructor.newInstance("Dean",20);//先测试静态方法,不需要实例化对象Method method1=clazz.getMethod("staticMethod");method1.invoke(null, null);//测试无参数方法,需要实例化对象,不需要指定参数Method method2=clazz.getMethod("noParamMethod");method2.invoke(obj, null);//测试带参数方法,需要实例化对象,需要指定参数Method method3=clazz.getMethod("paramMethod", String.class,int.class);method3.invoke(obj, "Sam",20);}}


0 0
原创粉丝点击