?
/* *作者:呆萌老師 *?csdn認證講師 *?51cto高級講師 *?騰訊課堂認證講師 *?網易云課堂認證講師 *?華為開發者學堂認證講師 *?愛奇藝千人名師計劃成員 *在這里給大家分享技術、知識和生活 *各種干貨,記得關注哦! *vx:it_daimeng */
反射是框架設計的靈魂
一、什么是反射
JAVA反射機制是在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為java語言的反射機制,
要想解剖一個類,必須先要獲取到該類的位元組碼檔案物件,而解剖使用的就是Class類中的方法.所以先要獲取到每一個位元組碼檔案對應的Class型別的物件.
二、反射的原理
反射就是把java類中的各種成分映射成一個個的Java物件
例如:一個類有:成員變數、方法、構造方法、包等等資訊,利用反射技術可以對一個類進行解剖,把個個組成部分映射成一個個物件,
其實:一個類中這些成員方法、構造方法、在加入類中都有一個類來描述

?編輯
三、反射機制主要提供以下功能:
①在運行時判斷任意一個物件所屬的類;
②在運行時構造任意一個類的物件;
③在運行時判斷任意一個類所具有的成員變數和方法;
④在運行時呼叫任意一個物件的方法;
⑤生成動態代理,
四、Class類
1.獲取Class物件的三種方式
1、Class clazz1 = Class.forName("全限定類名"); //通過Class類中的靜態方法forName,直接獲取到一個類的位元組碼檔案物件,此時該類還是源檔案階段,并沒有變為位元組碼檔案,
2、Class clazz2 = Person.class; //當類被加載成.class檔案時,此時Person類變成了.class,在獲取該位元組碼檔案物件,也就是獲取自己, 該類處于位元組碼階段,
3、Class clazz3 = p.getClass(); //通過類的實體獲取該類的位元組碼檔案物件,該類處于創建物件階段
通過類名獲取Class物件,Class<T> c = Class.forName("類的完全路徑");
通過Class物件獲取具體的類物件:Object o = (Object) c.newInstance();
2、獲取類中的構造方法:

?編輯

?編輯
3、獲取類中的屬性:

?編輯

?編輯
4、獲取類中的方法:

?編輯

?編輯
五、反射的使用
注意:在運行期間,一個類,只有一個Class物件產生,
1.通過反射獲取構造方法并使用

?編輯
2 .通過反射獲取不同的構造方法,
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
//反射用法1
try {
Class clazz1=Class.forName("com.test.pojo.Student");
//根據引數串列獲得指定的建構式
Constructor constructor= clazz1.getDeclaredConstructor(String.class,int.class);
//根據建構式創建物件
Student student=(Student) constructor.newInstance("zhangsan",23);
response.getWriter().println(student.getSname());
//獲得所有的建構式
Constructor[] arr= clazz1.getDeclaredConstructors();
for(Constructor constructor2 : arr)
{
//獲得建構式的引數型別
Class[] brr= constructor2.getParameterTypes();
for(Class clazz2:brr)
response.getWriter().print(clazz2.getName()+",");
response.getWriter().println();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
- 根據反射獲取類中所有的欄位
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
try {
Class clazz=Class.forName("com.test.pojo.Student");
//獲得student類中所有定義的屬性(每個屬性組裝成了一個物件)
Field[] arr=clazz.getDeclaredFields();
for(Field field: arr)
{
response.getWriter().println(Modifier.toString(field.getModifiers())+","+field.getName()+","+field.getType());
}
//根據名稱找到指定的欄位
Field field=clazz.getDeclaredField("sid");
Student student=(Student) clazz.newInstance();
field.setAccessible(true);
field.set(student, 1);
response.getWriter().println(student.getSid());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
4、通過反射獲取方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
Class clazz=Student.class;
Student student=new Student();
try {
//通過反射 獲得指定的方法
Method method= clazz.getDeclaredMethod("test", String.class,int.class);
//呼叫改方法
method.invoke(student, "zhangsan",23);
Method method2=clazz.getDeclaredMethod("test", int.class);
Object o=method2.invoke(student, 25);
System.out.println(o.toString());
} catch (NoSuchMethodException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/502121.html
標籤:其他
下一篇:IOS OpenGL ES GPUImage 差值混合 GPUImageDifferenceBlendFilter
