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