Java-ügynök a jvm szolgáltatásban

Java-ügynök a jvm szolgáltatásban

Valószínűleg sokan hallottak vagy tapasztaltak ilyen paraméter a JVM -javaagent, látja ezt a lehetőséget, akkor Jrebel Plumbr vagy lehetett kinézni JAVA_OPTS = -javaagent: [path / to /] jrebel.jar vagy úgy -javaagent: / path-to /plumbr.jar
Bár a javaagent a java 1.5 verziójában mutatták be, sok fejlesztő soha nem használta fel az ügynökök képességeit, és homályos elképzelésük van arra, hogy mi az.
Milyen ügynök ez? Miért van szüksége rá, és hogyan kell írni a sajátját?

Ahogy fentebb írom, a javaagent az egyik JVM paraméter, amely lehetővé teszi, hogy megadja az alkalmazással indított ügyintézőt, vagy inkább az alkalmazás elindítása előtt indítson el. Az ügynök maga egy különálló alkalmazás, amely hozzáférést biztosít a bájtkód-manipulációs mechanizmushoz (java.lang.instrument) a futásidőben. Ez, ha röviden. A hivatalos dokumentáció itt olvasható. de meglehetősen szűkös. Bármi sem világos? Szóval foglalkozzunk vele. A legjobb megérteni a példákat.

Írj egy elemi ügynököt

Vegye figyelembe, hogy az ügynöknek a premain metódust a következő aláírással kell végrehajtania
nyilvános statikus érvénytelen premain (String args);
vagy
nyilvános statikus érvénytelen premain (String args, Instrumentation inst);

Az ügyintéző osztályt csomagolásban kell elhelyezni, és a MANIFEST.MF-et kell tartalmaznia. kötelező attribútummal
PreMain-osztály - a premain-módszerrel jelzi az ügyintéző osztályt. Az ügynök egyéb tulajdonságai is vannak, de választhatóak és nem kell nekünk most.

Így néz ki a manifest.mf.
Ne felejtsük el, hogy a fájl végére sorszünetet adunk

Most csomagolja be a tégelybe

És végül egy osztálytesztelő

Futtassa az AgentTester parancsot a parancssorból

Ebből a példából látjuk, hogy:

  • a premain módszer végrehajtása előtt a fő módszer fő módszerét hívják.
  • az ügynök a -javaagent paraméterrel van megadva: jarpath [= opciók]

Próbáljuk kivonni az ügynököt valamilyen haszonból


Általánosságban elmondható, hogy az ügynökök mechanizmusa a byte-kód kezelésére szolgál. de én azonnal módosítom a bytecode-ot ebben a cikkben, de egyébként nem fogunk túl messzire menni. Kinek érdekes lehet a javassist nézni, hiszen a bájtkóddal való munka nem a legfontosabb eszköz.

Írjuk le az AgentCounter-et, amely kinyomtatja a betöltött osztály nevét és számolja meg a betöltött osztályok számát. Tehát megfigyelhetjük a 96-os osztályterelő munkáját: a.


Ne feledje, most már egy másik aláírást használok a premain módszerről. A műszeres objektumban átadom a ClassTransformer-t, amely elvégzi az összes munkát. A ClassTransformer minden alkalommal meghajtja az osztály betöltését. Ha használni szeretné a ClassTransformer-t, akkor be kell vezetnie a java.lang.instrument.ClassFileTransformer felületet, és hozzá kell adnia az objektumot a Instrumentation.addTransformer


classfileBuffer - ez a byte-kódot a jelenlegi osztály képviselteti magát egy byte tömböt, az ő újradefiniálása transzformátor vissza kell egy új tömböt bájtok, ebben a példában nem változtatunk a tartalmát az osztály, így csak vissza ugyanazon tömb.

Csomagolj egy ügynököt és transzformátort egy új edénybe

Módosítson egy kis osztálytesztelőt

Indítsa el az AgentTestert egy új ügynöknél
a java különböző verziói esetében az eredmények eltérhetnek

Ha olyan vállalati alkalmazást futtat egy ilyen ügynöknél, akkor nagyon érdekes eredményeket kaphat, például az egyik projekt a kezdet után megadta a következőket:

A java objektumok méretét mérjük


Tekintsünk még egy példát az ügynökök használatára. Írjunk egy osztályt, amely visszaadja a java objektumok méretét, és a javaagent kulcsszerepet fog játszani. Bárki, aki JVM-nek tudja tudni a létrehozott objektum valós méretét. a Instrumentation felületen egy csodálatos hosszú getObjectSize (Object objectToSize) módszer, amely visszaadja az objektum méretét. De hogyan lehet hozzáférni az ügynökhez alkalmazásunkból? Semmi különöset nem kell tennünk, automatikusan hozzáadjuk a javaagent az osztálypályához, és ehhez csak egy műszeres műszeres mezőt kell hozzáadnunk az ügynökhez, és inicializálni kell a premain módszerrel.


Az AgentMemoryCounter.getSize (obj) metódust az alkalmazásosztályból érjük el.

Az alkalmazás eredményei így nézhetnek ki

Ne feledje, hogy a getObjectSize () metódus nem veszi figyelembe a beágyazott objektumok méretét, azaz csak az objektum referenciára fordított memóriát veszi figyelembe.

következtetés

Két egyszerű példa egy fájlmenü létrehozására egy DBMS-ben
Szinte minden webes projekthez saját fájl tárolására van szükség. Számos feladata van. Ma nézzük két egyszerű változatai létrehozása: az első - és a Java blob adattípus segítségével, Spring MVC, Hibernate, MySQL, és a második - a csoportosítás (felosztja a fájlt darabokra) eszközök rutinos, grails, hibernált

Java-ügynök a jvm szolgáltatásban

Java-ügynök a jvm szolgáltatásban

Bemutatjuk Kotlin-ot, és összeszereljük az edényt
Ez a bejegyzés egy feljegyzés arról, hogyan ismerkedtem meg a Kotlin nyelvével, milyen erőforrásokat és eszközöket, és ehhez gyűjtöttem jarba, és futtattam a konzolt. Általában PHP programozó vagyok, egy kicsit zak a Java-val. A másnap úgy döntöttem, hogy látom Kotlint. Ez egy kevésbé szigorúan beírt nyelv a JetBrains-ről arra a pontra, hogy valójában statikusan van beírva. A

Java-ügynök a jvm szolgáltatásban

Betűtípusok csatlakoztatása a projekthez
Helló, mindenki! Mindenki, aki legalább egy Android-alkalmazást fejlesztett ki, arra gondolt, hogyan csatlakozhat a projekt egyedi betűtípusához. Ezért feltettem magam ezt a kérdést. Számos módszer létezik. A víz egyikük: String custom_font = "fonts / custom_font.ttf"; Típusa CF = Typeface.createFromAsset (getAssets (), custom_font);

Java-ügynök a jvm szolgáltatásban

Határozza meg az alkalmazás által Java-ban használt összes osztályt
Kétségtelen, hogy mindenki, aki az önéletrajzában rámutat a Java-fejlesztés tapasztalataira, legalább egyszer életében írta a vonalakat nyilvánosan statikus érvényű fő # 40; String # 91; # 93; args # 41; összeállította őket, és végrehajtotta őket egy olyan parancsra, mint a java HelloWorld. De hányan tudják, mi történik a JVM-en belül attól a pillanattól kezdve, hogy ezt a parancsot végrehajtották a kontroll előtt