java/reflexe/src/cz/frantovo/příklady/reflexe/Reflexe.java
changeset 27 165fb7ff9855
child 36 03757ff74694
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/java/reflexe/src/cz/frantovo/příklady/reflexe/Reflexe.java	Sun Jun 14 01:41:47 2015 +0200
     1.3 @@ -0,0 +1,98 @@
     1.4 +package cz.frantovo.příklady.reflexe;
     1.5 +
     1.6 +import java.lang.reflect.Field;
     1.7 +import java.math.BigDecimal;
     1.8 +import java.math.RoundingMode;
     1.9 +import java.util.function.Consumer;
    1.10 +
    1.11 +/**
    1.12 + *
    1.13 + * @author Ing. František Kučera (frantovo.cz)
    1.14 + */
    1.15 +public class Reflexe {
    1.16 +
    1.17 +	private static final String NÁZEV_PROMĚNNÉ = "proměnná";
    1.18 +	private static final int POČET_OPAKOVÁNÍ = 1000000;
    1.19 +	private static final RoundingMode ZAOKROUHLOVÁNÍ = RoundingMode.UP;
    1.20 +	private static final int PŘESNOST_PROCENT = 2;
    1.21 +
    1.22 +	private static void nastav(Object objekt, String proměnná, Object hodnota) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
    1.23 +		Field f = objekt.getClass().getDeclaredField(proměnná);
    1.24 +		f.setAccessible(true);
    1.25 +		f.set(objekt, hodnota);
    1.26 +		// TODO: můžeme odchytávat výjimky a vyhazovat vlastní výjimku případně běhovou
    1.27 +	}
    1.28 +
    1.29 +	private static void testSetter(int početOpakování) {
    1.30 +		NějakáTřída t = new NějakáTřída();
    1.31 +		for (int i = 0; i < početOpakování; i++) {
    1.32 +			t.setProměnná(i);
    1.33 +		}
    1.34 +	}
    1.35 +
    1.36 +	private static void testPřímýPřístup(int početOpakování) {
    1.37 +		NějakáTřída t = new NějakáTřída();
    1.38 +		for (int i = 0; i < početOpakování; i++) {
    1.39 +			t.veřejnáProměnná = i;
    1.40 +		}
    1.41 +	}
    1.42 +
    1.43 +	private static void testReflexe(int početOpakování) {
    1.44 +		NějakáTřída t = new NějakáTřída();
    1.45 +		try {
    1.46 +			for (int i = 0; i < početOpakování; i++) {
    1.47 +				nastav(t, NÁZEV_PROMĚNNÉ, i);
    1.48 +			}
    1.49 +		} catch (Exception e) {
    1.50 +			throw new RuntimeException("test se nezdařil", e);
    1.51 +		}
    1.52 +	}
    1.53 +
    1.54 +	private static void testReflexePřipravená(int početOpakování) {
    1.55 +		NějakáTřída t = new NějakáTřída();
    1.56 +		try {
    1.57 +			Field f = t.getClass().getDeclaredField(NÁZEV_PROMĚNNÉ);
    1.58 +			f.setAccessible(true);
    1.59 +			for (int i = 0; i < početOpakování; i++) {
    1.60 +				f.set(t, i);
    1.61 +			}
    1.62 +		} catch (Exception e) {
    1.63 +			throw new RuntimeException("test se nezdařil", e);
    1.64 +		}
    1.65 +	}
    1.66 +
    1.67 +	private static String lpad(int početZnaků, Object text) {
    1.68 +		return String.format("%1$" + početZnaků + "s", String.valueOf(text));
    1.69 +	}
    1.70 +
    1.71 +	private static BigDecimal spočítejProcenta(long hodnota, long základ) {
    1.72 +		BigDecimal h = BigDecimal.valueOf(hodnota);
    1.73 +		BigDecimal z = BigDecimal.valueOf(základ);
    1.74 +		return h.multiply(BigDecimal.valueOf(100)).divide(z, PŘESNOST_PROCENT, ZAOKROUHLOVÁNÍ);
    1.75 +	}
    1.76 +
    1.77 +	private static Long testuj(String názevTestu, int početOpakování, Long časProPorovnání, Consumer<Integer> test) {
    1.78 +		System.out.print("TEST: " + lpad(20, názevTestu) + ": ");
    1.79 +		try {
    1.80 +			long začátek = System.currentTimeMillis();
    1.81 +			test.accept(početOpakování);
    1.82 +			long konec = System.currentTimeMillis();
    1.83 +			long celkovýČas = konec - začátek;
    1.84 +			BigDecimal relativníČas = časProPorovnání == null ? BigDecimal.valueOf(100).setScale(PŘESNOST_PROCENT) : spočítejProcenta(celkovýČas, časProPorovnání);
    1.85 +			System.out.println("početOpakování = " + lpad(12, početOpakování) + " celkovýČas = " + lpad(8, celkovýČas) + " ms relativníČas = " + lpad(8, relativníČas) + " %");
    1.86 +			return celkovýČas;
    1.87 +		} catch (Exception e) {
    1.88 +			System.out.println("došlo k chybě");
    1.89 +			e.printStackTrace();
    1.90 +			return null;
    1.91 +		}
    1.92 +	}
    1.93 +
    1.94 +	public static void main(String[] args) {
    1.95 +		long základníČas = testuj("přímý přístup", POČET_OPAKOVÁNÍ, null, Reflexe::testPřímýPřístup);
    1.96 +		testuj("setter", POČET_OPAKOVÁNÍ, základníČas, Reflexe::testSetter);
    1.97 +		testuj("reflexe", POČET_OPAKOVÁNÍ, základníČas, Reflexe::testReflexe);
    1.98 +		testuj("reflexe připravená", POČET_OPAKOVÁNÍ, základníČas, Reflexe::testReflexePřipravená);
    1.99 +	}
   1.100 +
   1.101 +} 
   1.102 \ No newline at end of file