Java 反射简单的使用方法

本文主要举例,获取其他类的:私有变量的值,调用成员方法,调用私有构造方法(包括带参数和不带参数的方法)

拥有私有变量,私有成员方法和私有构造方法的内。

package FanShe;

public class MyData {

    private static final int a = 1;
    private void eat(){
        System.out.println("调用了无参方法eat");
    }
    private MyData(){
        System.out.println("调用了无参构造方法");
    }

    private void eat(int param){
        System.out.println("调用了有一个参数的方法eat,参数的值是:"+param);
    }
    private MyData(int param1,int param2){
        System.out.println("调用了有两个参数的构造方法,参数的值是:"+param1+" 和"+param2);

    }
}

调用MyData中的私有成员方法和构造方法,以及访问私有变量的类。

package FanShe;


import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) {
        try {
            Class myClass =  Class.forName("FanShe.MyData");//包名加类名
            //调用无参数私有构造方法,参数是构造方法的参数的类型类,没有参数就传入null
            Constructor constructor=myClass.getDeclaredConstructor(null);
            constructor.setAccessible(true);//使可以访问private域
            MyData myData= (MyData) constructor.newInstance();
            //调用两参数私有构造方法需要注意的是此处不能用Integer.class
            Constructor constructor2=myClass.getDeclaredConstructor(int.class,int.class);
            constructor2.setAccessible(true);
            constructor2.newInstance(1,2);
            //获取私有变量值
            Field field = myClass.getDeclaredField("a");
            field.setAccessible(true);
            System.out.println("私有变量a的值是:"+field.get(myData));
            //调用无参私有方法
            Method method = myClass.getDeclaredMethod("eat");
            method.setAccessible(true);
            method.invoke(myData);
            //调用有参数私有方法
            Method method2 = myClass.getDeclaredMethod("eat",int.class);
            method2.setAccessible(true);
            method2.invoke(myData,12);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

结果:
这里写图片描述

也许事先不知道有哪些方法,构造方法或变量,可以先将私有方法,私有变量及构造方法,罗列打印出来:

try {
 Class myClass = Class.forName("FanShe.MyData");//包名加类名
 //打印所有方法
            System.out.println("\n打印所有方法");
            Method[] methods = myClass.getDeclaredMethods();
            for (Method m:methods) {
                System.out.println(m.toString());
            }
            //打印所有变量
            System.out.println("\n打印所有变量");

            Field[] fields = myClass.getDeclaredFields();
            for (Field f:fields) {
                System.out.println(f.toString());
            }

            //打印所有构造方法
            System.out.println("\n打印所有构造方法");
            Constructor[] constructors = myClass.getDeclaredConstructors();
            for (Constructor c:constructors) {
                System.out.println(c.toString());
            }
             } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

结果比较清晰
这里写图片描述

猜你喜欢

转载自blog.csdn.net/htwhtw123/article/details/80721077
今日推荐