
49,500원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
-
더 자바, 코드를 조작하는 다양한 방법
소스컴파일시점에 MagicMojaProcessor가 사용되면 안되는이유
소스를 컴파일하는 시점에 저 annotation이 사용되면안되는데 사용되려해서 에러가 난다는데 왜 컴파일하는 시점에 저 annotation이 사용된다는건가요? 헷갈리네요ㅠㅠ프로세서를 등록하는 과정에서 어노테이션이 사용이 되는데 어노테이션의 생명주기를 source레벨로 해놔서그런건가요?그런데 CLASS레벨로 해놔도 똑같이 안되네요.. 이유를 잘 이해하지 못하겠어요 왜 저 에노테이션이 사용되면 안되는지 궁금합니다소스 컴파일하는 과정에서 MagicMojaProcessor가 동작하려고하는데 그 시점에서는 MagicMojaProcessor가 없어요. 왜 없는거죠?원래는 다음과 같이 동작을해야해요MagicMojaProcessor 컴파일컴파일된 파일을 가지고 META-INF에서 사용근데 2->1 로 과정이 일어나기때문에 오류가 발생한다는얘기인가요?
-
더 자바, 코드를 조작하는 다양한 방법
다이나믹 프록시에서 리플렉션이 어떻게 사용되는거죠?
ParentInterface parentInterface = (ParentInterface)Proxy.newProxyInstance(HelloApplication.class.getClassLoader(), new Class[]{ParentInterface.class}, (proxy, method, args) -> {System.out.println("메소드 수행전에 할일");Object methodResult = method.invoke(new ChildClass(), args);//child라는 class에 args를 모두 넘긴다if(method.getName() == "sayHello"){//메서드 이름에 따라.. 처리를 분류할 수 있으니 다 정의하지 않아도됨 모든 메서드에 대해 기본적으로 정의되는거니까 중복도 피할 수 있음System.out.println("sayHello!");return methodResult;}System.out.println("sayOne!");return methodResult;});parentInterface.sayHello();//클라이언트는 인터페이스타입에 대해 그 메서드를 호출한다 이 인터페이스에 대한 메서드를 호출하면 위에서 정의한대로 프록스 객체를 런타임에 하나 만들어줘서//위에서 정의한 대로의 로직을 타고 클라이언트에게 결과를 전송해준다parentInterface.sayOne(); 지금 인터페이스에 대한 .class정보를 넘겨주고 있어요그리고 Proxy.newProxyInstance메서드로 들어가보면 넘겨준 class정보를 가지고 생성자를 만든다거나 하는것같거든요그런거 자체가 리플렉션을 활용하는 행위인가요?(class이름).class <- 이표현자체는 리플렉션을 활용하는 문장인가요?cglib, 바이트 버디는 리플렉션을 사용하지 않나요?
-
더 자바, 코드를 조작하는 다양한 방법
다이나믹 프록시의 단점
세번째 인자로 넘기는 new InvocationHandler가 너무 커지게 되면 부담스럽다 라고 하셨는데따로 클래스를 작성해서 넘겨주면 저 코드도 간결해지는것 아닌가요?
-
더 자바, 코드를 조작하는 다양한 방법
new 와 constructor.newInstance();의 차이
Class<?> bookClass = Class.forName("thejava.reflection.MyBook");Constructor<?> constructor = bookClass.getConstructor(null);//인자 없는 생성자를 넘겨받아서MyBook book = (MyBook) constructor.newInstance();이렇게 인스턴스를 생성하는것과new MyBook()이랑은 무슨차이죠?둘다 출력해보면thejava.reflection.MyBook@~ 로 나오는데.. 같은건가요?
-
더 자바, 코드를 조작하는 다양한 방법
두번 실행해야하는 이유
1. 바이트 코드 조작2. 조작된 코드를 메모리에 올려야함이래야하는데 코드는 바이트코드조작 -> 클래스사용 순이지만조작되기전 클래스가 메모리에 로드됨 -> 바이트 코드 조작됨 -> 메모리에 로드됐던 클래스를 사용하여 메서드 호출이런 순서이기 때문에 바이트코드를 조작하는 코드와 클래스를 사용하는 코드를 동시에 실행하는것만으로는 조작된 코드를 사용할 수 없어요제가 설명한게 맞나요?
-
더 자바, 코드를 조작하는 다양한 방법
제가 설명한게 맞는지 봐주실 수 있나요?(jvm설명)
jvm은 자바파일을 실행하기 위한 가상의 컴퓨터다자바파일만으로는 cpu가 인식하지 못하므로 기계어로 컴파일하는 과정을 거쳐야 실행할수있다그 일을 해주는것이 jvm이다 jvm은 java파일을 기계어로 바로 변환하진 않는다왜냐하면 바로 기계어로 변환하려면 os에 종속적이될수밖에 없기때문이다.os마다 기계어의 문법(?)이 다르기 때문에 같은 기계어여도 다르게 해석된다.os에 종속적이지 않기 위해 jvm은 jvm이 인식할 수 있는 자바 바이트코드(.class파일)로 변환한다그리고 os에게 해석을 해준다. 그러면 os에 종속적이지 않게된다.
-
더 자바, 코드를 조작하는 다양한 방법
JIT 컴파일러와 인터프리터
안녕하세요, 백기선님.기존에 저는 JVM 내에서 JIT이 컴파일러와 인터프리터의 역할을 동시에 수행한다고 이해하고 있었는데요.자료(p.4)에서는 [실행엔진 : 인터프리터, JIT Compiler, GC ] 로 구성되어 있어서 질문드립니다.인터프리터와 JIT 컴파일러는 서로 분리되어 역할을 수행하는 것이 맞고,바이트 코드를 실행할 때, JIT 컴파일러가 전체를 싹 훑고, 반복되는 코드에 대해 메모리에 캐싱을 진행한 후, 인터프리터가 처음부터 순차적으로 읽어 나가다가, 반복되는 해당 지점에서 JIT Compiler가 다시 개입하여 캐싱된 코드를 꺼내오는 형태일까요? 이 부분이 조금 헷갈리기도 하고, 궁금하기도 합니다.혹은 어떤 문서를 보면 공부해볼 수 있을까요?(한국어 블로그에는 대부분 인터프리터와 JIT이 같다고 적어둔 경향이 많은 것 같고, 기선님께서 참고에 올려주신 글이나 해외 블로그에서는 둘을 분리해서 말하는 경향이 있는 것 같아서 더 헷갈리는 것 같습니다.)감사합니다!* 아래 질문과 비슷한 내용이지만, 답변 달아주신 링크에 접속이 안되서 부득이하게 다시 질문 드립니다ㅠhttps://www.inflearn.com/questions/99765
-
더 자바, 코드를 조작하는 다양한 방법
Method.invoke()
Object 타입인 인스턴스를 invoke()의 매개변수로 넘겨도 실행 되는 이유는 실제 인스턴스가 Book 타입의 인스턴스이기에 상관 없는걸까요?
-
더 자바, 코드를 조작하는 다양한 방법
site 폴더내에 jacoco 폴더가 생기지 않습니다.
clean varify를 실행하면 [INFO] --- jacoco-maven-plugin:0.8.4:report (report) @ THe_JAVA --- [INFO] Skipping JaCoCo execution due to missing execution data file. 위와 같은 메시지가 나오고 유사한 질문이 있어 그에 맞춰 mvn site를 실행해 봤습니다. 아래는 porm.xml 코드입니다. <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>JacocoTest</artifactId> <version>1.0-SNAPSHOT</version> <name>JacocoTest</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.4</version> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>report</id> <phase>prepare-package</phase> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin> </plugins> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle --> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-jar-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle --> <plugin> <artifactId>maven-site-plugin</artifactId> <version>3.7.1</version> </plugin> <plugin> <artifactId>maven-project-info-reports-plugin</artifactId> <version>3.0.0</version> </plugin> </plugins> </pluginManagement> </build></project> 실행을 하면 site 디렉터리는 생기지만 하위 디렉터리에 jacoo 디렉터리가 생기지 않습니다.
-
더 자바, 코드를 조작하는 다양한 방법
메모리 영역의 구조 질문
메모리 영역은 스택, PC, 네이티브 메소드 스택, 힙, 메소드영역으로 나뉜다고 말씀주셨는데요, static 변수나 메소드의 경우 메소드영역에 저장되는것으로 이해하였는데 다른 블로그에 기술되어 있는 명칭은 static 메모리에 저장된다고 기술되어 있더라구요. static 메모리 와 메소드 영역 같은 것인건가요? https://gocoder.tistory.com/1847
-
더 자바, 코드를 조작하는 다양한 방법
GC 설명부분 질문드립니다.
GC 는 크게 쓰로우 풋 위주의 GC 와 stop the world 를 줄이는 GC 두가지가 있다 말씀주셨는데요 여기서 쓰로우 풋 위주의 GC 는 어떤 키워드로 검색을 해봐야 조금 더 자세히 공부를 해볼 수 있을까요?
-
더 자바, 코드를 조작하는 다양한 방법
jit 와 인터프리터 질문
jvm 이 자바 바이트 코드를 os 에 특화된 코드로 변환시켜서 실행해준다 라고 하셨는데요, 이때 인터프리터와 JIT 컴파일러의 역할은 정확히 어떤것인가요??
-
더 자바, 코드를 조작하는 다양한 방법
JVM 메모리 구조에 대해 공부하다가 질문 드립니다.
안녕하세요! JVM의 메모리 영역 중 메소드 영역에 관해 질문 드립니다. .class 파일들이 JVM으로 로드 되면 메소드 영역에 Class에 대한 정보들을 담는 Class type객체나 static 변수들이 그 쪽에 할당된다고 하셨는데, 이게 어플리케이션이 컨테이너에서 구동될 때 이루어지는 작업이니까 혹시 그러면 어플리케이션이 완전이 시작한 이후에 application scope 내장 객체에서 getAttribute를 통해서도 접근이 가능 할까요..?? 또한 다른 변수들은 아닌 static 변수들만 method 영역에 생성되는 건지도 궁금합니다... static 변수, static 메소드, static 클래스 등등 static과 관련된 모든 object들이 저 영역에 생성이 되는 것인가요..? 강의를 통해 궁금한 점이 생겨 질문 드립니다! 감사합니다!
-
더 자바, 코드를 조작하는 다양한 방법
안녕하세요.
제가 블로그에다가 수업 내용을 좀 정리하고 싶은데 출처를 이 강의로 명시한 상태에서 블로그를 작성해도 될까요?
-
더 자바, 코드를 조작하는 다양한 방법
NPE 에 대해서 질문합니다.
안녕하세요 기선님 강의를 들으며 추가적으로 java 에 있어서 궁금한점 질문 남깁니다. java applicaiton 을 개발할 때 NullPointerException 발생에 있어서 다른 Exception들보다 개발자들이 예민하고 신중한 이유가 마땅히 나와 있지 않아 질문 올립니다. 개발자가 작성한 로직의 어느 시점이 의도치 않게 null을 참조함에 있어서..null에 참조, 접근한다고 NPE 을 발생시키는건 당연하고 그게 NPE 예외의 존재 이유가 아닌가 싶습니다. 비즈니스적으로 어떤 심각한 영향 때문에 NPE 발생에 예민한건지 궁금합니다.아직 학생이라 NPE 발생이 야기하는 심각성에 대해 체감을 잘 못하겠습니다.. 감사합니다.
-
더 자바, 코드를 조작하는 다양한 방법
강의 순서 문의
안녕하세요 jAVA 기본 문법 정도 알고 있는 초보입니다 더 나은 자바 개발자를 위한 로드맵이 좋아 보여서 전체 구매했는데요 1. 혹시 이 로드맵을 보기 전에 스프링에 대한 이해가 필요한가요? 스프링에 대해 전혀 모르면 이거 보기 전에 스프링을 먼저 배우는 게 좋을까요? 2. 그리고 이 로드맵에 나온 순서대로 보면 될까요? 로드맵에서는 1. 더 자바, 코드를 조작하는 다양한 방법 2. 더 자바, 애플리케이션을 테스트하는 다양한 방법 3. 더 자바, Java 8 이렇게 되어있는데 이대로 보는게 제일 나을까요? 감사합니다.
-
더 자바, 코드를 조작하는 다양한 방법
힙 영역에 관한 질문입니다.
클래스 로더 시스템이 힙영역에 객체를 생성 한다고 하였는데 실제로는 실행 엔진이 바이트 코드를 실행하면서 힙영역에 객체 배치하는게 아닌가요 ?
-
더 자바, 코드를 조작하는 다양한 방법
문서 버전 관련 내용 공유드립니다
드롭박스 버전은 수정 안된 문서가 올라와 있어 상황 공유 드립니다. 강의와 유튜브 재밌게 듣고 있습니다 감사합니다!
-
더 자바, 코드를 조작하는 다양한 방법
gradle 사용시
gradle 사용시 mainfest plugin은 어떻게 넣어야하나요? 관련 링크를 못찾겠습니다...
-
더 자바, 코드를 조작하는 다양한 방법
JVM관련해서 질문이 있습니다.
안녕하세요 선생님. 제가 이해 했는 부분이 정확한지 여쭤보고 싶어 질문드립니다. 1. 로딩을 하는 과정에서 '클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 “메소드” 영역에 저장'이 되는게 맞을까요 ? 로딩이 끝나면 해당 클래스 타입의 클래스 객체를 생성해서 힙영역에 저장 되는거구요. 2. Resolve는 .class 파일에서 필요한 자바 API의 이름만 지칭한것을 메모리상에서 실제로 존재하는 물리적인 주소로 대체되는 작업이라고 보면 될까요? 3. 로딩 > 링크 > 초기화 순이면 로딩과정에서 먼저 메소드영역에 데이터를 저장 한다음 링크에서 .class 파일을 검증(Verify)를 하는건가요 ? 4. '클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 “메소드” 영역에 저장.' 이때 바이너리 데이터를 만들때는 인터프리터를 이용하는걸까요?