--
Wiadomość z grupy Warszawa Java User Group (Warszawa JUG).
Więcej informacji na stronie http://groups.google.com/group/warszawa-jug?hl=pl
Zachęcamy do odwiedzenia naszej strony domowej http://warszawa.jug.pl
Oferty pracy dozwolone zgodnie z zasadami na http://sites.google.com/site/warszawajug/oferty-pracy-na-grupie
Często na zupełnie prościutkich rzeczach manipulowanie bytecodem wymięka.
Np. nie możesz dodać metody w uruchomionej JVM, kto choć raz debugował
wie że przy dodaniu nowej metody trzeba restartować cały program (albo
zapewne wykosztować się na JRebela).
Nie możesz wcale zmodyfikować klas z rt.jar w uruchomionej JVM. Można
to zrobić przed uruchomieniem JVM i ustawić bootclasspath, ale to
wymaga trochę zachodu i powoduje problemy licencyjne.
To czy chcesz modyfikować w czasie pracy JVM musisz ustalić na samym
początku (opcją -javaagent albo pisząc własnego classloadera). Gdy nie
masz uprawnień do zmiany opcji JVM a potrzebujesz zmodyfikować
naprawdę drobiazg, to jest problem.
W Javie nie można dodawać nowych konstrukcji do języka (np. w Scali
można dzięki pluginom a w Clojure podobno dzięki makrom).
Za pomocą bytecodu nie można dodawać nowych metod i klas w jeszcze
nieskompilowanym kodzie ...
Jest to zaprogramowane fatalnie, ale pod względem technicznym (jak to
w ogóle zrobić) chyba nie da się zrobić tego o wiele lepiej.
On 04.01.2013 16:47, Irek M wrote:W Javie masz Groovy, i możesz metaprogramować bez bólu :)
A w takim JavaScripcie masz po prostu obiekt.metoda = cośtam,
obiekt.metoda.toString() i eval("kod") i możesz metaprogramować do
bólu. W Javie ktoś nie pomyślał i przekombinował.
A gdzie się przeniosłeś?
>Nie pozostaje mi nic innego zatem, jak zaprosić Cię tym bardziej na wykładNie da rady. Już nie mieszkam w Warszawie ;-(
>;-)
--
Jakub Nabrdalik
blog.solidcraft.eu
Np. nie możesz dodać metody w uruchomionej JVM, kto choć raz debugował
wie że przy dodaniu nowej metody trzeba restartować cały program (albo
zapewne wykosztować się na JRebela).
Groovy podobnie jak Ruby dobrze radzi sobie z metaprogramowaniem a ze dziala na JVM jest bliski Javie, co wiecej mozna nawet pisac kod Javy i integrowac z juz istniejacymi klasami. Wsparcie narzedzi pozostaje takie samo jak dla Javy.
Java też była przewidziana do metaprogramowania - wraz z JVM i JDK
jest dostarczana refleksja, bajtkod, classloadery, javaagent, JDWP,
annotation processing tool. Kupa rozwiązań, a żadne z nich nie jest
kompletne, nawet wszystkie razem nie są kompletne. No i mało kto te
wszystkie mechanizmy dobrze zna.
A tak naprawdę wystarczyłoby by obiekt Klasa.class był edytowalny (tak
jak w JS można edytować Klasa.prototype). Przekombinowali i tyle. A
może przekombinowali by mieli o czym pisać w swoich książkach? :-)
Dopiero co była o tym mowa: Groovy nie zmieni kodu napisanego w Javie
bo JVM na to nie pozwala.
No i mało kto używa Grooviego - w Tiobe index jest dopiero w drugiej
pięćdziesiątce.
Nie możesz wcale zmodyfikować klas z rt.jar w uruchomionej JVM. Można
to zrobić przed uruchomieniem JVM i ustawić bootclasspath, ale to
wymaga trochę zachodu i powoduje problemy licencyjne.
--
should not be deployed
Hmmm, nie znalazłem wzmianki o tym, że nie da się shadowować klas z rt,
a Javie (Groovym dokladniej, ale co tam)
this.defineClass(null, bytes, 0, bytes.length)} // inside ClassLoader, bytes is Date.class contentrzuca przemiłymERROR java.lang.SecurityException:Prohibited package name: java.utilat groovysh_evaluate$1.x (groovysh_evaluate:2)at groovysh_evaluate$1$x.call (Unknown Source)at groovysh_evaluate.run (groovysh_evaluate:2)...
podobnie dla java.lang :-(
W dniu 6 stycznia 2013 11:57 użytkownik Wojciech Erbetowski
> Rozumiem, że chodziło o modyfikacje źródeł czy też bytecodu z rt.jar Irkowi,
> ale mi chodzi bardziej o podmianę classloaderem klasy z rt.jar (np j.u.Date)
> na naszą implementację,
> co według mojej wiedzy (a nie mam zielonego pojęcia o prawie :-)) z niczym
> nie koliduje.
>
Z niczym nie koliduje bo tak się nie da. :-)
>
>>
>> W Javie nie można dodawać nowych konstrukcji do języka (np. w Scali
>> można dzięki pluginom a w Clojure podobno dzięki makrom).
>
> Zgadzam się, nie ma makr w Javie (i bardzo dobrze), to może urągać
> metaprogramowaniu w Javie.
Nie chodzi mi o makra, bo np. makra w C++ przynoszą więcej złego niż
dobrego, ale ogólnie: za bardzo nie da się rozszerzyć składni Javy bez
przepisywania kompilatora i wszystkich narzędzi
Często na zupełnie prościutkich rzeczach manipulowanie bytecodem wymięka.
Java też była przewidziana do metaprogramowania - wraz z JVM i JDK
jest dostarczana refleksja, bajtkod, classloadery, javaagent, JDWP,
annotation processing tool.
--
- Speaking to the news agency, chief security officer of business security company Rapid7 HD Moore estimated that it could take up to two years for Oracle to fix the flaws found in the version of Java used to browse the Internet -- not taking into consideration any further exploits that are developed within this timeframe.
2 lata dla dużej firmy IT - jakie oni muszą mieć bagno w kodzie? A najgorsze jest to, że ta dziura dotyczy rzeczy których mało kto używa (java.lang.invoke i MBeany - http://www.kb.cert.org/vuls/id/625617 ), wystarczyłoby nie dołączać ich do Javy, ale pewnie są tam takie cykliczne zależności, że tak się nie da.
Chyba zacznę się przekwalifikowywać na programistę JavaScript albo C#, bo Java zaczyna mi za mocno śmierdzieć. :-(
Chyba wszyscy będziemy wtedy szczęśliwi ;-)
Nie interesuję się bezpieczeństwem, ale dziś natrafiłem na coś takiego na temat Javy 7u11:- Speaking to the news agency, chief security officer of business security company Rapid7 HD Moore estimated that it could take up to two years for Oracle to fix the flaws found in the version of Java used to browse the Internet -- not taking into consideration any further exploits that are developed within this timeframe.
2 lata dla dużej firmy IT - jakie oni muszą mieć bagno w kodzie? A najgorsze jest to, że ta dziura dotyczy rzeczy których mało kto używa (java.lang.invoke i MBeany - http://www.kb.cert.org/vuls/id/625617 ), wystarczyłoby nie dołączać ich do Javy, ale pewnie są tam takie cykliczne zależności, że tak się nie da.
Cześć!
Zapraszamy gorąco w najbliższy wtorek, 8 stycznia o godzinie 18:00,
na Wydziale Matematyki Informatyki i Mechaniki UW (Banacha 2), w sali 3180 (II piętro).
Temat: Metaprogramowanie w JaviePrelegentami będą Maciej Jankowski i Wojtek Erbetowski
O wykładzieTen wykład to absolutny "must" dla wszystkich developerów związanych z Javą (i w ogóle JVM). Początkujący w temacie dowiedzą się podstaw działania większości Javowych frameworków, czyli o manipulacjach na bytecode. Dowiecie się jak narzędzia są w stanie m. in. utworzyć mocki nagrywające wywołania w testach, czy założyć transakcje na naszą logikę biznesową. Mimo, że zaczniemy od podstaw w prezentacji będzie też kilka ciekawostek i uzupełnień wiedzy dla wytrawnych programistów.Zaczniemy od wprowadzenia do generowania bytecodu, łącznie z pokazaniem, jak zrobić prostą klasę z niczego w czasie działania aplikacji. Następnie zobaczycie jak opakowują to najpopularniejsze biblioteki w używalny kod, oraz kto (jakie popularne frameworki) z tych narzędzi korzysta. Później już bardzo konkretnie opowiemy o CGLib, który w tej dziedzinie jest de facto standardem, a na sam koniec narzędzie, które powstało stosunkowo niedawno, czyli Plastic.O prelegentachMaciej od ośmiu lat programuje w Javie. Od pięciu lat komercyjnie. Nie lubi przetartych szlaków. Pasjonat nietypowych rozwiązań. Obecnie pracuje jako programista Java.
Wojtek jest Wam znany jako jeden z organizatorów warszawskiego JUG. W pracy programuje w Groovym, Scali i Javie, a także w Pythonie. Ostatnio stworzył bibliotekę RoboSpock, przy okazji której podszkolił się z tematu ładowania klas w Javie. Po godzinach już rozgląda się za nowym językiem/technologią.SponsorNasze spotkanie wspiera firma Polidea, dzięki której będziemy mogli się posilić i posłuchać, czym skuszą nas jako programistów, aby pracować z nimi.A po spotkaniuPlanowany czas prezentacji wraz z dyskusją to 120 min. Następnie wybieramy się do pobliskiego baru, gdzie będzie możliwość kontynuacji tematu z prelegentami o temacie, lub też poznania innych zapaleńców technologii.Potwierdź obecnośćAbyśmy mogli sprawniej przygotować się do spotkania prosimy jedynie o kliknięcieczy zamierzasz być na spotkaniu czy też nie (zliczamy kliknięcia). Dzięki!
--
Wiadomość z grupy Warszawa Java User Group (Warszawa JUG).
Więcej informacji na stronie http://groups.google.com/group/warszawa-jug?hl=pl
Zachęcamy do odwiedzenia naszej strony domowej http://warszawa.jug.pl
Oferty pracy dozwolone zgodnie z zasadami na http://sites.google.com/site/warszawajug/oferty-pracy-na-grupie
Po tym jak Ciebie Jacek trochę zjechał na blogu za tą prezentację,odechciało mi się oglądać. Wolę zapytać. :-)
Czy invokedynamic to jakaś innowacja?
To tylko metoda optymalizacji dla języków dynamicznych.
Przed Javą 7 mogłeś zamiast instrukcji
invokedynamic dać kod: mójInvokedynamic(obiekt, "nazwaMetody",
parametr1, ..., parametrN), a mójInvokedynamic by znalazł i wywołał
odpowiednią metodę za pomocą refleksji - efekt podobny (tylko dużo
wolniej).
Jeszcze wrócę na chwilę do tematu metaprogramowania: czy ktoś z Was używał JBoss AOP?No bo java.lang.reflect.Proxy czy Spring AOP mało potrafią, od AspectJ czasem zawału można dostać, a Byteman jest nastawiony raczej na testowanie a nie na zwykły kod. Po przejrzeniu dokumentacji JBoss AOP wygląda nieźle, czy może tylko mi się tak wydaje?
--
--
Wiadomość z grupy Warszawa Java User Group (Warszawa JUG).
Więcej informacji na stronie http://groups.google.com/group/warszawa-jug?hl=pl
Zachęcamy do odwiedzenia naszej strony domowej http://warszawa.jug.pl
Oferty pracy dozwolone zgodnie z zasadami na http://sites.google.com/site/warszawajug/oferty-pracy-na-grupie
---
Otrzymujesz tę wiadomość, ponieważ subskrybujesz grupę dyskusyjną Google o nazwie „Warszawa Java User Group (Warszawa JUG)”.
Aby anulować subskrypcję tej grupy i przestać otrzymywać z niej wiadomości, wyślij e-maila do warszawa-jug...@googlegroups.com.
Więcej opcji znajdziesz na https://groups.google.com/groups/opt_out