Java 反射的總結

什麼是Java 反射(reflect)

Java反射是Java被視爲動態(或準動態)語言的一個關鍵性質。這個機制允許程序在運行時透過Reflection API取得任何一個已知名稱的class的內部信息,包括其modifiers(諸如public, static 等)、superclass(例如Object)、實現之interfaces(例如Cloneable),也包括fields和methods的所有信息,並可於運行時改變fields內容或喚起methods。

Java反射機制允許程序在運行時加載、探知、使用編譯期間完全未知的classes。

換言之,Java可以加載一個運行時才得知名稱的class,獲得其完整結構


如果實現類的Reflect 呢?

通過類的Class 對象。 運行時類想引入其他類對象 這時就要使用類的Class對象。如何獲取類的Class對象呢? 有四種方法,常用的三種

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
/**
 * @param args
 */
public static void main(String[] args) {
Class c;
try {
// 獲取類的Class對象有三種方式 其實也就是獲取Reflect
// 第一種方式 使用靜態方法 forName
c = Class.forName("User");
// 第二種方法
// c = User.class;
 //第三種方法
// User user = new User();
// c = user.getClass();
Object obj = c.newInstance();
Method m1=c.getMethod("say");//找到名字叫做say、且無參的方法
        Method m2=c.getMethod("say",String.class);//找到名字叫做say、且有一個String類型參數的方法
        Method m3=c.getMethod("setName",String.class);
        Method m4=c.getMethod("getName");
        m3.invoke(obj, "zlm");
        m4.invoke(obj);
        m1.invoke(obj);//注意newInstance()調用的是無參的構造方法!!!
        
        m2.invoke(c.getConstructor(String.class).newInstance("zlm"),"哈哈");//通過有參的構造方法實例化一個對象
        
        System.out.println("-----------------------------------獲取Reflect屬性-------------------------");
       // c.getField("name");
        Object object = c.newInstance(); // 這是本例的事例對象
        c.getField("pas").set(object, "zlmwin");
      Field field =  c.getDeclaredField("name");
      field.setAccessible(true);
      field.set(object, "win0701");
        System.out.println(field.get(object));
        System.out.println(c.getField("pas"));
        System.out.println(c.getField("pas").get(object));
        Field[] field1 = c.getFields();
        for(Field fi:field1){
        System.out.println("============fi========>" + fi);
        }
        
        Field[] field2 = c.getDeclaredFields();
        for(Field fe:field2){
        System.out.println("-=-=-=-=-=-=fe-=-=-=-=-=<>" + fe);
        System.out.println("-------------------賦值開始----------------" + fe.toString().trim().startsWith("public", 0));
        if(fe.toString().startsWith("public", 0)){
        System.out.println("99999999999999");
        fe.set(object, "public");
        System.out.println(fe.get(object));
        }else{
        
        fe.setAccessible(true);
        fe.set(object, "private");
        System.out.println(fe.get(object));
        }
        System.out.println("-------------------賦值結束----------------");
        System.out.println("==================================Field測試結束====================");
        System.out.println("==================================方法 test start====================");
//        //Method me = c.getMethod("info");
//        //Method me = c.getMethod("login", String.class);
//        Method me = c.getDeclaredMethod("login", String.class);
//        me.setAccessible(true);
//        me.invoke(object, "小丁");
//        System.out.println("-----------------------------");
//        Method[] me1 = c.getMethods();
//        for(Method mh:me1){
//        System.out.println("---???--->" + mh + "----" + mh.hashCode());
//        
//        }
//        Method method = c.getMethod("getName");
//        method.invoke(object);
        
        }
        System.out.println("----------------構造方法----------------------");
        Constructor con = c.getConstructor(String.class);
        c.newInstance();
        User user= (User)con.newInstance("小丁丁");
        user.say();
        user.say("liming");
        System.out.println("ppppppp......" + con);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//通過反射找到對應的類
}
}

User 類

class User
{
    private String name;
    public String pas;
    
    public static String id;
    
    public void setName(String name){
    
    this.name = name;
    System.out.println("-----------"+this.name);
    }
    public String getName(){
    System.out.println("---+--------"+this.name);
    return this.name;
    }
    public User(){ 
    System.out.println("無參構造方法");
    }
    public User(String name)
    {
        System.out.println("----------------============" + name);
    this.name=name;
    }
    public void say()//無參的方法
    {
        System.out.println("大家好,我叫"+this.name+"!");
    }
    public void say(String str)//有參的方法
    {
        System.out.println("大家好,我叫"+name+"!"+str+",我是有參的方法!");
    }
    
    @SuppressWarnings("unused")
private void login(String name){
    this.name = name;
    System.out.println("私有方法---------------->" + name);
    }
    
    public static void info(){
    System.out.println("靜態方法");
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章