本文主要從以下幾個(gè)方面對(duì)java反射機(jī)制進(jìn)行總結(jié):
1. 反射的概念
2.反射的作用
3.反射主要類(lèi)說(shuō)明
4.反射實(shí)例
反射的概念
java反射機(jī)制是在運(yùn)行狀態(tài)中,能夠知道任意類(lèi)下的所有方法和屬性,能夠調(diào)用任意對(duì)象的方法和屬性。這種能動(dòng)態(tài)獲取方法和屬性并調(diào)用的機(jī)制稱反射機(jī)制。
反射的作用
在日常開(kāi)發(fā)中,有時(shí)需要獲取并調(diào)用第三方平臺(tái)的某個(gè)方法或?qū)傩?。而這些方法和屬性往往只對(duì)系統(tǒng)應(yīng)用或某些類(lèi)開(kāi)放,這時(shí)需要使用反射技術(shù)來(lái)解決。當(dāng)然不是所有對(duì)象都能反射成功,比如被反射對(duì)象做了訪問(wèn)權(quán)限校驗(yàn)。
反射主要類(lèi)
Class類(lèi)
getDeclaredMethods() 獲取類(lèi)的所有公有和私有方法
getMethod(String name, 類(lèi)<?>... parameterTypes) 根據(jù)給定參數(shù)類(lèi)型去匹配獲取類(lèi)的某個(gè)公有方法
getMethods() 獲取類(lèi)的所有公有方法
getEnclosingMethod() 獲取定義該類(lèi)的公有方法
getDeclaredMethod(Stringname, 類(lèi)<?>... parameterTypes)根據(jù)給定參數(shù)類(lèi)型去匹配獲取類(lèi)的某個(gè)公有或私有方法
getConstructor(類(lèi)<?>... parameterTypes) 根據(jù)給定參數(shù)類(lèi)型去匹配獲取類(lèi)的某個(gè)公有構(gòu)造方法
getConstructors() 獲取類(lèi)的所有公有構(gòu)造方法
getDeclaredConstructor(類(lèi)<?>... parameterTypes) 根據(jù)給定參數(shù)類(lèi)型去匹配獲取類(lèi)的某個(gè)公有或私有構(gòu)造方法
getDeclaredConstructors() 根據(jù)獲取類(lèi)的全部公有或私有構(gòu)造方法
getEnclosingConstructor() 獲取定義該類(lèi)的公有構(gòu)造方法
getDeclaredField(String name) 獲取指定名稱的公有或私有屬性;
getDeclaredFields() 獲取所有屬性
getField(String name) 獲取指定名稱的公有屬性
getFields() 獲取所有公有屬性
Constructor類(lèi)
newInstance(Object... initargs) 根究指定的參數(shù)找到對(duì)應(yīng)的構(gòu)造函數(shù)并實(shí)例出對(duì)象
Field類(lèi)
getName() 返回由此 Field對(duì)象表示的字段的名稱
set(Object obj, Object value) 將指定對(duì)象參數(shù)上的此 Field對(duì)象表示的字段設(shè)置為指定的新值。
get(Object obj) obj表示某個(gè)對(duì)象,返回指定對(duì)象的此Field的值
Method類(lèi)
invoke(Object obj, Object... args) 。obj表示被調(diào)用方法的某個(gè)對(duì)象,args表示調(diào)用此方法需要的參數(shù)。調(diào)用某個(gè)對(duì)象的Method對(duì)象所表示的方法。
反射實(shí)例
被反射的類(lèi)
public class Book{
private final static StringTAG ="BookTag";
private Stringname;
private Stringauthor;
public Objectb;
@Override
public String toString() {
return "Book{" +"name='" +name +'\'' +", author='" +author +'\'' +'}';
}
public Book(){ }
public Book(String name, String author) {
this.name = name;
this.author = author;
class a{
String c;
String d;
public a(){}
public a(String a, String b){
c = a;
d = b;
}
@Override
public StringtoString() {
return c +"----" +d;
}
}
b =new a();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public StringgetAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
private String declaredMethod(String index) {
String string =null;
switch (index) {
case "0":
string ="I am declaredMethod 1 !";
break;
case "1":
string ="I am declaredMethod 2 !";
break;
default:
string ="I am declaredMethod 1 !";
}
return string;
}
}
反射類(lèi)
public class ReflexClass {
private final static StringTAG ="peter.log.ReflectClass";
// 創(chuàng)建對(duì)象
public static void reflectNewInstance() {
try {
Class classBook = Class.forName("com.reflex.Book");//初始化類(lèi)對(duì)象
Object objectBook = classBook.newInstance();//創(chuàng)建一個(gè)實(shí)例
Book book = (Book) objectBook;
book.setName("Android進(jìn)階之光");
book.setAuthor("劉望舒");
System.out.println(book.toString());
}catch (Exception ex) {
ex.printStackTrace();
}
}
public static void main(String[] a){
ReflexClass.reflectEnclosingConstructor();
// ReflexClass.reflectPrivateField();
}
// 反射私有的構(gòu)造方法
public static void reflectPrivateConstructor() {
try {
Class classBook = Class.forName("com.reflex.Book");
//獲取一個(gè)參數(shù)個(gè)數(shù)為2,參數(shù)類(lèi)型均為String類(lèi)型的構(gòu)造函數(shù)
Constructor declaredConstructorBook = classBook.getDeclaredConstructor(String.class,String.class);
declaredConstructorBook.setAccessible(true);//TRUE表示禁止java語(yǔ)言訪問(wèn)器檢查訪問(wèn)
//使用構(gòu)造函數(shù)對(duì)象生成實(shí)例
Object objectBook = declaredConstructorBook.newInstance("Android進(jìn)階之光","test");
Book book = (Book) objectBook;
System.out.println(book.toString());
}catch (Exception ex) {
ex.printStackTrace();
}
}
// 反射定義內(nèi)部類(lèi)的構(gòu)造方法
public static void reflectEnclosingConstructor() {
try {
Class classBook = Class.forName("com.reflex.Book");
Class cls = ((Book)classBook.getDeclaredConstructor(String.class,String.class)
.newInstance("Android進(jìn)階之光","test")).b.getClass();
//獲取一個(gè)參數(shù)個(gè)數(shù)為2,參數(shù)類(lèi)型均為String類(lèi)型的構(gòu)造函數(shù)
Constructor declaredConstructorBook = cls.getEnclosingConstructor();
declaredConstructorBook.setAccessible(true);//TRUE表示禁止java語(yǔ)言訪問(wèn)器檢查訪問(wèn)
//使用構(gòu)造函數(shù)對(duì)象生成實(shí)例
Object objectBook = declaredConstructorBook.newInstance("Android進(jìn)階之光","test1");
Book book = (Book) objectBook;
System.out.println(book.toString());
}catch (Exception ex) {
ex.printStackTrace();
}
}
// 反射私有屬性
public static void reflectPrivateField() {
try {
Class classBook = Class.forName("com.reflex.Book");
Object objectBook = classBook.newInstance();
Field fieldTag = classBook.getDeclaredField("TAG");//獲取指定名稱的屬性
fieldTag.setAccessible(true);
String tag = (String) fieldTag.get(objectBook);//獲取一個(gè)指定實(shí)例的屬性
System.out.println(fieldTag.getModifiers());
}catch (Exception ex) {
ex.printStackTrace();
}
}
// 反射私有方法
public static void reflectPrivateMethod() {
try {
Class classBook = Class.forName("com.reflex.Book");
//根據(jù)方法名和方法參數(shù)的類(lèi)名生成方法對(duì)象
Method methodBook = classBook.getDeclaredMethod("declaredMethod",String.class);
methodBook.setAccessible(true);
Object objectBook = classBook.newInstance();//生成一個(gè)對(duì)象
String string = (String) methodBook.invoke(objectBook,"0");//根據(jù)實(shí)例和參數(shù)調(diào)用方法獲取返回值
System.out.println(string);
}catch (Exception ex) {
ex.printStackTrace();
}
}
}