1. 程式人生 > >JAVA 學習筆記 - 反射機制

JAVA 學習筆記 - 反射機制

-s .html upload 通過 tostring for catch span pack

1. JAVA反射機制的概念

技術分享

2. 怎樣實例化一個 Class對象

Class.forName(包名.類名);

對象.getClass();

類.class;

============================代碼===================================

package org.liys.getclass;
class Y{

};

public class GetClass02{



public static void main(String args[]){

Class<?> c1 = null;
Class<?> c2 = null;
Class<?> c3 = null;

//日常開發中常用的一種實例化形式
try{
c1 = Class.forName("org.liys.getclass.Y");
}catch(ClassNotFoundException e){}

c2 = new Y().getClass(); //通過object類中的方法實例化
c3 = Y.class; //通過類.class實例化
System.out.println(c1.getName());
System.out.println(c2.getName());
System.out.println(c3.getName());
}

}

3.Class類的使用

用Class類的newInstance來替代掉一般的new操作。

不過需要保證的是,類的申明中,需要有無參構造函數。

.....

Class<?> c = null;

c = Class.forName(包名.類名);

類的實例化對象 = (類) c.newInstatnce(); (object 向下轉型)

對象.setName(), 對象.setage();

......

很少會用帶有有參構造函數的類來做實例化,但如果有的話,可以用Constructor來解決。

使用getConstructors來獲取該類所有的構造函數 cons[],並用下標來調用cons[0],cons[1]。

===========================代碼=============================

package org.liys.newinstance;
import java.lang.reflect.Constructor;
class Person{

private String name;
private int age;

public Person(String name,int age){
this.name = name;
this.age = age;

}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}

public String toString(){
return "姓名: " + this.name + " 年齡: "+ this.age;
}
}

public class GetPerson{

public static void main(String args[]){

Class<?> c = null;

try{
c = Class.forName("org.liys.newinstance.Person");
} catch(ClassNotFoundException e){
e.printStackTrace();
}
Person p = null;
Constructor<?> cons[] = null;
cons = c.getConstructors();
try{
p = (Person) cons[0].newInstance("李柯",30);
}catch(Exception e){
e.printStackTrace();
}
//p.setName("李柯");
//p.setAge(30);
System.out.println(p);


}


}

4.取得類(.class)的結構

最重要是獲取類的對象, Class<?> c1 = Class.forName(報名.類名);

a. 獲取類的父類 從java doc中查詢 Class中獲取父類的方法

Class<?> c2 = c1.getSuperclass(); .....c2.getName();

技術分享

b.獲取該類中所有的方法,包括方法的參數,拋出異常,返回值等

通過Class中的getMethods()方法獲得所有的方法包括從父類繼承的方法

或者通過Class中的getDeclaredMethods() 方法,只是獲得該類中定義的方法。

然後再根據Method類去查如何獲得函數的參數,返回值,權限範圍,拋出異常等

技術分享

代碼=========================================================================

package org.lxh.demo15;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class GetMethodDemo {
public static void main(String args[]){

Class<?> c1 = null;
try{
c1 = Class.forName("org.lxh.demo15.Person"); //獲取類對象
}catch(ClassNotFoundException e){
e.printStackTrace();
}

Method[] m = c1.getMethods(); //獲取類中所有的方法
String mod = null;
String parm = "";
String Except = "";
for(int i=0; i<m.length;i++){
parm = "";
Except = "";
mod = Modifier.toString(m[i].getModifiers()); //獲取方法的權限訪問範圍

Class<?> rettype = m[i].getReturnType(); //獲取方法的返回值

Class<?>[] p = m[i].getParameterTypes(); //獲取方法中的參數
for(int j= 0;j<p.length;j++){

parm = parm + p[j].getName() +" arg["+j+"]";
if (j < (p.length -1)){
parm = parm + ",";
}

}


Class<?>[] Ex = m[i].getExceptionTypes(); //獲取方法拋出的異常,一是Class類型
if (Ex.length > 0){
Except = " throws ";
for(int j= 0;j<Ex.length;j++){

Except = Except + Ex[j].getName() ;
if (j < (Ex.length -1)){
Except = Except + ",";
}

}
}

System.out.println(mod + " " +rettype+" "+ m[i].getName() +"("+parm+")" +" "+Except);

}

}

}

c.獲取實現的接口類

........

Class<?> c[] = c1.getInterfaces() ; // 以數組形式返回實現的全部接口
for(int i=0;i<c.length;i++){
System.out.println("實現的接口名稱:" + c[i].getName()) ; // 輸出接口名稱
}

........

d.獲取類的屬性

Field f[] = c1.getDeclaredFields() ; // 取得本類中的屬性

Field f[] = c1.getFields() ; // 取得本類中的公共屬性包括繼承自父類或實現的接口類中的

.......

Field f[] = c1.getFields() ; // 取得本類中的公共屬性
for(int i=0;i<f.length;i++){
Class<?> r = f[i].getType() ; // 得到屬性類型
int mo = f[i].getModifiers() ; // 得到修飾符的數字
String priv = Modifier.toString(mo) ; // 還原修飾符

System.out.print(priv + " ") ;
System.out.print(r.getName() + " ") ; // 得到屬性類型
System.out.print(f[i].getName()) ; // 輸出屬性名稱
System.out.println(" ;") ;

}

..........

e.獲取類的所有構造方法

Constructor<?> con[] = c1.getConstructors() ;

之後與Method相同,查找Constructor 的參數,訪問權限範圍。

JAVA 學習筆記 - 反射機制