Java反射機制

1、JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制。(見百度百科)

2、主要功能:Java反射機制主要提供了以下功能: 在運行時判斷任意一個對象所屬的類;在運行時構(gòu)造任意一個類的對象;在運行時判斷任意一個類所具有的成員變量和方法;在運行時調(diào)用任意一個對象的方法;生成動態(tài)代理。

1、通過類名,獲取類具有的方法和屬性

首先,定義一個類用于后面的操作
    package ObjectDemo;

    public class Coordinate {

    private float x;
    private float y;
    private float z;

    public float threshold=0.001f;      //闕值

    public float getX() {
        return x;
    }

    public void setX(float x) {
        this.x = x;
    }

    public float getZ() {
        return z;
    }

    public void setZ(float z) {
        this.z = z;
    }

    public float getY() {
        return y;
    }

    public void setY(float y) {
        this.y = y;
    }

    //無參構(gòu)造函數(shù)
    public Coordinate()
    {
        this.x = 0;
        this.y = 0;
        this.z = 0;
    }

    public Coordinate(float x,float y,float z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    //判斷兩個坐標是否相等
    private boolean isEqual(Coordinate other)
    {
        if(Math.abs(other.getX()-this.getX())>threshold)return false;
        if(Math.abs(other.getY()-this.getY())>threshold)return false;
        if(Math.abs(other.getZ()-this.getZ())>threshold)return false;
        return true;
    }

    //輸出屬性
    public void showThings()
    {
        System.out.println("X:"+x+" Y:"+y+" Z:"+z);
    }

    public void showThings(String name)
    {
        System.out.println(name+" X:"+x+" Y:"+y+" Z:"+z);
    }

    }
獲取類的信息
    package ReflectDemo2;

    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;
    import java.lang.reflect.Parameter;

    public class ClassDetail {

    private Class aClass;

    public ClassDetail(String className)
    {
        try {
            aClass = Class.forName(className);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //獲得方法的詳細信息
    public void getMethodsDetail()
    {
        Method methods[]=aClass.getDeclaredMethods();
        for(Method method:methods)
        {
            //這里就可以利用Method類里的眾多的get方法獲得它的信息了
            System.out.print(Modifier.toString(method.getModifiers()));
            System.out.print(" " + method.getReturnType());
            System.out.print(" " + method.getName()+'(');
            Parameter parameters[] = method.getParameters();
            int length = parameters.length;
            if(length>0)
            {
                for (int i = 0; i < length - 1; ++i) {
                    System.out.print(parameters[i].getType() + " " + parameters[i].getName() + ",");
                }
                System.out.print(parameters[length - 1].getType() + " " + parameters[length - 1].getName());
            }
            System.out.print(")" + '\n');
        }
    }

    //獲得屬性的詳細方法
    public void getFieldDetail()
    {
        //getDeclaredFields獲得所有的屬性,getFields獲得非私有的
        Field fields[] = aClass.getDeclaredFields();
        for(Field field:fields)
        {
            System.out.println(Modifier.toString(field.getModifiers())+" "+field.getType()+" "+field.getName());
        }
    }
    }
調(diào)用
    public class RfMain {

    public static void main(String[] args) {

        ClassDetail detail = new ClassDetail("ObjectDemo.Coordinate");
        detail.getMethodsDetail();
        detail.getFieldDetail();
    }
    }

輸出結(jié)果

private boolean isEqual(class ObjectDemo.Coordinate arg0)
public float getX()
public void setX(float arg0)
public float getY()
public void setY(float arg0)
public float getZ()
public void setZ(float arg0)
private float x
private float y
private float z
public float threshold

2、利用反射機制構(gòu)造類對象,調(diào)用類的方法

無參數(shù)構(gòu)造,無參數(shù)方法的調(diào)用
    public static void main(String[] args) { 
        try {
            Class cls = Class.forName("ObjectDemo.Coordinate");
            Object object = cls.newInstance();
            Method method = cls.getMethod("showThings");
            method.invoke(object);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

結(jié)果:

X:0.0 Y:0.0 Z:0.0

有參數(shù)構(gòu)造,無參數(shù)方法的調(diào)用
    public static void main(String[] args) {
        try {
            Class cls = Class.forName("ObjectDemo.Coordinate");
            Constructor cons = cls.getConstructor(float.class,float.class,float.class);
            Object object = cons.newInstance(2,3,4);

            Method method = cls.getMethod("showThings");
            method.invoke(object);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

結(jié)果:

X:2.0 Y:3.0 Z:4.0

無參數(shù)構(gòu)造,有參數(shù)方法的調(diào)用
    public static void main(String[] args) {
        try {
            Class cls = Class.forName("ObjectDemo.Coordinate");
            Object object = cls.newInstance();
            Method method = cls.getMethod("showThings",String.class);
            method.invoke(object, "Quincy say:");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

結(jié)果:

Quincy say: X:0.0 Y:0.0 Z:0.0

反射就學習到這里了,那它到底有什么用呢?呵呵?。。‖F(xiàn)在我們就來說一個它的應(yīng)用吧,例如數(shù)據(jù)庫操作,我們定義了一些和數(shù)據(jù)庫的表結(jié)構(gòu)相同的類,我們就可以利用反射機制生成sql語句,而且只要寫一次,是不是很方便?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 首發(fā)于公眾號:專業(yè)電影評論 專業(yè)影評 @TOC java反射機制的應(yīng)用器 開發(fā)的時候有時候會碰到這樣的情況,...
    專業(yè)電影評論閱讀 385評論 0 1
  • Java反射機制 概念 Java 反射機制在程序運行時,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意...
    一昂Jone閱讀 139評論 0 0
  • JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的...
    易點梅閱讀 199評論 0 0
  • API: java.lang.reflect.Constructor[https://docs.oracle.co...
    Thomas_Vader閱讀 1,702評論 0 4
  • 一、概述 Java反射機制定義 Java反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類中的所有屬性和方法...
    CoderZS閱讀 1,699評論 0 25

友情鏈接更多精彩內(nèi)容