자바 반사 메커니즘, 대상 을 통 해 호출 클래스 의 개인 구성원 속성 이나 방법 에 접근 합 니 다.

12539 단어 자바반사JAVA
자바 반사 메커니즘 원리 자바 에서 만물 은 모두 대상 이 고 클래스 클래스 도 대상 이 며 클래스 클래스 라 는 클래스 의 대상 이다.따라서 이 클래스 유형의 대상 클래스 를 통 해 대상 접근 클래스 의 속성 과 방법 을 사용 할 수 있 습 니 다.
Class      (          )。     ,  A a = new A();
    a        。        ,       ,
    A          ,         new       ,        ,
  MethodMethod

클래스 종류
클래스 text 의 대상 t 를 먼저 설명 합 니 다.
text1 t = new text1();

클래스 유형 을 얻 을 수 있 는 세 가지 방법 이 있 습 니 다:
Class t0 = text.class;//        ,  Class       class   
Class t1 = t.getClass();//         
Class t2 = null;
text t4 = null;
try {
    t2 = Class.forName("classReflex.text");//            
    t4 = (text) t0.newInstance();//            
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
    e.printStackTrace();
}

주제 진입: 클래스 유형 을 통 해 클래스 의 구성원 변수, 방법, 구조 방법 에 대한 접근 과 호출 을 실현 합 니 다.
우선 클래스 text 1 입 니 다.
public class text1 {

    public int x;
    protected boolean b;
    private String s;

    public text1() {
        // TODO Auto-generated constructor stub
    }

    public void f0() {
        System.out.println("     !  Android!");
    }

    private void f0_private() {
        System.out.println("         !     !  Android!");
    }

    public void f1(int i, String s1, boolean b) {

    }

    public int f2(int i, int s1, int b) {
        return i;
    }

    public String f3(String i, String s1, String b) {
        return i;
    }

}

대상 을 이용 하여 클래스 의 구성원 변 수 를 얻 습 니 다.
  • 대상 을 이용 하여 클래스 유형 Class c = object. getClass () 를 획득 합 니 다.
  • getName () 방법 으로 클래스 의 이름 을 얻 을 수 있 습 니 다.
  • getDeclared Fields () 는 자신 이 정의 한 모든 구성원 속성의 Field 집합 을 되 돌려 줍 니 다. (영역)
  • Class type = field. getType () 을 통과 합 니 다.속성 을 얻 은 클래스 종류, getName () 은 속성의 구체 적 인 유형 을 얻 을 수 있 습 니 다
  • 속성 에 대한 호출 은 다음 과 같은 방법 으로 호출 된다
  • public static void printClassAttribute(Object object) {
            //         ,       。
            Class c = object.getClass();
            //       ,        ,       ,     object  。
            System.out.println("    :" + c.getName());
            System.out.println("      :");
            Field[] Fields = c.getDeclaredFields();
            if (Fields.length > 0) {
                for (Field field : Fields) {
                    Class type = field.getType();
                    System.out.println("field.getName()-->" + field.getName());
                    System.out
                            .println(field.getModifiers() + " " + type.getSimpleName() + 
                            " m" + type.getSimpleName() + ";");
                }
            } else {
                System.out.println("      ");
            }
        }

    대상 을 이용 하여 클래스 를 얻 는 멤버 방법
    클래스 형식 대상 을 통 해 클래스 에 접근 하 는 모든 방법
  • c.getDeclaredMethods();클래스 유형의 대상 을 통 해 방법 류 의 대상 집합 Method 의 집합 을 얻 을 수 있 습 니 다.
  • Method 대상 의 getReturnType () 을 통 해 얻 을 수 있 는 반환 유형의 클래스 대상
  • 주식 method. getParameterTypes () 에서 얻 은 방법의 입력 형 삼 유형 집합.그 다음 에 하기 쉬 워 요. 유형 을 통 해 유형 을 얻 을 수 있어 요.

  • 클래스 타 입 대상 을 통 해 클래스 를 호출 하 는 방법
  • Methodm m = c. getMethod ("방법 명", 형 삼 의 유형 집합);지 정 된 방법의 대상 획득
  • 이 방법 이 개인 적 인 방법 이 라면 무장 애 setAccessible (true) 에 접근 하 는 방법 을 밝 혀 야 합 니 다.
  • 이후 m. invoke (c. newInstance, "실제 인삼" 집합) 를 호출 합 니 다.클래스 를 호출 하 는 방법.
  • 물론 정적 방법 이 라면 유형 대상 에 들 어 갈 필요 가 없고 유형 대상 c 만 들 어 오 면 됩 니 다
  • public static void printClassMethod(Object object) {
            //         ,       。
            Class c = object.getClass();
            //       ,        ,       ,     object  。
            System.out.println("    :" + c.getName());
            System.out.println("      :");
            /*
             * Method        。 :      ,   Method   
             * getMethods()          ,           
             * getDeclaredMethods()            。        
             */
            // Method[] methods = c.getMethods();
            Method[] methods = c.getDeclaredMethods();
            for (Method method : methods) {
                //             
                Class returnTyoe = method.getReturnType();
                System.out.print(returnTyoe.getSimpleName() + " " + method.getName() + "(");
                //            
                Class[] parameterTypes = method.getParameterTypes();
                for (int i = 0; i < parameterTypes.length; i++) {
                    Class parameterType = parameterTypes[i];
                    if (i != 0)
                        System.out.print(" , ");
                    System.out.print(parameterType.getSimpleName() + " par" + i);
                }
                System.out.println(");");
            }
            System.out.println("methods.length-->" + methods.length);
            /**
             *       public  f0();
    * Method , */
    Method m; try { m = c.getMethod("f0", null); m.invoke(c.newInstance(), null);// , // , , m.invoke(c, null); } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } /** * private f0();
    * m_private.setAccessible(true);// , */
    Method m_private; try { m_private = c.getDeclaredMethod("f0_private", null); m_private.setAccessible(true);// , , , m_private.invoke(c.newInstance(), null); } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException| InvocationTargetException | InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } }

    대상 획득 류 의 구조 방법 을 이용 하 다.
    구성원 을 호출 하 는 방법 과 유사 하여 더 이상 설명 을 하지 않 는 다.
    public static void printStructureMethod(Object object) {
            Class c = object.getClass();
            //       ,        ,       ,     object  。
            System.out.println("    :" + c.getName());
            System.out.println("      :");
            Constructor[] constructors = c.getConstructors();
            for (int i = 0; i < constructors.length; i++) {
                Constructor constructor = constructors[i];
                System.out.print(constructor.getName() + " (");
                Class[] parameterTypes = constructor.getParameterTypes();
                for (int j = 0; j < parameterTypes.length; j++) {
                    Class parameterType = parameterTypes[j];
                    if (j != 0)
                        System.out.print(" , ");
                    System.out.print(parameterType.getSimpleName());
                }
                System.out.println(")");
            }
        }

    소스 코드 다운로드 링크 CSDN 다운로드 링크:http://download.csdn.net/detail/d_inosaur / 9855095 야드 클 라 우 드 링크:https://gitee.com/D_inasour/codes/ursvnom912cghatek7q3z89#Reflex.rar

    좋은 웹페이지 즐겨찾기