일례 로 JAVA 반사 엿 보기

자바 쓰기 에서 우 리 는 new 키 워드 를 통 해 대상 을 만 들 수 있 습 니 다.하지만 모든 일 에는 절대적 인 것 이 없다.마찬가지 로 우 리 는 다른 방법 을 통 해 대상 을 만 들 수 있다.이 방법 은 바로 반사 이다.
이 글 은 8 개의 데모()방법 을 통 해 반사 에 자주 사용 되 는 몇 가지 방법 을 보 여 준다.
  • class.forName():클래스 에 들 어 가 는 경로,동적 반사 로 해당 클래스 의 Class 대상 을 생 성 합 니 다
  • class.new Instance():말 그대로 반 사 를 통 해 대상 을 얻 을 수 있 습 니 다
  • class.getConstructors():이러한 구조 기 배열 을 얻 을 수 있 습 니 다
  • class.getDeclared Fields():클래스 속성 배열 획득
  • class.getMethods():획득 방법 배열
  • class.getClassLoader():이러한 종류의 로 더 를 얻 을 수 있 습 니 다
  • method.invoke(class.newInstance())에서 이 대상 을 호출 하 는 방법
  • Person 클래스 의 정의
    class Person {
        private int age;
        private String name;
        public Person() {
     
        }
     
        public Person(int age,String name) {
            this.age = age;
            this.name = name;
        }
     
        public void setAge(int age) {
            this.age = age;
        }
     
        public void setName(String name) {
            this.name = name;
        }
     
        public int getAge() {
            return age;
        }
     
        public String getName() {
            return name;
        }
    }
    

    인터페이스 Action 인터페이스 성명
    interface ActionInterface {
            public void walk(int m);
    }
    

    슈퍼 맨 클래스,Person 을 계승 하여 Action Interface 인 터 페 이 스 를 실현 하 는 walk(int m)방법.
    class SuperMan extends Person implements ActionInterface{
        private boolean BlueBriefs;
     
        public void fly() {
            System.out.println("     ~");
        }
     
        public void setBlueBriefs(boolean blueBriefs) {
            this.BlueBriefs = blueBriefs;
        }
     
        public boolean isBlueBriefs() {
            return BlueBriefs;
        }
     
        @Override
        public void walk(int m) {
            System.out.println("     ~~  " + m + "      !");
        }
    }
    

    테스트 클래스:8 개의 데모()방법
    package reflectLearning;
    import java.lang.reflect.*;
     
    /**
     * Created by Nanguoyu on 2016/4/21.
     */
    public class ReflectLearning {
     
        public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchFieldException, NoSuchMethodException {
     
            demo1();
            System.out.println("==============================================");
          
            demo2();
            System.out.println("==============================================");
     
            demo3();
            System.out.println("==============================================");
    
            demo4();
            System.out.println("==============================================");
     
            demo5();
            System.out.println("==============================================");
     
            demo6();
            System.out.println("==============================================");
     
            demo7();
            System.out.println("==============================================");
     
            demo8();
            System.out.println("==============================================");
        }
     
        //Demo1.  java             
        public static void demo1() {
            Person person = new Person();
            System.out.println("Demo1:  :" + person.getClass().getPackage().getName() + "," + "    :" + person.getClass().getName());
        }
     
        //Demo2.  Class      forName()              Class
        public static void demo2() throws ClassNotFoundException {
     
            //          Class,     null,          Person 
            Class> class1 = null;
            Class> class2 = null;
     
            //  1,    ClassNotFoundException
            class1 = Class.forName("reflectLearning.Person");
            System.out.println("Demo2:(  1)  :" + class1.getPackage().getName() + ","
                                + "    :" + class1.getName());
     
            //  2
            class2 = Person.class;
            System.out.println("Demo2:(  2)  :" + class2.getPackage().getName() + ","
                    + "    :" + class2.getName());
        }
    
        /**
         * demo3:  java    , class     【             】
         * @throws ClassNotFoundException
         * @throws IllegalAccessException
         * @throws InstantiationException
         */
    
        public static void demo3() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
            Class> class1 = null;
            class1 = Class.forName("reflectLearning.Person");
     
            //         ,           Person,          
            Person person = (Person) class1.newInstance();
    
            person.setAge(20);
            person.setName("SmileDay");
            System.out.println("Demo3:" + person.getName() + ":" + person.getAge());
        }
     
     
        /**
         * demo4:  java              ,           
         * @throws ClassNotFoundException
         * @throws IllegalAccessException
         * @throws InvocationTargetException
         * @throws InstantiationException
         */
        public static void demo4() throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException {
            Class> class1 = null;
            Person person1 = null;
            Person person2 = null;
     
     
            class1 = Class.forName("reflectLearning.Person");
    
            //           
            Constructor>[] constructors = class1.getConstructors();
    
            //                   
            person1 = (Person) constructors[0].newInstance();
     
            person1.setName("I'm the none param Body");
            person1.setAge(18);
     
            //                   
            person2 = (Person) constructors[1].newInstance(20,"I'm the second param Body");
     
            System.out.println("Demo4:" + person1.getName() + ":" + person1.getAge());
            System.out.println("Demo4:" + person2.getName() + ":" + person2.getAge());
     
        }
     
     
        /**
         * Demo5:   Java          , set   get
         * @throws ClassNotFoundException
         * @throws IllegalAccessException
         * @throws InstantiationException
         * @throws NoSuchFieldException
         */
     
        public static void demo5() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {
            Class> class1 = null;
            class1 = Class.forName("reflectLearning.Person");
            Object obj = class1.newInstance();
     
            Field personNameField = class1.getDeclaredField("name");
     
            //  name    private,     true,        。
            personNameField.setAccessible(true);
    
            personNameField.set(obj,"   ");
    
            System.out.println("Demo5:               :" + personNameField.get(obj));
     
            //  Class getDeclaredFields()           
            Field[] fields = class1.getDeclaredFields();
     
            for (int i = 0; i < fields.length; i++) {
                fields[i].setAccessible(true);
                fields[i].set(obj,"   ");
                System.out.println("          :" + fields[i].get(obj));
            }
        }
     
        /**
         *   Java            :      ,  ,    ,    ,   
         * @throws ClassNotFoundException
         */
     
        public static void demo6() throws ClassNotFoundException {
            Class> class1 = null;
            class1 = Class.forName("reflectLearning.SuperMan");
     
            //      
            Class> superClass = class1.getSuperclass();
            System.out.println("Demo6:SuperMan     :" + superClass.getName());
     
            System.out.println("=========================================");
     
            //  Class getDeclaredFields()           
            Field[] fields = class1.getDeclaredFields();
     
            for (int i = 0; i < fields.length; i++) {
                System.out.println("     :" + fields[i]);
            }
     
            System.out.println("=========================================");
     
            //  Class getMethods()           
            Method[] methods = class1.getMethods();
            for (int i = 0; i < methods.length; i++) {
                System.out.println("Demo6:  SuperMan    :");
                System.out.println("   :" + methods[i].getName());
                System.out.println("      :" + methods[i].getReturnType());
                System.out.println("       :" + Modifier.toString(methods[i].getModifiers()));
            }
    
            System.out.println("=========================================");
     
            //        ,        Class,                   
            Class> interfaces[] = class1.getInterfaces();
            for (int i = 0; i < interfaces.length; i++) {
                System.out.println("      :" + interfaces[i].getName());
            }
        }
     
     
        /**
         * Demo7:   Java         
         * @throws ClassNotFoundException
         * @throws NoSuchMethodException
         * @throws IllegalAccessException
         * @throws InstantiationException
         * @throws InvocationTargetException
         */
        public static void demo7() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
            Class> class1 = null;
            class1 = Class.forName("reflectLearning.SuperMan");
     
            System.out.println("Demo7:
    fly():"); Method method = class1.getMethod("fly"); method.invoke(class1.newInstance()); /* * Class getMethod(String methodName,Class> class) * walk(int m) 。 */ System.out.println(" walk(int m):"); method = class1.getMethod("walk",int.class); method.invoke(class1.newInstance(),100); } /** * Java * @throws ClassNotFoundException * * Bootstrap ClassLoader c++ , 。 * Extension ClassLoader , jre\lib\ext * AppClassLoader classpath , 。 java 。 */ public static void demo8() throws ClassNotFoundException { Class> class1 = null; class1 = Class.forName("reflectLearning.SuperMan"); String nameString = class1.getClassLoader().getClass().getName(); System.out.println("Demo8: :" + nameString); } }

    요약:Class.forName()방법 은 반 사 된 입구 입 니 다.이 방법 을 실행 하면 class 대상 을 얻 을 수 있 습 니 다.그 다음 에 해당 하 는 클래스,대상 의 각종 데 이 터 를 얻 을 수 있 습 니 다.구조 기 배열,방법 배열,속성 숫자,부모 배열,인터페이스,클래스 로 더 등 정 보 를 얻 을 수 있 습 니 다.
    참고 글:http://blog.csdn.net/ljphhj/article/details/12858767

    좋은 웹페이지 즐겨찾기