亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

java反射

2019-11-06 07:03:11
字體:
來源:轉載
供稿:網友

今天我們來看一下java反射機制。 反射機制是在運行狀態中,對于任意一個類,都能夠中的這個類的所有屬性和方法,對于任意一個對象,都能夠調用他的任意一個方法和屬性 這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。 在運行時生成任意一個對象所屬的類 在運行時構造任意一個類的對象 在運行時判斷任意一個類所具有的成員變量和方法 在運行時調用任意一個對象的方法 生成動態代理 一.關于反射,主要涉及的api主要有 java.lang.Class java.lang.reflect.Method java.lang.reflect.Field java.lang.reflect.Constructor 接下來我們看一下這些api的使用

package wangcc.testapi;public class User { PRivate String name; private int age; public User() { } public User(String name) { this.name = name; } public User(String name, int age) { this.name = name; this.age = age; } public void printName(String name) { System.out.println(name); } public void print() { System.out.println("Name:" + getName() + "Age:" + getAge()); } @Override public String toString() { return "User [name=" + name + ", age=" + age + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }}package wangcc.testapi;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.lang.reflect.Modifier;public class TestReflect { public static void main(String[] args) throws Exception { User user = new User(); Class<?> clazz = user.getClass(); Constructor<?> cons[] = clazz.getConstructors(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < cons.length; i++) { sb.append("cons[").append(i).append("]("); Class<?> clazzs[] = cons[i].getParameterTypes(); for (int k = 0; k < clazzs.length; k++) { if (k == clazzs.length - 1) { sb.append(clazzs[k].getName()).append(")"); } else { sb.append(clazzs[k].getName()).append(","); } } } System.out.println(sb.toString()); User user2 = (User) cons[0].newInstance("kobe", 39); System.out.println(user2.toString()); User user3 = (User) cons[1].newInstance("kobe"); System.out.println(user3.toString()); // 獲得類的全部屬性 Field[] fields = clazz.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { // 獲得權限限定符 int mod = fields[i].getModifiers(); String strmod = Modifier.toString(mod); Class<?> type = fields[i].getType(); System.out.println("限定符為" + strmod + "類型為:" + type.getName() + "屬性名:" + fields[i].getName()); } Method[] methods = clazz.getMethods(); for (int i = 0; i < methods.length; i++) { Method method = methods[i]; System.out.println(method.getName()); Class<?> returnType = method.getReturnType(); System.out.println(returnType); Class<?> para[] = method.getParameterTypes(); for (int k = 0; k < para.length; k++) { System.out.println(para[k].getName()); } System.out.println("===="); } Method method = clazz.getMethod("printName", String.class); method.invoke(user, "leborn"); Field field = clazz.getDeclaredField("name"); // 可以直接對 private 的屬性賦值 field.setaccessible(true); field.set(user, "ddddgadgleg"); System.out.println(user.getName()); }}

我們這里再講解一下通過反射對其他類中的方法的調用

Method method = clazz.getMethod("printName", String.class); method.invoke(user, "leborn");

首先關于如何得到一個類的class對象,我們有多種方法

package wangcc.testapi;/** * @ClassName: TestGetClassObject * @Description: TODO(創建Class類對象實例) * @author wangcc * @date 2017年3月4日 下午9:07:26 * */public class TestGetClassObject { public static void main(String[] args) throws ClassNotFoundException { // TODO Auto-generated method stub Class<?> clazz1 = TestGetClassObject.class; Class<?> clazz2 = new TestGetClassObject().getClass(); // 參數為類的完全限定名 Class<?> clazz3 = Class.forName("wangcc.testapi.TestGetClassObject"); System.out.println(clazz1.getName()); System.out.println(clazz2.getName()); System.out.println(clazz3.getName()); }}

可以通過new 出對象之后在調用getClass()方法得到這個對象的class對象實例 也可以直接在類名后加上.classs 一般我們用Class api中的Class.forname()方法來完成class對象實例的獲取。 (在應用中我們可以將完全限定名,方法名等存儲到數據庫中,然后在數據庫中查找,然后通過class.forname()得到類的class對象clazz,通過clazz.getMethods()可以獲得所有的方法,通過clazz.newInstance()可以得到一個類的對象實例,如同于用一個無參構造函數new出一個實例,在這里多說一句,當一個類有顯示的有參構造函數時,我們需要顯式的加上無參構造函數) 還有一點我們需要注意,再調用clazz. getConstructors()時我們只返回修飾符為public 的公共構造方法,不會返回private修飾的,這個你可以做個試驗看一下,我之前并沒有注意,仔細翻看了API后才注意到,還是需要多看api.在我們得到Constructor對象后,我們就可以調用這個api的newInstance(Object… initargs) 來獲取類實例了,參數列表為相應的構造方法的參數列表。 說的有點遠了,我們回頭來看一下 Method method = clazz.getMethod(“printName”, String.class); Class API中的getMethod方法時獲取某個特定的Method對象的方法 第一個參數名為MethodName,之后的參數列表為方法參數的類型的class對象, 獲得Method對象之后 我們要調用Method對象中一個非常重要的方法:invoke() method.invoke(user, “leborn”); 我們來看一下api中對invoke的說明 invoke public Object invoke(Object obj, Object… args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException對帶有指定參數的指定對象調用由此 Method 對象表示的底層方法。個別參數被自動解包,以便與基本形參相匹配,基本參數和引用參數都隨需服從方法調用轉換。 如果底層方法是靜態的,那么可以忽略指定的 obj 參數。該參數可以為 null。

如果底層方法所需的形參數為 0,則所提供的 args 數組長度可以為 0 或 null。

如果底層方法是實例方法,則使用動態方法查找來調用它,這一點記錄在 Java Language Specification, Second Edition 的第 15.12.4.4 節中;在發生基于目標對象的運行時類型的重寫時更應該這樣做。 如果底層方法是靜態的,并且尚未初始化 如果方法正常完成,則將該方法返回的值返回給調用者;如果該值為基本類型,則首先適當地將其包裝在對象中。但是,如果該值的類型為一組基本類型,則數組元素不 被包裝在對象中;換句話說,將返回基本類型的數組。如果底層方法返回類型為 void,則該調用返回 null。 二.最后我們來說一下反射的應用 反射的重要應用,動態代理 首先為什么要用動態代理 動態代理用于方法的增強,他可以在不影響原程序代碼的情況下改變指定方法的運行情況,增加運行前后的處理 常見用于struts的攔截器,Spring AOP 然后我們說一下上面是動態代理 其實往簡單的說,動態代理技術就是用來產生一個對象的代理對象的。 在這里需要明確關于代理對象的概念: 代理對象的存在價值主要是用于攔截對真實業務對象的訪問

代理對象應該具有和目標對象相同的方法

這也是一種設計模式 代理模式 有靜態代理和動態代理 關于設計模式,在以后會抽空寫,主要也是關于大話設計模式的讀書筆記吧 實現jdk動態代理 我們需要了解一個類Proxy Proxy 提供用于創建動態代理類和實例的靜態方法,它還是由這些方法創建的所有動態代理類的超類。 我們主要關注他的一個靜態方法 newProxyInstance public static Object newProxyInstance(ClassLoader loader, Class

package wangcc.dynamicproxy;public interface Subject { public String getName(String name);}package wangcc.dynamicproxy;public class RealSubject implements Subject { @Override public String getName(String name) { // TODO Auto-generated method stub String retStr = "kobe" + name; return retStr; }}package wangcc.dynamicproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class MySubjectHandler implements InvocationHandler { private RealSubject obj; /** * @Title: bind * @Description: TODO(生成代理對象) * @param @param obj * @param @return 設定文件 * @return Object 返回類型 * @throws */ public Subject bind(RealSubject obj) { this.obj = obj; return (Subject) Proxy.newProxyInstance( obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub String methodName = method.getName(); if (methodName.equals("getName")) { args[0] = "leborn"; return method.invoke(obj, args); } return method.invoke(obj, args); }}package wangcc.dynamicproxy;public class Test { public static void main(String[] args) { MySubjectHandler myHandler = new MySubjectHandler(); Subject subject = (Subject) myHandler.bind(new RealSubject()); String name = subject.getName("bryant"); System.out.println(name); }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区二区三区毛片| 1769国内精品视频在线播放| 91沈先生在线观看| 国产精品av在线播放| 久久中文字幕在线视频| 欧美极品少妇全裸体| 亚洲成年网站在线观看| 亚洲一区av在线播放| 成人网在线观看| 日韩av中文在线| 久久久久久国产精品美女| 97视频免费观看| 亚洲视频axxx| 日本高清不卡的在线| 欧美亚洲另类激情另类| 国产精品美女网站| 国模叶桐国产精品一区| 国产精品v片在线观看不卡| 中文字幕精品www乱入免费视频| 97色在线视频观看| 日本aⅴ大伊香蕉精品视频| 亚洲欧美一区二区三区情侣bbw| 亚洲人成网站999久久久综合| 91成人精品网站| 久久久精品在线观看| 亚洲精品美女在线| 久久天天躁夜夜躁狠狠躁2022| 综合久久五月天| 久久久亚洲福利精品午夜| 一区二区三区视频免费| 78m国产成人精品视频| 国产亚洲精品91在线| 成人免费网站在线看| 亚洲视频在线视频| 欧美中文在线字幕| 国内精品久久久久| 欧美裸体xxxx极品少妇| 亚洲最新在线视频| 国产欧美日韩精品丝袜高跟鞋| 亚洲片在线观看| 欧美午夜片欧美片在线观看| 在线观看国产精品日韩av| 国产成人精品优优av| 成人观看高清在线观看免费| 亚洲黄色免费三级| 国产成人aa精品一区在线播放| 98精品国产自产在线观看| 91精品久久久久久久久久入口| 久久五月天色综合| 亚洲成人久久网| 成人av色在线观看| 欧美电影在线播放| 欧美激情视频一区| 日韩成人在线电影网| 欧美一性一乱一交一视频| 亚洲九九九在线观看| 亚洲跨种族黑人xxx| 日韩美女写真福利在线观看| 国产精品视频一区国模私拍| 中文字幕欧美日韩精品| 国产精品爽爽爽爽爽爽在线观看| 精品久久久久久久久久久| 精品国产一区二区三区久久狼5月| 欧美高清不卡在线| 国产视频精品一区二区三区| 国产盗摄xxxx视频xxx69| 国产一区二区欧美日韩| 全亚洲最色的网站在线观看| 岛国视频午夜一区免费在线观看| 欧美午夜精品在线| 另类天堂视频在线观看| 欧美国产在线电影| 国产精品一区二区3区| 91亚洲永久免费精品| 92看片淫黄大片看国产片| 国产精品白嫩初高中害羞小美女| 国产精品爽爽ⅴa在线观看| 亚洲最新av在线| 日韩在线资源网| 亚洲国产日韩欧美在线动漫| 国产亚洲欧洲黄色| 岛国av一区二区在线在线观看| 91高清免费在线观看| 欧美老女人xx| 亚洲国产精品女人久久久| 久久免费视频在线| 人妖精品videosex性欧美| 欧美一级片久久久久久久| 午夜精品久久久久久久久久久久久| 国产999精品久久久影片官网| 91精品免费久久久久久久久| 日韩av在线影院| 不卡av电影院| 91国语精品自产拍在线观看性色| 久久在线免费观看视频| 日韩中文字幕精品视频| 欧美精品免费看| 欧美一级片在线播放| 国产日韩欧美黄色| 久久久久久久久久久91| 欧美亚洲日本黄色| 欧美日韩在线视频一区| 亚洲成人教育av| 中文.日本.精品| 亚洲精品日韩激情在线电影| 国产精品网红直播| 久久综合色88| 91久久久久久久一区二区| 精品久久久国产| xx视频.9999.com| 亚洲综合在线小说| 福利二区91精品bt7086| 欧美美女15p| 欧美大荫蒂xxx| 国产精品一区二区三| 免费99精品国产自在在线| 人人做人人澡人人爽欧美| 在线观看国产成人av片| 日韩美女免费线视频| 日韩国产欧美精品在线| 国产精品国产福利国产秒拍| 97av在线影院| 亚洲黄色片网站| 国产欧美精品久久久| 亚洲人精选亚洲人成在线| 欧美午夜精品久久久久久浪潮| 亚洲高清不卡av| 中文字幕精品视频| 国产精品久久婷婷六月丁香| 亚洲国产成人精品女人久久久| 国产精品久久久久久久久久久新郎| 78色国产精品| 一道本无吗dⅴd在线播放一区| 欧美激情精品久久久久久| 亚洲第一区中文99精品| 97国产精品视频人人做人人爱| 欧美电影在线观看网站| 日本久久久a级免费| 亚洲精品国偷自产在线99热| 欧美日韩亚洲系列| 国产精品久久激情| 国产亚洲人成a一在线v站| 亚洲欧美国产日韩天堂区| 日韩久久免费电影| 九九热在线精品视频| 中文字幕国产日韩| 久久亚洲精品视频| 国产裸体写真av一区二区| 欧美成人亚洲成人日韩成人| 欧美激情一二区| 欧美高清videos高潮hd| 色偷偷偷综合中文字幕;dd| 国产精品va在线播放| 曰本色欧美视频在线| 久久这里只有精品99| 一区二区欧美久久| 亚洲国产精品va在看黑人| 成人黄色影片在线| 亚洲人午夜精品免费| 国产成人福利视频| 成人女保姆的销魂服务| 欧美性69xxxx肥| 色妞一区二区三区| 亚洲成人精品久久久|