>  기사  >  Java  >  08.Java 기초 - 리플렉션

08.Java 기초 - 리플렉션

黄舟
黄舟원래의
2017-02-27 10:35:231099검색


기본 개념


Java 리플렉션 메커니즘을 사용하면 )런타임(Runtime)을 제외하고 클래스, 인터페이스, 변수, 메소드 정보를 확인합니다.

reflection의 기능은 다음과 같습니다.

  • 어떤 클래스에 대해서도 이 클래스의 모든 속성과 메서드를 알 수 있습니다. >

    모든 개체에 대해 해당 메서드와 속성을 호출할 수 있습니다.
클래스

클래스에 대한 정보를 얻으려면 먼저 해당 클래스의 Class 객체를 얻어야 합니다.

Java의 모든 유형에는 기본 유형(int, long, float 등)이 포함되며 배열에도 이와 관련된 Class 객체가 있습니다.

    클래스 객체 가져오기
  • //1.在编译期获取类对象Class cls = Demo.class 
    
    //2.在运行期获取类对象(注意:需要包括完整的包名) Cllss clas = Class.forName("com.test.Demo")

    이름 가져오기 수업
  • Class cls = ...// 1.获取完整类型(包括包名)String className = cls.getName();
    // 2.获取简单类名 String simpleClassName =cls.getSimpleName();

    수업 수식어 가져오기
  • Class cls = ...// 修饰符都被包装成一个 int 类型的数字,这样每个修饰符都是一个位标识(flag bit)    
    int modifiers  = cls.getModifiers();// 判断修饰符类型Modifier.isPublic( modifiers);
    Modifier.isProtected( modifiers);
    Modifier.isPrivate( modifiers);
    Modifier.isAbstract( modifiers);
    Modifier.isInterface( modifiers);
    Modifier.isFinal( modifiers);
    Modifier.isStatic( modifiers);
    Modifier.isNative( modifiers);
    Modifier.isStrict( modifiers);
    Modifier.isSynchronized( modifiers);
    Modifier.isTransient( modifiers);
    Modifier.isVolatile( modifiers);

    클래스의 패키지 정보 가져오기
  • Class cls =...
    Package p = cls.getPackage();

    클래스가
  • Class cls = ...
    Class superClass  = cls.getSuperclass();

클래스에서 구현한 인터페이스 유형 가져오기
  • Class cls = ...// 类可以实现多个接口,因此返回的是接口数组Class [ ] interfaces = cls.getInterfaces();

  • 생성자

Java에서 생성자 클래스는 생성자 객체를 나타냅니다.

public
    생성자 메서드 가져오기
  • Class cls = ...// 1.获取所有构造函数Constructor[] constructors = cls.getConstructors(); 
    
    // 2.获取指定构造函数,不存在匹配则抛出异常。
    // 对应的构造函数入参类为 Person(String str, int i)Constructor constructor = 
        cls.getConstructor(new Class[]{String.class,int.class});

입력 매개변수 가져오기 생성자 유형
  • Constructor constructor = ...
    // 因为构造函数的入参有多个,因此返回的数组Class [] paramterTypes = constructor.getParameterTypes();
    for(Class paramterType: paramterTypes ){    
    // do something...}

생성자 인스턴스화 클래스
  • Class cls = ...
    Constructor constructor = cls.getConstructor(new Class[]{String.class});
    // Object[] 数组表示入参的具体值,需要与 Class[] 的入参类型完全匹配Demo demo = (Demo) constructor.newInstance(new Object[]{"hello"});

  • Field

Java에서 Field 클래스는 변수 객체를 나타냅니다.

모든 변수 가져오기(공개, 비공개)
  • Class cls = ...// 1.获取所有公共变量Field[] fields = cls.getFields();
    // 2.获取所有非公共变量Field [] privateFields =cls.getDeclaredFields();

변수 지정(공개, 비공개)
  • Class cls = ...//入参为变量名称,名称不匹配则抛出异常// 获取指定公共变量Field field = cls.getField("num");
    // 获取指定非公共变量Field privateField = cls.getDeclaredField("str");

변수 조작
  • Class<?> cls = Demo.class;
    Demo demo = (Demo) cls.newInstance();// 1.1.公共方法的 setter、getterField field = cls.getField("num");
    field.set(demo, 1000);int filedValue  = (Integer) field.get(demo);// 2.1 非公共方法的 setter、getterField privateField = cls.getDeclaredField("str");
    privateField.setAccessible(true); // 关键 -> 操作之前,需要设置访问权限privateField.set(demo, "hello");
    String privateFieldValue = (String) privateField.get(demo);

  • 메서드

1. 메소드 객체 가져오기

모든 메소드 가져오기
  • Class cls = ...// 1.获取所有公共方法(包括从父类继承而来的)Method[] methods = cls.getMethods();
    // 2.获取所有非公共方法(包括从父类继承而来的)Method [] privateMethods = cls.getDeclaredMethods();

지정된 메서드 가져오기
  • Class cls = ...// 1.获取指定公共方法,入参为:方法名、方法入参Method method = cls.getMethod("print", new Class[]{String.class});
    // 2.获取指定非公共方法,入参为:方法名、方法入参Method privateMethod = cls.getDeclaredMethod("say", new Class[]{int.class});

메서드의 매개변수 유형 가져오기
  • Method method = ...// 1.获取方法的所有入参类型Class [] paramterTypes = method.getParameterTypes();
    // 2.获取方法的返回值类型Class reeturnType = method.getReturnType();

실행 메서드
  • Class cls = Demo.class;
    Demo demo = (Demo) cls.newInstance();
    Method method = cls.getMethod("print", new Class[]{String.class});//1.执行公用方法,入参为:类实例,方法入参的具体值method.invoke(demo, "hello");
    //2.执行非公共方法Method privateMethod = 
        cls.getDeclaredMethod("print", new Class[]{String.class});
    privateMethod.setAccessible(true); // 关键 -> 操作之前,需要获得访问权限privateMethod.invoke(demo, "hello");

getter/setter 메소드 판단
  • public static boolean isGetter(Method method){    
    if(!method.getName().startsWith("get")){        
    return false;
        }    
        if(method.getParameterTypes().length !=0){        
        return false;
        }    
        if(void.class.equals(method.getReturnType())){        
        return false;
        }    
        return true;
    }
    public static boolean isSetter(Method method){    
    if(!method.getName().startsWith("set")){        
    return false;
        }    
        if(method.getParameterTypes().length !=1){        
        return false;
        }    
        return true;
    }

  • Array

Java에서는, Array 클래스를 사용하여 배열 객체를 나타냅니다.

배열 객체 가져오기
  • int [ ] intArray = ... 
    Class arrayCls = intArray.class;

배열 멤버 유형 가져오기
  • Class arrayCls = ...
    Class arrayComponentType =arrayCls .getComponentType();

배열 만들기
  • // 创建一个数组,类型为 int ,容量为 3int [ ] intArray = (int[]) Array.newInstance(int.class, 3);
    //在 JVM 中字母I代表int类型,左边的‘[’代表我想要的是一个int类型的数组Class intArrayClass = Class.forName("[I");  
    
    //注意‘[L’的右边是类名,类名的右边是一个‘;’符号。这个的含义是一个指定类型的数组。
     stringArrayClass = Class.forName("[Ljava.lang.String;");

추가 배열요소
  • int [ ] intArray = ...// 添加元素,数组为 intArray,位置为 0 ,值为 100Array.set(intArray, 0, 100);
    Array.set(intArray, 1, 200);
    System.out.println("intArray[0] = " + Array.get(intArray, 0));
    System.out.println("intArray[1] = " + Array.get(intArray, 1));
    위 내용은 08.Java Basics - Reflection의 내용이며, 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요. )!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.