java的反射機(jī)制

什么是反射?

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

通過反射來了解類

1、類由屬性,方法,構(gòu)造函數(shù)等組成
2、給定一個類或?qū)ο?,通過反射機(jī)制可以動態(tài)的了解類的屬性方法,構(gòu)造函數(shù),創(chuàng)建對象,調(diào)用方法,改寫屬性
3、應(yīng)用場景:(1)運(yùn)行時,動態(tài)的情況下應(yīng)對外面?zhèn)魅氲摹邦惷保瑢ο髮?shí)例等。(2)只知道類名字符串。(3)通常應(yīng)用到框架中 。

常用的反射操作 (以Dog這個類為例子)
package learnReflect;

public class Dog {
    public String name;
    public int age;
    private String owner;
    public  Dog(){
        
    }
    public Dog(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void bark(){
        System.out.println("汪汪");
    }
    public void celebrateBirthday(){
        System.out.println(name+"生日快樂");
        addAge();
    }
    private void addAge(){
        age = age+1;
    }
}

1、通過一個對象獲得完整的包名和類名

public static void getClassFullName(Dog d){
        System.out.println("1.獲取包名和類名");
        Class c = d.getClass();
        System.out.println("類名: "+c.getName());
        System.out.println("包名: "+c.getPackage().getName());
    }

2、獲得Class對象 3種方法

public static void getClassInstance(){
        System.out.println("2.獲得類實(shí)例 - 2種方法");
        try {
            String className = "learnReflect.Dog";
            Class c = Class.forName(className);
            System.out.println("method 1:"+c.getName());
            
            Class d = Dog.class;
            System.out.println("method 2:"+c.getName());
            
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

3、了解類的各種信息

1、獲取本類的聲明方法,調(diào)用類的方法。

public static void getClassMethod(){
Class<Dog> dogClazz = Dog.class;
Method[] methods = dogClazz.getMethods();//能獲取Dog類所有的public方法,不能獲取private
Method[] methods2 = dogClazz.getDeclaredMethods();//只能獲取Dog類自己定義的所有方法包括私有方法
for(Method m : methods)
System.out.println(m.getName());
try {
//"bark"是方法名,不存在時會拋出異常,new Class[]{}是參數(shù)類型數(shù)組,無參數(shù)就為空
Method method = dogClazz.getMethod("bark", new Class[]{});
//invoke方法用于調(diào)用方法,參數(shù)為類的實(shí)例和方法的參數(shù)
method.invoke(dogClazz.newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}

>2、獲得父類信息
>```
public static void getClassSuperClassInfo(){
        Class<Dog> dogClazz = Dog.class;
        System.out.println("Dog父類的名字是:"+dogClazz.getSuperclass());
    }

3、獲得接口信息

public static void getClassInterfaceInfo(){
Class<Dog> dogClazz = Dog.class;
for(int i = 0; i< dogClazz.getInterfaces().length;i++)
System.out.println(dogClazz.getInterfaces()[i].getName());
}

    
4、根據(jù)Class對象創(chuàng)建instance實(shí)例 

public static void getInstance(){
System.out.println("創(chuàng)建對象實(shí)例======");
Class<Dog> dogClazz = Dog.class;
try {//方法1:無參的構(gòu)造方法
Object o = dogClazz.newInstance();
System.out.println("創(chuàng)建的對象是:"+o);
//方法2:有參數(shù)的構(gòu)造方法
Constructor c = dogClazz.getConstructor(new Class[]{String.class,int.class});
Dog o2 = (Dog) c.newInstance("大黃",4);
System.out.println("創(chuàng)建的對象是:"+o2.name);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}

5、操作成員變量

public static void changeFiled(){
System.out.println("改變成員變量======");
Class<Dog> dogClazz = Dog.class;
try {
Object o = dogClazz.newInstance();
//方法2
Constructor c = dogClazz.getConstructor(new Class[]{String.class,int.class});
Dog o2 = (Dog) c.newInstance("大黃",4);
Field[] fields = dogClazz.getFields();
for(Field f : fields){
System.out.println(f.getName());
}
Field[] fields2 = dogClazz.getDeclaredFields();
for(Field f : fields2){
System.out.println(f.getName());
}
Field f = dogClazz.getField("name");
f.set(o2, "大黑");
System.out.println(f.get(o2));
// getDeclaredField()用于獲取私有成員變量,必須設(shè)置setAccessible(true)才能改變
Field f2 = dogClazz.getDeclaredField("owner");
f2.setAccessible(true);
f2.set(o2, "張三");
System.out.println(f2.get(o2));
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

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

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

  • 學(xué)習(xí)Android的同學(xué)注意了?。?!學(xué)習(xí)過程中遇到什么問題或者想獲取學(xué)習(xí)資源的話,歡迎加入Android學(xué)習(xí)交流群...
    kingZXY2009閱讀 355評論 0 0
  • 反射機(jī)制的功能 Java反射機(jī)制主要提供了以下功能:在運(yùn)行時判斷任意一個對象所屬的類;在運(yùn)行時構(gòu)造任意一個類的對象...
    Anderson大碼渣閱讀 2,965評論 1 43
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評論 19 139
  • Using Java ReflectionBy Glen McCluskey January 1998 Refle...
    轉(zhuǎn)工閱讀 1,284評論 0 2
  • 待到下次列車駛向重逢 再見的那座城市的天空 依然有笑有夢 手機(jī)存留的那些披頭散發(fā)的照片 猶如和煦的微風(fēng)吹漾起的漪 ...
    渡仔喬閱讀 201評論 0 0

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