java 通過反射獲取調用類方法及屬性


首先說下反射是什么?反射是Sun公司推出的一組API,此組API位於Java.lang.reflect中

反射的作用是編寫工具(例如eclipse),編寫框架,當然對於一般的程序,我們不可能用反射來做這些事,一般反射大多是用於在構建類的實例以及調用類方法及屬性。

ok! 了解了反射是什么以及反射的應用領域,那么就來看看Java中是怎么實現反射的吧

 

 

 Student類

public class Student {
    public String name;
    public String gender;
    public int age;
    
    public Student(){
        
    }

}

使用反射獲取類的實例

public class Test {
    public static void main(String[] args)throws ReflectiveOperationException {
        //通過三種方式獲取類的類對象
        Class<?> c=Student.class;
        Class<?> c1=new Student().getClass();
        Class<?> c2=Class.forName("Student");//通過包名.類名獲取類對象(因為該類在default包,所以可以不寫包名)
        //通過類對象來構建student實例,效果和new  Student()一樣,要求Student中必須要有無參的構造函數
        Student s=(Student) c.newInstance();
        Student s1=(Student) c1.newInstance();
        Student s2=(Student) c2.newInstance();
        
        
        s.age=1;
        s1.age=2;
        s2.age=3;
        
        
        System.out.println(s.age);
        System.out.println(s1.age);
        System.out.println(s2.age);
    }

可以看到,正確的輸出了1,2,3

 

 

 

通過反射獲取類的屬性及方法,動態執行

 

Student類型

public class Student {
    public String name;
    private int age;//該屬性為私有,可以通過反射獲取得到
    
    public Student(){
        
    }
    
    public int add(int a,int b){
        return a+b;
    }
    
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "name="+name+"\nage="+age;
    }

}

 

動態的給類的屬性賦值和調用類的方法

public class Test {
    public static void main(String[] args)throws ReflectiveOperationException {
        //獲取類對象
        Class<?> c=Class.forName("Student");
        
        //獲取類的屬性對象,需要填寫屬性對象的名稱
        Field f1=c.getField("name");//只能獲取public的對象
        Field f2=c.getDeclaredField("age");//可以獲取到private的對象,這很吊吧
        
        
        f2.setAccessible(true);//如果屬性是私有的,那么就需要設置可訪問
        Student s1=(Student) c.newInstance();
        //為屬性對象賦值
        f1.set(s1, "張三");
        f2.set(s1, 22);
        
        System.out.println(s1.toString());
        
        //通過類對象獲取類的方法
        Method m1=c.getMethod("add", int.class,int.class);
        
        //動態的執行方法
        int sum=(int) m1.invoke(s1, 1,2);
        System.out.println(sum);
                
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM