이미 패키징된 jar 안의 클래스에 함수를 추가하는 방법?

purespace의 이미지

이미 jar는 배포되어 있는 상태인데, 이 패키지 안에 있는 클래스 사용자가 함수를 추가하고 싶다면 어떻게 하는게 바람직할지, 조언을 듣고 싶습니다.

물론, 클래스를 수정해서 jar로 다시 묶는 방법은 안되구요. jar를 건드리지말고 동적으로 가능해야 하고, 작성한 함수는 사용자가 등록해두면 계속 재사용이 가능해야 합니다.

혼자 궁리해도, 아는게 부족해서 어째야 하는건지 난감하네요. :oops:

이런 저런 방식이라든가..혹은 이런 경우에 참고가 될만한 자료만이라도 알려주시면 감사하겠습니다..

iolo의 이미지

그냥 상속받고 메소드 하나 추가하면 되지 않나요?

그런데 원하시는게 이미 컴파일된 클래스에 메소드를 하나 추가하는 거라면
그런건 없습니다. jar에 안묶여있어도 마찬가지입니다.

뭐 또 메모리에 바이트어레이로 읽어서 바이트코드 레벨에서 조작한 다음, 수동으로 로딩하는 이상야릇한 방법이 있을지도 모르죠... 말은 쉽지만 실제로는 불가능할거 같네요...

----
the smile has left your eyes...

sjpark의 이미지

자바는 많이 해보질 않아 잘 모르지만, 문득 떠오른게 있어서요,

jar파일이라면 사용할때 import시키고 사용할 텐데(맞죠?)

jar파일안에 패키징된 클래스를 상속받아 새로운 클래스를 만드는건 어떤가요?

물론, 상속받을 클래스가 상속 가능하다면 말이죠.

가능하다면, jar파일의 변경없이 새로운 jar파일을 만들어 내는 것으로 가능할 것 같은데요.

purespace의 이미지

아 중요한 걸 빼먹었네요.

이 함수가 추가되어야 하는 시점이, 이미 라이브러리의 클래스를 사용하는(혹은 사용할 ; 함수가 추가될 클래스들은 입출력을 나타내는 개체입니다) 프로그램이 실행되고 있는 상태입니다. 프로그램이 이 클래스들을 사용할 때마다 추가된 함수들을 읽어낼 수 있어야 하거든요.

남을 의식하지 않고 언제나 한결같은 모습으로 살고싶다...

sjpark의 이미지

purespace wrote:
아 중요한 걸 빼먹었네요.

이 함수가 추가되어야 하는 시점이, 이미 라이브러리의 클래스를 사용하는(혹은 사용할 ; 함수가 추가될 클래스들은 입출력을 나타내는 개체입니다) 프로그램이 실행되고 있는 상태입니다. 프로그램이 이 클래스들을 사용할 때마다 추가된 함수들을 읽어낼 수 있어야 하거든요.

이렇게 하면 되겠군요.

해당 jar파일에 있는 클래스들의 모양을 그대로 만들어 내고 그 내용을

님이 만드신 코드로 대채합니다. 그리고 해당 메소드에 맞는 원래의 jar파일에 있는 것을 호출하게 하는 것이지요.

중간에서 가로채는 것입니다.

물론, 프로그램이 실행되기 전에, 임의의 라이브러리를 만들어 두어야...

만약 이미 실행되고 있는 상태에서 즉 프로그램의 종료나 중단없이

반드시 실행 중인 상태에서 하기 위해서라면. 전 give up합니다. =0=

gl.

fender의 이미지

정확한 requirement가 없어서 모르겠지만 제가 볼 때는 무언가 디자인상의 문제인 것 같습니다. 99%의 경우 사용하지 않는 비정상적 구현을 요구하는 경우의 99%는 디자인 오류고 나머지 1%는 진짜 requirement가 특이한 경우 더군요.

----------------------------
[서명] 그놈 한국 사용자 모임 - 그놈에 대한 모든 것! - 게시판, IRC, 위키, 갤러리 등등...

purespace의 이미지

역시..이상하긴 하죠.. :( 제생각에도..좀 이상하다고 생각하긴 했습니다만..

제가 지금 하는 프로그램은 이용해서 클래스이름과 함수이름을 주면 그 함수를 실행시키는 일을 합니다. 물론...실행이 가능한 클래스 이름과 함수이름에 대한 목록을 따로 가지고 있습니다.

이미 있는 클래스와 함수야, 리플렉션을 이용해서 호출하면 되니까 어려운 일이 아닌데..프로그램 사용자가 함수를 추가할 수 있게 하라는 군요. 처음엔 일종의 스크립트나 템플릿같은 걸 이용해서 사용자가 작성하면, 그걸 돌리는 방법을 생각해봤었는데요. 이미 프로그램 자체가 함수를 호출하는 룰을 돌리는 엔진이기 때문에 여기에 새로운 언어(?템플릿?)을 해석하는 엔진을 붙이는 것도 좀 이상하다고 생각되더군요. 더 무거워지기도 할테고..

그래서 생각한게 자바코드를 던져주면 자바코드를 실행할 수 있게 해주자는 거였는데, 이것도..이상한건지.. :oops: ...

남을 의식하지 않고 언제나 한결같은 모습으로 살고싶다...

atie의 이미지

실행시에 로드된 클래스를 hook해서 vm상의 bytecode를 hotswapping 하고자 하는거라면 aspectwerkz를 참조해 보세요. 저도 읽어 보기만 했는데... 원하시는 것과 얼추 비슷한듯 하네요. eclipse.org의 aspectj 프로젝트도 한번 보시고요.

----
I paint objects as I think them, not as I see them.
atie's minipage

purespace의 이미지

자바 라이브러리 중에 tool.jar에 자바소스를 돌리는게 있다는 걸 들었습니다.
jsp를 실제로 돌릴 때도 그녀석을 쓴다는 데 찾아봐야 겠습니다.
aspectwerkz에 대한 정보도 고맙습니다.

답변해주신분들 모두 감사합니다.. :D

남을 의식하지 않고 언제나 한결같은 모습으로 살고싶다...

fender의 이미지

purespace wrote:
역시..이상하긴 하죠.. :( 제생각에도..좀 이상하다고 생각하긴 했습니다만..

제가 지금 하는 프로그램은 이용해서 클래스이름과 함수이름을 주면 그 함수를 실행시키는 일을 합니다. 물론...실행이 가능한 클래스 이름과 함수이름에 대한 목록을 따로 가지고 있습니다.

이미 있는 클래스와 함수야, 리플렉션을 이용해서 호출하면 되니까 어려운 일이 아닌데..프로그램 사용자가 함수를 추가할 수 있게 하라는 군요. 처음엔 일종의 스크립트나 템플릿같은 걸 이용해서 사용자가 작성하면, 그걸 돌리는 방법을 생각해봤었는데요. 이미 프로그램 자체가 함수를 호출하는 룰을 돌리는 엔진이기 때문에 여기에 새로운 언어(?템플릿?)을 해석하는 엔진을 붙이는 것도 좀 이상하다고 생각되더군요. 더 무거워지기도 할테고..

그래서 생각한게 자바코드를 던져주면 자바코드를 실행할 수 있게 해주자는 거였는데, 이것도..이상한건지.. :oops: ...


거의 자바 IDE와 비슷한 requirement네요 :) 그런 경우라면 일단 자바에서 소스코드를 컴파일해서 바이트 코드를 생성하고 이를 로딩할 수 있는 커스텀 ClassLoader를 만들어 사용하시면 크게 어렵지 않게 구현 가능할 것 같습니다.

----------------------------
[서명] 그놈 한국 사용자 모임 - 그놈에 대한 모든 것! - 게시판, IRC, 위키, 갤러리 등등...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.