import java.lang.reflect.Field;

public class Main {
    public static void main(String[] args) {
    	HasPrivate hasPrivate = new HasPrivate();
    	
        Nakami nakami = new Nakami();
        System.out.println("Nakamiをセットします。");
        setNakami(hasPrivate, nakami);
        System.out.println("セットしたNakamiを取得します。");
        getNakami(hasPrivate, nakami);
        System.out.println("もともと入れてあるNakamiを取得します。");
        getArimasu(hasPrivate);
    }	


    public static void setNakami(HasPrivate hasPrivate, Nakami nakami) {
        try {
            Field privateField = HasPrivate.class.getDeclaredField("nakami");
            privateField.setAccessible(true);
            privateField.set(hasPrivate, nakami);
        } catch (NoSuchFieldException | SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NullPointerException e){
            e.printStackTrace();
        }
    }

    public static void getNakami(HasPrivate hasPrivate, Nakami nakami) {
        try {
            Field privateField = HasPrivate.class.getDeclaredField("nakami");
            privateField.setAccessible(true);
            Nakami nakami2 = (Nakami) privateField.get(hasPrivate);
            System.out.println("取得したnakami:" + nakami2);
            System.out.println("HasPrivateからもらったnakami:"+hasPrivate.getNakami());
            System.out.println("Nakamiのnakami:" + nakami2.nakami);
        } catch (Exception e){
            e.printStackTrace();
        }
    }

    public static void getArimasu(HasPrivate hasPrivate) {
        try {
            Field arimasu = HasPrivate.class.getDeclaredField("arimasu");
            arimasu.setAccessible(true);
            Nakami nakami = (Nakami) arimasu.get(hasPrivate);
            System.out.println("取得したarimasu:" + nakami);
            System.out.println("HasPrivateからもらったariamsu:"+hasPrivate.getArimasu());
            System.out.println("arimasuのnakami:" + nakami.nakami);
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

class HasPrivate {
    private Nakami nakami;
    private Nakami arimasu=new Nakami();

    public Nakami getNakami(){
        return nakami;
    }

    public Nakami getArimasu(){
        return arimasu;
    }
}



class Nakami {
    public String nakami="中身";
}