학습 노트의 반사

20558 단어

리플렉스


클래스 로더


클래스 로드
프로그램이 특정한 클래스를 사용할 때 만약에 이 클래스가 메모리에 불러오지 않으면 시스템은 클래스 불러오기, 클래스 연결, 클래스 초기화 등 세 가지 절차를 통해 클래스를 초기화한다. 만약에 의외의 상황이 발생하지 않으면 JVM은 이 세 가지 절차를 연속적으로 완성할 것이다. 그래서 때때로 이 세 가지 절차를 클래스 불러오기 또는 클래스 초기화라고 부른다.
  • 클래스 로드:
  • class 파일을 메모리에 읽고 자바를 만듭니다.lang.Class 객체
  • 모든 종류가 사용될 때 시스템에서java를 생성합니다.lang.Class 객체
  • 클래스 연결
  • 검증 단계: 클래스에 불러온 클래스가 정확한 내부 구조를 가지고 있는지 검사하고 다른 클래스와 조화롭게 하는 데 사용
  • 준비 단계: 클래스의 클래스 변수에 메모리를 분배하고 기본 초기값
  • 을 설정합니다.
  • 해석 단계: 클래스의 2진법 데이터의 기호 인용을 직접 인용으로 바꾸기
  • 류의 초기화
  • 이 단계에서 클래스 변수를 초기화
  • 클래스 초기화 단계
  • 클래스가 불러오고 연결되지 않으면 프로그램이 먼저 클래스를 불러오고 연결합니다
  • 만약에 이 종류의 직접 부류가 아직 초기화되지 않았다면 직접 부류를 먼저 초기화
  • 클래스에 초기화 문장이 있다면 시스템은 순서대로 이 초기화 문장을 실행한다

  • 두 번째 단계를 수행할 때 시스템이 직접 부류에 대한 초기화 단계도 초기화 단계 1-3에 따른다
  • 클래스의 초기화 시기:
  • 클래스를 만드는 실례
  • 클래스를 호출하는 방법
  • 액세스 클래스나 인터페이스 변수 또는 이 클래스 변수에 값을 부여
  • 반사 방식을 사용하여 어떤 종류나 인터페이스에 대응하는java를 강제로 만듭니다.lang.Class 객체
  • 특정 클래스의 하위 클래스 초기화
  • java를 직접 사용합니다.주 클래스를 실행하기 위한 exe 명령

  • 클래스 로더
    역할:
  • 담당장.class 파일을 메모리에 불러오고 대응하는java를 생성합니다.lang.Class 객체
  • 비록 우리는 관계류의 마운트 메커니즘을 지나치게 하지 않지만 이 메커니즘을 이해하면 프로그램의 운행을 더욱 잘 이해할 수 있다
  • JVM의 클래스 로드 메커니즘:
  • 전체 책임: 하나의 클래스 로더가 어떤 클래스를 불러올 때 이 클래스가 의존하고 인용하는 다른 클래스도 클래스 로더가 불러오는 것을 책임진다. 다른 클래스 로더를 사용하지 않는 한
  • 상위 클래스 의뢰: 클래스 마운트가 클래스를 불러올 때 상위 클래스 마운트가 클래스 대상을 불러오려고 할 때 상위 클래스 마운트가 클래스를 불러올 수 없을 때만 자신의 경로에서 클래스를 불러오려고 한다
  • 캐시 메커니즘: 불러온 모든 Class가 캐시될 것을 보증한다. 프로그램이 특정한 Class 대상을 사용해야 할 때 클래스 로더는 먼저 캐시 구역에서 이 Class를 검색한다. 캐시 구역에 이 Class 대상이 존재하지 않을 때만 시스템은 해당 클래스에 대응하는 2진제 데이터를 읽고 이를 Class 대상으로 전환하여 캐시 구역
  • 에 저장한다.
    ClassLoader:클래스를 로드하는 객체
    java가 실행될 때 다음과 같은 내장 클래스 마운트가 있습니다
  • Bootstrap class loader: 가상 기기의 내장 클래스 마운트기입니다. 보통null로 표시되며 부모null
  • 이 없습니다.
  • Platform class loader . 플랫폼 클래스 로더기는 모든 플랫폼 클래스를 볼 수 있으며, 이를 클래스로더의 실례로 사용할 수 있는 부모 클래스로더입니다.플랫폼 클래스는 플랫폼 클래스 로더나 그 선조가 정의한 Java SE 플랫폼 API를 포함하며, 실제 클래스와 JDK의 특정한 운행 시간 클래스를 포함한다.
  • System class loader . 응용 프로그램 클래스 마운트기라고도 불리며 플랫폼 클래스 마운트기와 다르다.시스템 클래스 로더기는 일반적으로 응용 프로그램 클래스 경로, 모듈 경로와 JDK 특정 도구의 클래스를 정의하는 데 사용됩니다.

  • 클래스 로더의 상속 관계: System의 부모 로더는 Platform이고 Platform의 부모 로더는 Bootstrap이다
    ClassLoader의 두 가지 방법
  • static ClassLoader getSystemClassLoader (): 위임된 시스템 클래스 로더를 되돌려줍니다
  • ClassLoader getParent (): 상위 클래스 로더로 돌아가 위임
  • 
    public class Demo {
        public static void main(String[] args) {
            // 
            ClassLoader c = ClassLoader.getSystemClassLoader();
            System.out.println(c); //AppClassLoader
    
            // 
            ClassLoader c2 = c.getParent();
            System.out.println(c2);//PlatformClassLoader
    
            ClassLoader c3 = c2.getParent();
            System.out.println(c3);//null     Bootstrap null
        }
    }
    

    리플렉스


    java 반사 메커니즘: 실행할 때 클래스 변수와 방법 정보를 얻는 것을 말합니다.그리고 얻은 정보를 얻어 대상을 만들고 호출하는 메커니즘이 필요합니다.이런 동적성 때문에 프로그램의 유연성을 크게 강화할 수 있고 프로그램은 컴파일링 기간에 확정을 완성하지 않아도 되고 운행 기간에도 확장할 수 있다.
    Class 클래스의 객체 가져오기
    클래스를 반사해서 사용하려면 먼저 클래스의 바이트 코드 파일 대상, 즉 클래스 형식의 대상을 가져와야 한다.
    Calss 유형 객체를 가져오는 세 가지 방법
  • 클래스의class 속성을 사용하여 클래스에 대응하는 클래스 대상을 가져옵니다.예: Student.class는 Student 클래스에 해당하는 Class 객체
  • 를 반환합니다.
  • 대상의 getClass () 방법을 호출하여 대상이 속한 클래스에 대응하는 Class 대상을 되돌려줍니다
  • 이 방법은 Object 클래스의 방법으로 모든 자바 대상이 호출할 수 있음
  • 클래스의 정적 방법인 forName (String className) 을 사용합니다. 이 방법은 문자열 파라미터를 입력해야 합니다. 이 문자열 파라미터의 값은 클래스의 전체 경로, 즉 전체 패키지 이름의 경로입니다.
  • public class Student {
        // : , , 
        private String name;
        int age;
        public String address;
    
        // : , , 
        public Student() {
        }
    
        private Student(String name) {
            this.name = name;
        }
    
        Student(int age, String address) {
            this.age = age;
            this.address = address;
        }
    
        public Student(String name, int age, String address) {
            this.name = name;
            this.age = age;
            this.address = address;
        }
    
        // : , 
        private void function() {
            System.out.println("function");
        }
    
        public void method1() {
            System.out.println("method");
        }
    
        public void method2(String s) {
            System.out.println("method" + s);
        }
    
        public String method3(String s, int i){
            return s + "," + i;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", address='" + address + '\'' +
                    '}';
        }
    }
    
    public class Demo {
        public static void main(String[] args) throws ClassNotFoundException {
            // class Class 。
            Class c1 = Student.class;
            System.out.println(c1);
    
            Class c2 = Student.class;
            System.out.println(c1 == c2);
            System.out.println("--------------");
    
            // getClass() , Class 
            Student s = new Student();
            Class extends Student> c3 = s.getClass();
            System.out.println(c1 == c3);
            System.out.println("--------------");
    
            // Class forName(String className)
            Class> c4 = Class.forName(" . Class .Student");//package  . Class ;// 
            System.out.println(c1 == c4);
        }
    }
    

    반사 획득 구조 방법 및 사용
    public class Student {
        // : , , 
        private String name;
        int age;
        public String address;
    
        // : , , 
        public Student() {
        }
    
        private Student(String name) {
            this.name = name;
        }
    
        Student(int age, String address) {
            this.age = age;
            this.address = address;
        }
    
        public Student(String name, int age, String address) {
            this.name = name;
            this.age = age;
            this.address = address;
        }
    
        // : , 
        private void function() {
            System.out.println("function");
        }
    
        public void method1() {
            System.out.println("method");
        }
    
        public void method2(String s) {
            System.out.println("method" + s);
        }
    
        public String method3(String s, int i){
            return s + "," + i;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", address='" + address + '\'' +
                    '}';
        }
    }
    

    Class 클래스에서 구성 방법을 가져오는 방법
  • getConstructors()는 Constructor 객체를 포함하는 배열
  • 을 반환합니다.
    import java.lang.reflect.Constructor;
    
    public class Demo2 {
        public static void main(String[] args) throws ClassNotFoundException {
            Class> c = Class.forName(" . Class .Student");
            Constructor>[] cons = c.getConstructors();
            for (Constructor con : cons){
                System.out.println(con);
            }
        }
    }
    
  • Constructor>[] getDeclaredConstructors (): 모든 구조 방법 대상의 그룹을 되돌려줍니다
  • import java.lang.reflect.Constructor;
    public class Demo2 {
        public static void main(String[] args) throws ClassNotFoundException {
            Class> c = Class.forName(" . Class .Student");
            Constructor>[] cons = c.getDeclaredConstructors();
            for (Constructor con : cons){
                System.out.println(con);
            }
        }
    }
    
  • Constructor getConstructor(Class>...parameterTypes): 단일 공공 구조 방법을 되돌려줍니다
  • Constuructor 클래스에서 객체를 작성하는 방법
  • T newInstance(Object...initargs): 지정된 구성 방법에 따라 객체 작성
  • import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    
    public class Demo3 {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
            Class> c = Class.forName(" . Class .Student");
            Constructor> con = c.getConstructor();
            Object obj = con.newInstance();
            System.out.println(obj);
        }
    }
    
  • Constructor getDeclaredConstructor(Class>...parameterTypes): 단일 구조 방법의 대상을 되돌려줍니다
  • import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    
    public class Demo4 {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
            Class> c = Class.forName(" . Class .Student");
            Constructor> con = c.getDeclaredConstructor();
            Object obj = con.newInstance();
            System.out.println(obj);
        }
    }
    

    연습
    반사에 의한 구현
  • Students = new Student('장삼', 18,'광둥')
  • System.out.println(s)
  • import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    
    public class Demo {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
            Class> c = Class.forName(" . Class .Student");
    
            //public Student(String name, int age, String address)
            Constructor> con = c.getConstructor(String.class, int.class, String.class);// .class 
            Object obj = con.newInstance(" ", 18, " ");
            System.out.println(obj);
        }
    }
    

    연습
  • Students = new Student('장삼')
  • System.out.println(s)
  • import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    
    public class Demo {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
            Class> c = Class.forName(" . Class .Student");
    
            // private Student(String name)   
            Constructor> con = c.getDeclaredConstructor(String.class);
    
            // 
            //public void setAccessible (boolean flag): true, 
            con.setAccessible(true);
    
            Object obj = con.newInstance(" ");
            System.out.println(obj);
        }
    }
    

    구성원 변수 반사 및 사용
    구성원 변수를 가져오는 네 가지 방법
  • Field[]getFields(): 모든 공공 구성원 변수의 그룹을 되돌려줍니다
  • import java.lang.reflect.Field;
    public class Demo1 {
        public static void main(String[] args) throws ClassNotFoundException {
            Class> c = Class.forName(" . Class .Student");
            Field[] fields = c.getFields();
            for (Field field : fields) {
                System.out.println(field);
            }
        }
    }
    
    
  • Field[] getDeclaredFields(): 모든 구성원 변수 대상의 그룹을 되돌려줍니다
  • import java.lang.reflect.Field;
    public class Demo2 {
        public static void main(String[] args) throws ClassNotFoundException {
            Class> c = Class.forName(" . Class .Student");
            Field[] fields = c.getDeclaredFields();
            for (Field field : fields) {
                System.out.println(field);
            }
        }
    }
    
  • Field getField(String name)가 개별 공용 구성원 변수 객체를 반환
  • Field 클래스에서 구성원 변수에 값을 지정하는 방법
  • void set(Object obj, Object value): obj 객체의 구성원 변수에 value
  • 를 부여합니다.
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    public class Demo3 {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
            Class> c = Class.forName(" . Class .Student");
            Field field = c.getField("address");
            Constructor> con = c.getConstructor();
            Object obj = con.newInstance();
            field.set(obj, " ");// obj addressfield 
            System.out.println(obj);
        }
    }
    
  • Field getDeclaredField(String name): 단일 구성원 변수 객체 반환
  • Field 클래스에서 구성원 변수에 값을 지정하는 방법
  • void set(Object obj, Object value): obj 객체의 구성원 변수에 value
  • 를 부여합니다.
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    
    public class Demo4 {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
            Class> c = Class.forName(" . Class .Student");
            Field field = c.getDeclaredField("address");
    
            Constructor> con = c.getConstructor();
            Object obj = con.newInstance();
            field.set(obj," ");// obj addressfield 
            System.out.println(obj);
        }
    }
    

    연습
    반사하다
  • Student s = new Student()
  • s.name ='장삼'
  • s.age = "18"
  • s.address = "시안"
  • System.out.println(s)
  • import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    
    public class Demo {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
            Class> c = Class.forName(" . Class .Student");
    
            //* Student s = new Student()
            Constructor> con = c.getConstructor();
            Object obj = con.newInstance();
    
            // * s.name = " "
            Field nameField = c.getDeclaredField("name");
            nameField.setAccessible(true);
            nameField.set(obj," ");
    
            // * s.age = "18"
            Field ageField = c.getDeclaredField("age");
            ageField.setAccessible(true);
            ageField.set(obj,18);
    
            //* s.address = " "
            Field addressField = c.getDeclaredField("address");
            addressField.set(obj," ");
    
            System.out.println(obj);
        }
    }
    

    반사 구성원 획득 방법 및 사용
    구성원 접근법
  • Method[]getMethods(): 모든 공공 구성원 방법의 대상을 포함하는 그룹을 되돌려줍니다
  • import java.lang.reflect.Method;
    
    public class Demo1 {
        public static void main(String[] args) throws ClassNotFoundException {
            Class> c = Class.forName(" . Class .Student");
            Method[] methods = c.getMethods();
            for (Method method : methods) {
                System.out.println(method);
            }
        }
    }
    
  • Method[]getDeclaredMethods(): 모든 구성원 방법의 대상을 되돌려주는 그룹입니다. 계승된 것은 포함되지 않습니다
  • import java.lang.reflect.Method;
    
    public class Demo2 {
        public static void main(String[] args) throws ClassNotFoundException {
            Class> c = Class.forName(" . Class .Student");
            Method[] methods = c.getDeclaredMethods();
            for (Method method : methods) {
                System.out.println(method);
            }
        }
    }
    
  • Method getMethod (String name, Class >...parameterTypes): 하나의 구성원 메소드 대상을 되돌려줍니다
  • Method 클래스에서 구성원을 호출하는 방법
  • Object invoke(Object obj, Object...args): obj 객체의 구성원 메소드를 호출합니다. 매개 변수는 args이고 반환 값은 Object 유형
  • 입니다.
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class Demo3 {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
            // Class 
            Class> c = Class.forName(" . Class .Student");
    
            // 
            Constructor> con = c.getConstructor();
            Object obj = con.newInstance();
    
            Method m = c.getMethod("method1");
            m.invoke(obj);
        }
    }
    
  • Method get Declared Method(String name, Class >...parameterTypes): 개별 구성원을 반환하는 방법
  • Method 클래스에서 구성원을 호출하는 방법
  • Object invoke(Object obj, Object...args): obj 객체의 구성원 메소드를 호출합니다. 매개 변수는 args이고 반환 값은 Object 유형
  • 입니다.
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class Demo4 {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
            // Class 
            Class> c = Class.forName(" . Class .Student");
    
            // 
            Constructor> con = c.getConstructor();
            Object obj = con.newInstance();
    
            Method m = c.getDeclaredMethod("function");
            m.setAccessible(true);
            m.invoke(obj);
        }
    }
    

    연습하다
  • Student s = new Student();
  • s.method1()
  • s.method2("장삼")
  • String ss = s.method3('장삼', 20)
  • System.out.print(ss)
  • s.function()
  • import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class Demo {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
            Class> c = Class.forName(" . Class .Student");
    
            //Student s = new Student();
            Constructor> con = c.getConstructor();
            Object obj = con.newInstance();
    
            //s.method1()
            Method m1 = c.getMethod("method1");
            m1.invoke(obj);
            System.out.println("--------------");
    
            //s.method2(" ")
            Method m2 = c.getMethod("method2", String.class);
            m2.invoke(obj," ");
            System.out.println("--------------");
    
            //String ss = s.method3(" ",20)
            Method m3 = c.getMethod("method3", String.class, int.class);
            Object ss = m3.invoke(obj, " ", 20);
            //System.out.print(ss)
            System.out.println(ss);
            System.out.println("--------------");
    
            //s.function()
            Method m4 = c.getDeclaredMethod("function");
            m4.setAccessible(true);
            m4.invoke(obj);
        }
    }
    

    반사 연습

  • ArrayList 집합이 있습니다. 이 집합에 문자열 데이터를 추가하려면 어떻게 해야 합니까?
  • import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    public class Demo {
        public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
            ArrayList array = new ArrayList();
    
            Class extends ArrayList> c = array.getClass();
            Method m = c.getDeclaredMethod("add", Object.class);
    
            m.invoke(array, "hello");
            m.invoke(array, "world");
            m.setAccessible(true);
            array.add(10);
            System.out.println(array);
        }
    }
    
  • 프로필 실행 클래스를 통한 방법
  • class.txt:
    className =  . .Student
    methodName = study
    
    import java.io.FileReader;
    import java.io.IOException;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.Properties;
    
    public class Demo {
        public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
            // 
    //        Student s = new Student();
    //        s.study();
    
            // 
    //        Teacher t = new Teacher();
    //        t.teach();
    
            // 
    
            /*
            class.txt
            className = xxx
            methodName = xxx
             */
    
            // 
            Properties prop = new Properties();
            FileReader fr = new FileReader(" \\class.txt");
            prop.load(fr);
            fr.close();
            /*
            className =  . .Student
            methodName = study
             */
            String className = prop.getProperty("className");
            String methodName = prop.getProperty("methodName");
    
            Class> c = Class.forName(className);
            Object obj = c.getConstructor().newInstance();
    
            Method m = c.getMethod(methodName);
            m.invoke(obj);
        }
    }
    

    좋은 웹페이지 즐겨찾기