흑마 프로그래머 - 첨단 기술 - 반사

11945 단어 프로그래머
흑마 프로그래머 - 첨단 기술 - 반사
 
------ Java 교육, Android 교육, iOS 교육,.Net 교육 당신과 교류하기를 기대합니다!
 
개술
JAVA 반사 메커니즘은 운행 상태에서 임의의 클래스에 대해 이 클래스의 모든 속성과 방법을 알 수 있다.임의의 대상에 대해 임의의 방법과 속성을 호출할 수 있다.이런 동적으로 얻은 정보와 동적 호출 대상의 방법의 기능을 자바 언어의 반사 메커니즘이라고 한다.
반사는 자바 클래스의 각종 성분을 상응하는 자바 클래스로 비춘다. 예를 들어 하나의 자바 클래스에서 하나의Class 클래스의 대상으로 표시하고 하나의 클래스의 구성 부분: 구성원 변수, 방법, 구조 방법, 패키지 등 정보도 하나의 자바 클래스로 표시한다.자바의 Class 클래스는 일련의 방법을 제공하여 그 중의 변수, 방법, 구조 방법, 수식자, 가방 등 정보를 얻어야 한다는 것을 나타낸다. 이런 정보는 상응하는 클래스의 실례 대상으로 그들이 Field, Method, Contructor, Package 등임을 나타낸다.
 
본문
1. 클래스
자바의 클래스는 자바 반사 메커니즘의 기초로 클래스를 통해 우리는 하나의 클래스에 대한 정보를 얻을 수 있다.가상 시스템은 각 유형의 고유한 Class 객체를 관리합니다.각 클래스(형)마다 하나의 클래스 대상이 있다는 것이다.프로그램을 실행할 때, 자바 가상 머신 (JVM) 은 우선 불러올 클래스에 대응하는 클래스 대상이 불러왔는지 확인합니다.로드되지 않은 경우 JVM은 클래스 이름을 기준으로 찾습니다.class 파일 및 Class 객체를 로드합니다.
다음은 Class 객체를 획득하는 세 가지 방법입니다.
  • Object류의 getClass() 방법으로 Class 대상을 얻는 것도 가장 흔히 볼 수 있는 Class 대상을 만드는 방법이다.예: Class c1 = x.getClass(),
  • 문자열에 대응하는 클래스의 정적 forName () 방법을 사용하여 클래스 대상을 얻습니다.예: Class c2=Class.forName ("클래스의 전체 클래스 이름")
  • Class 유형의 객체를 가져오는 세 번째 방법은 매우 간단합니다.T가 자바 형식이라면 T.class는 일치하는 클래스 대상을 나타냅니다.예: Class cl2 = int.class;

  • Cl14ass 클래스의 방법은 다음과 같습니다.
    1. public static Class<?> forName(String className) :natice   ,     。    
    
    2. public T newInstance() :     class      ,    。    
    
    3. public ClassLoader getClassLoader() :        
    
    4. public String getName() :         
    
    5. public native Class getSuperclass():      ,          ,    
    
    6. public java.net.URL getResource(String name) :         
    
    7. public boolean isEnum() :         
    
    8. public native boolean isArray() :         
    
    9. public native boolean isPrimitive() :         
    
    10. public native int getModifiers() :         
    
    11. public Field getField(String name):        
    
    12. public Field[] getFields() :       
    
    13. public Method[] getMethods() :    
    
    14. public Constructor<?>[] getConstructors() :         
    
    

      
    2. Constructor 클래스
    Constructor 클래스는 다양한 클래스 구성 방법의 반사 클래스입니다.Constructor 반사 클래스 객체의 획득(예:
      Constructor constructor=String.class.getConstructor(StringBuffer.class);
    구성 방법은 다음과 같은 인스턴스 객체를 구성하는 데 사용할 수 있습니다.
      String str=(String)constructor.newInstance(new StringBuffer("abc"));
    Class 자체도 newInstance 메서드를 사용할 수 있습니다. 예를 들어 다음과 같습니다.
      String obj=(String)String.class.newInstance();//무참한 구조 방법을 사용하는 것과 유사하다.
    다음은 간단한 예제 코드입니다.
    //  Constructor          
    
    
    
    public static void ConstructorDemo() throws Exception{
    
    
    
           //  Test  Class  
    
    
    
           String className = "cn.itheima.Test";
    
    
    
           Class clazz = Class.forName(className);
    
    
    
                 
    
    
    
           //            
    
    
    
           Constructor con = clazz.getConstructor(String.class,int.class);
    
    
    
           Test p = (Test) con.newInstance("lisi",30);
    
    
    
           System.out.println(p.toString());
    
    
    
    }

     
    3. Filed 클래스
    자바는 클래스에 포함된 모든 Field 또는 지정한 Filed를 Class 대상의 getFileds () 또는 getField () 방법으로 얻을 수 있습니다.다음은 두 가지 방법으로 Field 값을 읽거나 설정합니다.
    1. getXxx(Object obj):  obj   Field    。   Xxx  8     ,             ,   get   Xxx。
    
    2. setXxx(Object obj,Xxx val): obj    Field   val 。   Xxx  8     ,             ,   set   Xxx。

    다음은 간단한 예제 코드입니다.
    public class Test {
    
    
    
           public final int a=5;
    
    
    
           public static void main(String[] args) {
    
    
    
                  Test test = new Test();
    
    
    
                  try {  
    
    
    
                          //         
    
    
    
                                Field field = Test.class.getField("a");
    
    
    
                                // Test          ;
    
    
    
                                System.out.println(field.getInt(test));
    
    
    
                                //                   Object
    
    
    
                                Object obj = field.get(test);
    
    
    
                                System.out.println(obj);
    
    
    
                                //         
    
    
    
                                System.out.println(obj.getClass().getName());
    
    
    
      } catch (Exception e) {
    
    
    
                  e.printStackTrace();
    
    
    
      }
    
    
    
     }
    
    
    
    }

     
     
    4. 조작 배열
    java에서.lang.reflect 패키지 아래에 Array 클래스가 있습니다. Array 대상은 모든 그룹을 대표할 수 있습니다.Array를 사용하여 배열을 동적으로 작성하고 배열 요소 등을 조작할 수 있습니다.Array는 다음과 같은 몇 가지 방법을 제공합니다.
    1. static Object newInstance(Class<?> componentType,int…length):             、        
    
    2. Static xxx getXxx(Object array,int index):  array    index   。  xxx         ,           ,             get(Object array,int index)
    
    3. static void setXxx(Object array,int index,xxx val): array    index       val。  xxx       ,                    ,      set(Object array,int index,xxx val)

    다음은 코드입니다. 전송 대상을 인쇄하고, 단일 대상이면 직접 인쇄하고, 수조라면 수조 요소를 하나씩 인쇄합니다. (수조 대상에 대한 판단 응용)
    public void printObject(Object obj){
    
    
    
           Class cla=obj.getClass();
    
    
    
          
    
    
    
           if(cla.isArray()){
    
    
    
           int len=Array.getLength(obj);
    
    
    
          
    
    
    
           for(int i=0;i<len;i++){
    
    
    
                  System.out.println(Array.get(obj,i));
    
    
    
      }
    
    
    
      } else{
    
    
    
        System.out.println(obj);
    
    
    
          }
    
    
    
    }

     
    5. Method 클래스
    어떤 클래스에 대응하는 Clss 대상을 얻으면, 이 Class 대상의 getMethods () 방법이나 getMethod () 방법으로 모든 방법이나 지정한 방법 (이 두 방법의 반환값은 Method 그룹), 또는 Method 대상을 얻을 수 있습니다.
    구체적인 방법은 다음과 같습니다.
    1. Method[] getMethods(); //            
    
    
    
    2. Method[] getDeclaredMethods(); //         
    
    
    
    3. Method  getMethod("   ",  .class(        null))
    
    
    
    4. Object invoke(Object obj ,  ); //   obj         ,      

    다음은 예시 코드입니다. 클래스의 어떤 방법을 얻을 수 있습니다.
    public class ReflectMethod{
    
    
    
        public static void main(String args[]) throws Exception{
    
    
    
          
    
    
    
              //new String[]{new String("abc"),new String("xyz"),new String("mn")}; //String  
    
    
    
           //new Object[]{new String("abc"),1}; //Object  
    
    
    
         
    
    
    
             String str1 = "abcd";
    
    
    
          
    
    
    
              //str1.chatAt(1);
    
    
    
          
    
    
    
              Method methodCharAt = String.class.getMethod("charAt",int.class);
    
    
    
          
    
    
    
              char c = (Character)methodCharAt.invoke(str1,new Object[]{2});
    
    
    
               //  jdk1.4     ,   Object    
    
    
    
          
    
    
    
              System.out.println(c);//c
    
    
    
        }
    
    
    
    }

     
    3. 총결산
    본고는 반사의 기본 개념과 반사의 기초인 Class의 세 가지 획득 방식과 자주 사용하는 방법을 간단하게 설명하고 반사와 관련된 네 가지 종류인 Filed, Method, Array와 Constructor의 간단한 응용도 설명한다.

    좋은 웹페이지 즐겨찾기