java 反射(Reflection) 詳解

   

 

jAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制。java

  衆所周知哈 java ,c++,c#這類語言不屬於動態語言;而目前的結論是 在程序運行狀態中能容許改變變量類型和程序結構的被稱之爲動態語言;可是java Reflection 具有看透class 的能力這種能力被稱爲introspection (內省,內觀) (面試重點 須要的同窗能夠自行百度詳細瞭解一下  我能力有限講不明白)(只有java  提供反射機制  像c++,c#等 非動態語言沒有提供)c++

java 反射機制提供的功能  (注意:大前提是在運行狀態下):面試

  • 判斷任意一個對象所屬類
  • 構造任意一個類的對象
  • 判斷任意一個類所具備的成員變量和方法
  • 調用任意一個對象的方法

java 反射機制的主要類 主要位於 java.lang.reflet c#

  • Class類  表明一個類
  •   Filed類   表明類的成員變量
  •   Method  表明類的方法
  •   Constructor 表明類的構造方法
  •   Array 提供動態建立數組以及訪問數組中元素的靜態方法

Java 經過反射獲取某個類裏全部的方法   直接上代碼 :數組

 

java獲取class 類的三種方法:測試

  •  class.froname("類的路徑")
  • 類名.class
  • 實例.getclass

    

  /*   實例 操做   */
    public static void main(String[] args ) throws ClassNotFoundException {

        /*得到字符串服表示的類的 class 對象*/
        Class<?> aClass= Class.forName("java.lang.String");

        /*  能夠獲取裏面 的全部方法  */
        Method[] methods = aClass.getDeclaredMethods();
        for(Method method : methods){

            System.out.println(method);
        }

結果 :this

 java  反射動態的調用某個類的特定的方法  首先要獲取該類的Method  方法  對於類的成員變量和構造方法相似  首先要獲取 Filed 和 Constroutorspa

 
 /*普通方法 */
        public int add (int a,int b)
        {
            return  a+b;
        }

         public static  void main(String[] args ) throws Exception {

             /*  經過 .class  方法 獲取  該類中的全部對象  */
             Class<?> aClass = Reflections.class;
             /* 生成該類的實例化對象 建立一個新的實例 */
             Object reflection = aClass.newInstance();
             /*  判斷  reflectiong  是不是  Reflections 的實例    返回結果爲true */
             System.out.println( reflection instanceof  Reflections );

             /* 經過這個類的 getmethod 方法獲取到 該類的 add 方法 */
             Method add = aClass.getMethod("add",new Class[]{int.class,int.class});
            /*反射方式 操做獲取到的方法 */
            Object result = add.invoke(reflection,new Object[]{1,2});

             System.out.println((Integer)result); //結果為3 
         }
            /* 完成對 gflection 的拷貝工做 */
            public Object copy (Object object) throws Exception {
                Class<?>  aClass = object.getClass();
                System.out.println(aClass);
                /* 獲取構造方法 */
                Constructor con = aClass.getConstructor(new Class[]{String.class,int.class});
                Object gbj = con.newInstance(new Object[]{"楊一",1});
                System.out.println(gbj);
                /*得到獨享的全部成員變量*/
                Field[] fields = aClass.getDeclaredFields();
                for (Field field :fields){
                    String name = field.getName();
                    System.out.println(name);
                }
                return null;
            }
            public static void main(String[] args) throws  Exception{
                Reflections reflections = new Reflections();
                 reflections.copy(new gflection());

            }

}

/**/
class  gflection {

    private  int age;
    private String name;

    /*  第一個構造方法 */
    public gflection(){

    }
    /* 帶參數的構造方法 */
    public gflection(String name,int age){

        this.age = age;
        this.name = name;
    }

    /*get set 方法*/

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

 

 附上測試代碼:code

import javafx.scene.effect.Reflection;

import javax.xml.ws.spi.Invoker;
import java.io.File;
import java.lang.reflect.*;
/**
 * Created by 楊一 on 2017/5/4.
 */


public class Reflections {
   /* *//*   實例 操做   *//*
    public static void main(String[] args ) throws ClassNotFoundException {
        *//*得到字符串服表示的類的 class 對象*//*
        Class<?> aClass= Class.forName("java.lang.String");

        *//*  能夠獲取裏面 的全部方法  *//*
        Method[] methods = aClass.getDeclaredMethods();
        for(Method method : methods){

            System.out.println(method);
        }
    }*/
 /*       *//*普通方法 *//*
        public int add (int a,int b)
        {
            return  a+b;
        }*/
       /*  public static  void main(String[] args ) throws Exception {

             *//*  經過 .class  方法 獲取  該類中的全部對象  *//*
             Class<?> aClass = Reflections.class;
             *//* 生成該類的實例化對象 建立一個新的實例 *//*
             Object reflection = aClass.newInstance();
             *//*  判斷  reflectiong  是不是  Reflections 的實例    返回結果爲true *//*
             System.out.println( reflection instanceof  Reflections );

             *//* 經過這個類的 getmethod 方法獲取到 該類的 add 方法 *//*
             Method add = aClass.getMethod("add",new Class[]{int.class,int.class});
            *//*反射方式 操做獲取到的方法 *//*
            Object result = add.invoke(reflection,new Object[]{1,2});

             System.out.println((Integer)result); //結果為3
         }*/


            /* 完成對 gflection 的拷貝工做 */
            public Object copy (Object object) throws Exception {
                Class<?>  aClass = object.getClass();
                System.out.println(aClass);
                /* 獲取構造方法 */
                Constructor con = aClass.getConstructor(new Class[]{String.class,int.class});
                Object gbj = con.newInstance(new Object[]{"楊一",1});
                System.out.println(gbj);
                /*得到獨享的全部成員變量*/
                Field[] fields = aClass.getDeclaredFields();
                for (Field field :fields){
                    String name = field.getName();
                    System.out.println(name);
                }
                return null;
            }
            public static void main(String[] args) throws  Exception{
                Reflections reflections = new Reflections();
                 reflections.copy(new gflection());

            }

}

/**/
class  gflection {

    private  int age;
    private String name;

    /*  第一個構造方法 */
    public gflection(){

    }
    /* 帶參數的構造方法 */
    public gflection(String name,int age){

        this.age = age;
        this.name = name;
    }

    /*get set 方法*/

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
相關文章
相關標籤/搜索