1. 메인의 SchoolMember.name을 바꾸기

/**
 * Hello world!
 *
 */
public class App {
    public static void main( String[] args ){
        System.out.println("SchoolMember().MebmberName() = > " + new SchoolMember().MebmberName());
    }
}
public class SchoolMember {

    public String MebmberName() {
        return "abc";
    }
}

- 결과화면

2. 새로운 프로젝에 net.bytebuddy를 불러오기

# https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy

    - 런타임시 java Class들을 동적으로 만들어낼 수 있는 라이브러리

 

Maven Repository: net.bytebuddy » byte-buddy

Byte Buddy is a Java library for creating Java classes at run time. This artifact is a build of Byte Buddy with all ASM dependencies repackaged into its own name space. VersionRepositoryUsagesDate1.10.x1.10.8Central385Feb, 20201.10.7Central25Jan, 20201.10.

mvnrepository.com


2. pom.xml 의존성 추가 (Junit은 필요없습니다.)

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy -->
    <dependency>
      <groupId>net.bytebuddy</groupId>
      <artifactId>byte-buddy</artifactId>
      <version>1.10.8</version>
    </dependency>
  </dependencies>

3.  변경할 함수와 이름 만들어 주기

public class SchoolNameChange {
    // premain
    public static void premain(String agentArgs, Instrumentation inst) {

        new AgentBuilder.Default()
                .type(ElementMatchers.any())
                .transform(new AgentBuilder.Transformer() {
                    @Override
                    public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule module) {
                        return builder.method(named("memberName")).intercept(FixedValue.value("Test"));
                    }
                }).installOn(inst);
    }
}

4. pom.xml 의 빌드에 Maven jar 생성 부분 추가

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <index>true</index>
                        <manifest>
                            <addClasspath>true</addClasspath>
                        </manifest>
                        <manifestEntries>
                            <mode>development</mode>
                            <url>${project.url}</url>
                            <key>value</key>
                           <!-- Manifest attribute -->
                          <!-- 애플리케이션 시작시 옵션으로 주기, Package 넣어주기-->
                          <Premain-Class>org.example.SchoolNameChange</Premain-Class>
                          <!-- 클래스 변경 허용 부분 -->
                          <Can-Redefine-Classes>true</Can-Redefine-Classes>
                          <Can-Retransform-Classes>true</Can-Retransform-Classes>
                          <!-- 클래스 변경 허용 부분 -->
                          <!-- Manifest attribute -->
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

5. mvn clean package , jar 파일 생성

 - tistory... .jar 파일 생성

6. 기존의 프로젝트에 VM options에 jar 파일 추가

 [-javaagent:C:\Users\.....\target\tistoryBytebuddyJavaagent-1.0-SNAPSHOT.jar]

 

7. 실행

블로그 이미지

미나미나미

,