java反射掃盲筆記

一,Class:包裝java程序中各個java類的一個類。它描述了一個類的名稱,類的訪問屬性,字段名稱列表,方法名稱列表等等。

二,獲取一個類Class類實例(字節碼文件)

Person p = new Person();

1.      Person.class

2.      P.getClass();

3.       Class.forName(“Person類的完整路徑”);-------à常用方法

三,反射的概念:

反射就是把java類中的各種成分映射成相應的java

四,九個預定義Class對象實例:

有九種預定義的 Class 對象,表示八個基本類型和 void。這些類對象由 Java 虛擬機創建,與其表示的基本類型同名,即 booleanbytecharshortintlongfloatdouble

五,反射獲取類的構造方法及應用(Constructor<T>的常用方法):

1.獲取類的構造方法:

getConstructors()
返回一個包含某些Constructor 對象的數組,這些對象反映此Class 對象所表示的類的所有公共構造方法。

getConstructor(Class<?>... parameterTypes)
返回指定參數一個 Constructor 對象

getDeclaredConstructor(Class<?>... parameterTypes)
返回一個 Constructor 對象,該對象反映此 Class 對象所表示的類或接口的指定構造方法。

getDeclaredConstructors()
 返回 Constructor 對象的一個數組,這些對象反映此 Class 對象表示的類聲明的所有構造方法。

注意:getConstructors()獲得某個類的所有的公共(public)的構造函數,包括父類。

getDeclaredConstructors()獲得某個類的所有申明的構造函數,即包括publicprivateproteced,以下同理

 

         2.應用(Constructor<T>的常用方法):

newInstance(Object... initargs) (主要使用方法)
使用此 Constructor 對象表示的構造方法來創建該構造方法的聲明類的新實例,並          用指定的初始化參數初始化該實例。

getAnnotation(Class<T> annotationClass)
如果存在該元素的指定類型的註釋,則返回這些註釋,否則返回 null。

getDeclaredAnnotations()
返回直接存在於此元素上的所有註釋。

getModifiers()
 以整數形式返回此Constructor 對象所表示構造方法的 Java 語言修飾符。

getName()
  以字符串形式返回此構造方法的名稱。

六,反射獲取類的成員變量及應用:

1.獲取類的構造方法:

getField(String name)
 返回一個Field 對象,它反映此Class 對象所表示的類或接口的指定公共成員字段。

getFields()
返回一個包含某些Field 對象的數組,這些對象反映此Class 對象所表示的類或接口的所有可訪問(私有的不可訪問)公共字段。

getDeclaredField(String name)
 返回一個Field 對象,該對象反映此Class 對象所表示的類或接口的指定已聲明字段。

 

getDeclaredFields()
 返回Field 對象的一個數組,這些對象反映此Class 對象所表示的類或接口所聲明的所有字段。

         2.應用(Field的常用方法):

get(Object obj)
返回指定對象上此Field 表示的字段的值。

        

getAnnotation(Class<T> annotationClass)
 如果存在該元素的指定類型的註釋,則返回這些註釋,否則返回 null。

getName()
 返回此Field 對象表示的字段的名稱。

getType()
返回一個Class 對象,它標識了此Field 對象所表示字段的聲明類型。

set(Object obj, Object value)
 將指定對象變量上此Field 對象表示的字段設置爲指定的新值

示例代碼

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

public class Test6 {

	public static void main(String[] args) {
		
		try {
			
			Demo d = new Demo();
			
			Field[] fields = d.getClass().getDeclaredFields();
			for(Field f : fields){
				if(f.getType() == String.class){
					String str = (String) f.get(d);
					
					//對一個私有屬性的成員變量打印會報錯
					if(f.getModifiers() == Modifier.PUBLIC){
						System.out.println(str);
					}
				
					String newStr = str.replace("i", "s");
					f.set(d, newStr);
					
					System.out.println(d.getStr());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

class Demo{
	public String str = "xiaosu";
	public String str1 = "houhuiyao";

	public String getStr() {
		return str;
	}
}


七,反射獲取類的成員方法及應用:

1.      獲取類的成員方法:

getMethod(String name, Class<?>... parameterTypes)
 返回一個Method 對象,它反映此Class 對象所表示的類或接口的指定公共成員方法。

getMethods()
 返回一個包含某些Method 對象的數組,這些對象反映此Class 對象所表示的類或接口(包括那些由該類或接口聲明的以及從超類和超接口繼承的那些的類或接口)的公共member 方法。

getDeclaredMethods()
 返回 Method 對象的一個數組,這些對象反映此 Class 對象表示的類或接口聲明的所有方法,包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法

getDeclaredMethod(String name, Class<?>... parameterTypes)
返回一個Method 對象,該對象反映此Class 對象所表示的類或接口的指定已聲明方法。

2.      應用(Method的常用方法):

invoke(Object obj, Object... args) (主要使用方法)(如果函數調用不需要參數,則參數不許寫)
對帶有指定參數的指定對象調用由此Method 對象表示的底層方法

 

getName()
 以 String 形式返回此 Method 對象表示的方法名稱

getAnnotation(Class<T> annotationClass)
 如果存在該元素的指定類型的註釋,則返回這些註釋,否則返回 null。

示例代碼

 

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

public class Test7 {

	public static void main(String[] args) {
		Demo0 d0 = new Demo0();
		try {
			Method[] methods = d0.getClass().getDeclaredMethods();
			for(Method m : methods){
				if(m.getModifiers() == Modifier.PUBLIC){
					
					Class<?>[] types = m.getParameterTypes();
					if(types.length<1){
						//如果函數調用不需要參數,則參數不許寫
						m.invoke(d0);
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
 class Demo0{
	 public void show(){
		 System.out.println("hello");
	 }
 }

八,對接收數組參數的成員方法進行反射並調用:

示例代碼

import java.lang.reflect.Method;

public class Test5 {

	/**
	 * 數組傳遞,利用反射調用一個類的main方法
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			Method main = Demo1.class.getMethod("main", String[].class);
			//將數組強轉成Object進行傳遞
			main.invoke(null,(Object) new String[]{"0","1","2"});
			//在數組外再包裹一層數組進行傳遞
			main.invoke(null,new Object[]{new String[]{"0","1","2"}});
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

class Demo1{
	public static void main(String[] args) {
		for(String str : args){
			System.out.println(str);
		}
		
	}
}


九,數組的反射:

1.獲取數組的類型

getComponentType()
 返回表示數組組件類型的 Class

2.通過Array操作數組:

set(Object array, int index, Object value)
 將指定數組對象中索引組件的值設置爲指定的新值。

get(Object array, int index)
返回指定數組對象中索引組件的值。

newInstance(Class<?> componentType,int length)
創建一個具有指定的組件類型和長度的新數組。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章