code manipulation: reflection(Class API)

This commit is contained in:
haerong22
2021-02-20 21:55:15 +09:00
parent dcc16bbd17
commit 608cbe2ae2
10 changed files with 123 additions and 30 deletions

View File

@@ -1,8 +1,8 @@
package org.example;
package org.example.annotation;
import java.util.Arrays;
public class AnnotationApp {
public class App {
public static void main(String[] args) {

View File

@@ -1,4 +1,4 @@
package org.example;
package org.example.annotation;
@MyAnnotation(name = "lee", number = 20)

View File

@@ -1,4 +1,4 @@
package org.example;
package org.example.annotation;
public class MyBook extends Book implements MyInterface{
}

View File

@@ -1,4 +1,4 @@
package org.example;
package org.example.annotation;
public interface MyInterface {
}

View File

@@ -1,10 +1,9 @@
package org.example;
package org.example.classapi;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Arrays;
public class ClassApiApp {
public class App {
public static void main( String[] args ) throws ClassNotFoundException {
@@ -100,7 +99,7 @@ public class ClassApiApp {
// System.out.println("============================");
//
// // 문자열로 접근
// Class<?> bookClass2 = Class.forName("org.example.Book");
// Class<?> bookClass2 = Class.forName("org.example.annotation.Book");
// System.out.println(bookClass2.getName());
}
}

View File

@@ -0,0 +1,35 @@
package org.example.classapi;
public class Book {
private static String B = "BOOK";
private static final String C = "BOOK";
private String a = "a";
public String d = "d";
protected String e = "e";
public Book() {
}
public Book(String a, String d, String e) {
this.a = a;
this.d = d;
this.e = e;
}
private void f() {
System.out.println("f");
}
public void g() {
System.out.println("g");
}
public int h() {
return 100;
}
}

View File

@@ -0,0 +1,56 @@
package org.example.classapi2;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class App {
public static void main(String[] args) throws Exception {
/**
* Class API : 클래스 정보 수정, 실행 하기
*/
// 메소드 실행하기
Class<?> bookClass = Class.forName("org.example.classapi2.Book");
Book book = (Book) bookClass.getConstructor().newInstance();
Method c = Book.class.getDeclaredMethod("c");
c.setAccessible(true);
c.invoke(book);
Method sum = Book.class.getDeclaredMethod("sum", int.class, int.class);
int invoke = (int) sum.invoke(book, 1, 2);
System.out.println(invoke);
// // 필드 값 접근/수정하기
// Field a = Book.class.getDeclaredField("A");
// System.out.println(a.get(null)); // static 필드 이므로 null
// a.set(null, "AAAAAA");
// System.out.println(a.get(null));
//
//
// Class<?> bookClass = Class.forName("org.example.classapi2.Book");
// Book book = (Book) bookClass.getConstructor().newInstance();
//
// Field b = Book.class.getDeclaredField("B");
// b.setAccessible(true); // private 필드 이므로 접근 할 수 있도록 변경
// System.out.println(b.get(book)); // 특정 인스턴스가 필요
// b.set(book, "BBBBBB");
// System.out.println(b.get(book));
// // 생성자로 인스턴스 만들기
// Class<?> bookClass = Class.forName("org.example.classapi2.Book");
// Constructor<?> constructor = bookClass.getConstructor();
// Constructor<?> constructor1 = bookClass.getConstructor(String.class);
// Book book = (Book) constructor.newInstance();
// Book book1 = (Book) constructor1.newInstance("myBook");
//
// System.out.println(book);
// System.out.println(book1);
}
}

View File

@@ -0,0 +1,23 @@
package org.example.classapi2;
public class Book {
public static String A = "A";
private String B = "B";
public Book() {
}
public Book(String b) {
B = b;
}
private void c() {
System.out.println("C");
}
public int sum(int left, int right) {
return left + right;
}
}

View File

@@ -1,20 +0,0 @@
package org.example;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
/**
* Unit test for simple App.
*/
public class ClassApiAppTest
{
/**
* Rigorous Test :-)
*/
@Test
public void shouldAnswerWithTrue()
{
assertTrue( true );
}
}