자바 반사 총화 및 사용

11218 단어 자바-기초
반사
공식 적 으로 소개 가 있어 요.
Reflection is commonly used by programs which require the ability to examine or modify the runtime behavior of applications running in the Java virtual machine.
자바 가상 컴퓨터 에서 실행 되 는 프로그램의 실행 행 위 를 검사 하거나 수정 할 수 있 는 프로그램 에 반사 된다 는 뜻 이다.
잘 모 르 겠 어 요.반사 가 뭘 할 수 있 는 지 말씀 드 리 겠 습 니 다.
4.567917.반 사 는 운행 할 때 특정한 유형의 인 스 턴 스 를 동적 으로 생 성 할 수 있다
4.567917.반 사 는 실행 할 때 특정한 변 수 를 가 져 오고 변수의 값 을 수정 할 수 있 습 니 다
4.567917.반 사 는 운행 할 때 특정한 방법 을 집행 할 수 있다
어떻게 반 사 를 사용 합 니까?
우 리 는 위의 상황 에 맞추어 어떻게 사용 하 는 지 일일이 말 했다.
우 리 는 먼저 com.reflect.demo.java 를 우리 의 후속 실험 에 사용 하도록 정의 합 니 다.
package com.reflect;
public class Demo {

    public String pubStr = "public_string";
    private String priStr = "private_string";

    private String getPriStr(String testParam) {
        pubStr = testParam;
        return priStr;
    }

    private String getPriStr() {
        return priStr;
    }

    public Demo() {

    }

    private Demo( String priStr ) {
        this.priStr = priStr;
    }

    @Override
    public String toString() {
        return "Demo{" +
                "pubStr='" + pubStr + '\'' +
                ", priStr='" + priStr + '\'' +
                '}';
    }
}

실행 할 때 어떤 종류의 인 스 턴 스 를 동적 으로 생 성 합 니 다.
//            class ,     3    
Class demoClass = Class.forName("com.reflect.Demo");
// demoClass = Demo.class;
// demoClass = new Demo().getClass();

//         
Constructor constructor = demoClass.getDeclaredConstructor();
//       
constructor.setAccessible(true);
//           
Object demo = constructor.newInstance();

//         
Constructor constructor1 = demoClass.getDeclaredConstructor(String.class);
//       
constructor1.setAccessible(true);
//           
Object demo1 = constructor1.newInstance("I am String");

다음은 일반적인 인 스 턴 스 를 얻 는 방법 을 소개 한다.
    /**
     *     ,                 
     *
     * @param className
     * @return
     */
    public static Object getObjectInstance(String className, Object... args) {
        try {
            Class[] classes = new Class[args.length];
            for (int i = 0; i < args.length; i++) {
                classes[i] = args[i].getClass();
            }
            Class objClass = Class.forName(className);
            Constructor constructor = objClass.getDeclaredConstructor(classes);
            constructor.setAccessible(true);
            return constructor.newInstance(args);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return new Object();
    }

실행 할 때 어떤 종류의 변 수 를 가 져 오고 변수의 값 을 수정 합 니 다.
다음 코드 는 Demo.java 의 실례 적 인 변수(priStr)를 가 져 와 값 을 부여 하 는 방법 을 알려 줍 니 다.
//        new    ,    priStr    private_string
Demo demo = new Demo();
//    demo   class
Class demoClass = demo.getClass();
//    priStr   Field 
Field priStrField = demoClass.getDeclaredField("priStr");
//       
priStrField.setAccessible(true);

//   priStr   
//      demo       priStr ,        demo
Object priStrValue = priStrField.get(demo); 

//    priStr   
//       demo     ,        demo
priStrField.set(demo,"I am Private String"); 

다음은 일반적인 속성 획득 방법 을 소개 한다.
    /**
     *         
     *
     * @param obj            
     * @param fieldName           
     * @return
     */
    public static Object getFieldValue(Object obj, String fieldName) {
        try {
            Field field = obj.getClass().getDeclaredField(fieldName);
            field.setAccessible(true);
            return field.get(obj);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return new Object();
    }

    /**
     *             
     *
     * @param obj
     * @param fieldName
     * @param fieldValue
     * @return
     */
    public static boolean setFieldValue(Object obj, String fieldName, Object fieldValue) {
        try {
            Field field = obj.getClass().getDeclaredField(fieldName);
            field.setAccessible(true);
            field.set(obj, fieldValue);
            return true;
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return false;
    }

실행 할 때 어떤 종류의 모든 방법 을 실행 합 니 다.
다음 코드 는 데모.자바 를 가 져 오 는 방법(getPriStr)을 알려 드 리 고 이 방법 을 호출 합 니 다.
//        new    ,    priStr    private_string
Demo demo = new Demo();
//    demo   class
Class demoClass = demo.getClass();

//      getPriStr     Method 
Method priStrMethod = demoClass.getDeclaredMethod("priStr");
//       
priStrMethod.setAccessible(true);
//      
Object priStr = priStrMethod.invoke(obj);

//      getPriStr     Method 
Method priStrMethod1 = demoClass.getDeclaredMethod("priStr",String.class);
//       
priStrMethod1.setAccessible(true);
//      
Object priStr1 = priStrMethod1.invoke(obj,"I am testParam");

다음은 일반적인 호출 대상 방법 을 소개 한다.
    /**
     *       
     * @param obj
     * @param methodName
     * @param args
     * @return
     */
    public static Object invokMethod(Object obj, String methodName, Object... args) {
        try {
            Class[] classes = new Class[args.length];
            for (int i = 0; i < args.length; i++) {
                classes[i] = args[i].getClass();
            }
            Method method = obj.getClass().getDeclaredMethod(methodName, classes);
            method.setAccessible(true);
            method.invoke(obj,args);
            return method.invoke(obj, args);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return new Object();
    }

데모

좋은 웹페이지 즐겨찾기