- packagecom.syh.jdbc.reflection_super;
- /**
- *父类
- *@authorsyh
- *
- */
- publicclassParent{
- publicStringpublicField="1";
- StringdefaultField="2";
- protectedStringprotectedField="3";
- privateStringprivateField="4";
- publicvoidpublicMethod(){
- System.out.println("publicMethod...");
- }
- voiddefaultMethod(){
- System.out.println("defaultMethod...");
- }
- protectedvoidprotectedMethod(){
- System.out.println("protectedMethod...");
- }
- privatevoidprivateMethod(){
- System.out.println("privateMethod...");
- }
- }
- packagecom.syh.jdbc.reflection_super;
- importjava.lang.reflect.Field;
- importjava.lang.reflect.InvocationTargetException;
- importjava.lang.reflect.Method;
- /**
- *方法类
- *@authorsyh
- *
- */
- publicclassReflectionUtils{
- /**
- *循环向上转型,获*@paramobject:子类对象
- *@parammethodName:父类中的方法名
- *@paramparameterTypes:父类中的方法参数类型
- *@return父类中的方法对象
- */
- publicstaticMethodgetDeclaredMethod(Objectobject,StringmethodName,Class<?>...parameterTypes){
- Methodmethod=null;
- for(Class<?>clazz=object.getClass();clazz!=Object.class;clazz=clazz.getSuperclass()){
- try{
- method=clazz.getDeclaredMethod(methodName,parameterTypes);
- returnmethod;
- }catch(Exceptione){
- //这里甚么都不能抛出去。
- //如果这里的异常打印或者往外抛,则就不会进入
- }
- }
- returnnull;
- }
- /**
- *直接调用对象方法,而忽略修饰符(private,protected,default)
- *@paramobject:子类对象
- *@parammethodName:父类中的方法名
- *@paramparameterTypes:父类中的方法参数类型
- *@paramparameters:父类中的方法参数
- *@return父类中方法的执行结果
- */
- publicstaticObjectinvokeMethod(Objectobject,StringmethodName,Class<?>[]parameterTypes,
- Object[]parameters){
- //根据对象、方法名和对应的方法参数通过取Method对象
- Methodmethod=getDeclaredMethod(object,methodName,parameterTypes);
- //抑制Java对方法进行检查,主要是针对私有方法而言
- method.setAccessible(true);
- try{
- if(null!=method){
- //调用object的method所代表的方法,其方法的参数是parameters
- returnmethod.invoke(object,parameters);
- }
- }catch(IllegalArgumentExceptione){
- e.printStackTrace();
- }catch(IllegalAccessExceptione){
- e.printStackTrace();
- }catch(InvocationTargetExceptione){
- e.printStackTrace();
- }
- returnnull;
- }
- /**
- *循环向上转型,获*@paramobject:子类对象
- *@paramfieldName:父类中*@return父类中*/
- publicstaticFieldgetDeclaredField(Objectobject,StringfieldName){
- Fieldfield=null;
- Class<?>clazz=object.getClass();
- for(;clazz!=Object.class;clazz=clazz.getSuperclass()){
- try{
- field=clazz.getDeclaredField(fieldName);
- returnfield;
- }catch(Exceptione){
- //这里甚么都不能抛出去。
- //如果这里的异常打印或者往外抛,则就不会进入
- }
- }
- returnnull;
- }
- /**
- *直接设置对象属性值,忽略private/protected修饰符,也*@paramobject:子类对象
- *@paramfieldName:父类中*@paramvalue:将要设置的值
- */
- publicstaticvoidsetFieldValue(Objectobject,StringfieldName,Objectvalue){
- //根据对象和属性名通过取Field对象
- Fieldfield=getDeclaredField(object,fieldName);
- //抑制Java对其的检查
- field.setAccessible(true);
- try{
- //将object中field所代表的值设置为value
- field.set(object,value);
- }catch(IllegalArgumentExceptione){
- e.printStackTrace();
- }catch(IllegalAccessExceptione){
- e.printStackTrace();
- }
- }
- /**
- *直接读的属性值,忽略private/protected修饰符,也*@paramobject:子类对象
- *@paramfieldName:父类中*@return:父类中*/
- publicstaticObjectgetFieldValue(Objectobject,StringfieldName){
- //根据对象和属性名通过取Field对象
- Fieldfield=getDeclaredField(object,fieldName);
- //抑制Java对其的检查
- field.setAccessible(true);
- try{
- //获的属性值
- returnfield.get(object);
- }catch(Exceptione){
- e.printStackTrace();
- }
- returnnull;
- }
- }
- packagecom.syh.jdbc.reflection_super;
- importstaticorg.junit.Assert.*;
- importjava.lang.reflect.Field;
- importjava.lang.reflect.Method;
- importorg.junit.Test;
- /**
- *测试类,用JUnit4进行测试
- *@authorsyh
- *
- */
- publicclassReflectionUtilsTest{
- /**
- *测试获父类的各个方法对象
- */
- @Test
- publicvoidtestGetDeclaredMethod(){
- Objectobj=newSon();
- //获MethodpublicMethod=ReflectionUtils.getDeclaredMethod(obj,"publicMethod");
- System.out.println(publicMethod.getName());
- //获MethoddefaultMethod=ReflectionUtils.getDeclaredMethod(obj,"defaultMethod");
- System.out.println(defaultMethod.getName());
- //获MethodprotectedMethod=ReflectionUtils.getDeclaredMethod(obj,"protectedMethod");
- System.out.println(protectedMethod.getName());
- //获MethodprivateMethod=ReflectionUtils.getDeclaredMethod(obj,"privateMethod");
- System.out.println(privateMethod.getName());
- }
- /**
- *测试调用*@throwsException
- */
- @Test
- publicvoidtestInvokeMethod()throwsException{
- Objectobj=newSon();
- //调用ReflectionUtils.invokeMethod(obj,"publicMethod",null,null);
- //调用ReflectionUtils.invokeMethod(obj,"defaultMethod",null,null);
- //调用ReflectionUtils.invokeMethod(obj,"protectedMethod",null,null);
- //调用ReflectionUtils.invokeMethod(obj,"privateMethod",null,null);
- }
- /**
- *测试获父类的各个属性名
- */
- @Test
- publicvoidtestGetDeclaredField(){
- Objectobj=newSon();
- //获FieldpublicField=ReflectionUtils.getDeclaredField(obj,"publicField");
- System.out.println(publicField.getName());
- //获FielddefaultField=ReflectionUtils.getDeclaredField(obj,"defaultField");
- System.out.println(defaultField.getName());
- //获FieldprotectedField=ReflectionUtils.getDeclaredField(obj,"protectedField");
- System.out.println(protectedField.getName());
- //获FieldprivateField=ReflectionUtils.getDeclaredField(obj,"privateField");
- System.out.println(privateField.getName());
- }
- @Test
- publicvoidtestSetFieldValue(){
- Objectobj=newSon();
- System.out.println("原来的各个属性的值:");
- System.out.println("publicField="+ReflectionUtils.getFieldValue(obj,"publicField"));
- System.out.println("defaultField="+ReflectionUtils.getFieldValue(obj,"defaultField"));
- System.out.println("protectedField="+ReflectionUtils.getFieldValue(obj,"protectedField"));
- System.out.println("privateField="+ReflectionUtils.getFieldValue(obj,"privateField"));
- ReflectionUtils.setFieldValue(obj,"publicField","a");
- ReflectionUtils.setFieldValue(obj,"defaultField","b");
- ReflectionUtils.setFieldValue(obj,"protectedField","c");
- ReflectionUtils.setFieldValue(obj,"privateField","d");
- System.out.println("***********************************************************");
- System.out.println("将属性值改变后的各个属性值:");
- System.out.println("publicField="+ReflectionUtils.getFieldValue(obj,"publicField"));
- System.out.println("defaultField="+ReflectionUtils.getFieldValue(obj,"defaultField"));
- System.out.println("protectedField="+ReflectionUtils.getFieldValue(obj,"protectedField"));
- System.out.println("privateField="+ReflectionUtils.getFieldValue(obj,"privateField"));
- }
- @Test
- publicvoidtestGetFieldValue(){
- Objectobj=newSon();
- System.out.println("publicField="+ReflectionUtils.getFieldValue(obj,"publicField"));
- System.out.println("defaultField="+ReflectionUtils.getFieldValue(obj,"defaultField"));
- System.out.println("protectedField="+ReflectionUtils.getFieldValue(obj,"protectedField"));
- System.out.println("privateField="+ReflectionUtils.getFieldValue(obj,"privateField"));
- }
- }