日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

反射机制(java)

發(fā)布時(shí)間:2025/4/16 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 反射机制(java) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

反射機(jī)制

? ? ?反射機(jī)制可通過在運(yùn)行時(shí)加載類名而獲取類,并對(duì)其進(jìn)行操作。工廠模式,動(dòng)態(tài)代理中較常用到。

? ? ?在實(shí)際場(chǎng)景中:由于有好多類具有共同的接口樣式,而他們又用的不是很頻繁,如果在服務(wù)器中保有這些類會(huì)占用資源空間,如果通過接口指定的方式去加載,用完之后就銷毀掉,可節(jié)省資源空間,且實(shí)現(xiàn)接口編程,擴(kuò)展性好,代碼量也少。打個(gè)比方:哺乳動(dòng)物Animal為接口,里面包括獲取乳頭數(shù),獲取腿,獲取頭,獲取尾巴等,像這種都具有一定共性,實(shí)現(xiàn)類為老虎,獅子,兔子,羊等等等。

1.獲取className,常用的形式將需要反射的類放在屬性文件*.properties或數(shù)據(jù)庫字段中,通過key獲取類名及路徑。

1 private static final String CLASS_NAME_PATH = "pattern/classname.properties"; 2 3 /** 4 * 獲取類名稱 5 * @return 6 */ 7 private static String getClassName(String name) { 8 Properties pro = new Properties(); 9 try { 10 String url = ProxyFactory.class.getClassLoader().getResource("").getPath() + CLASS_NAME_PATH; 11 pro.load(new FileInputStream(url)); 12 } catch (FileNotFoundException e) { 13 e.printStackTrace(); 14 } catch (IOException e) { 15 e.printStackTrace(); 16 } 17 return (String)pro.get(name); 18 } getClassName 1 # animal 2 lion = pattern.creation.factory.animal.Lion 3 sheep = pattern.creation.factory.animal.Sheep 4 rabit = pattern.creation.factory.animal.Rabit 5 # plant 6 apple = pattern.creation.factory.plant.Apple 7 pear = pattern.creation.factory.plant.Pear 8 plum = pattern.creation.factory.plant.Plum classPath.properties

>>> String strClass = getClassName("rabit");//獲取兔子類

2.獲取類,創(chuàng)建類實(shí)例

Class<?> clazz = Class.forName(strClass); ?//獲取類

Object obj = clazz.newInstance(); ? ? ? ? ? ?//構(gòu)建實(shí)例對(duì)象

Class<?> superClazz = clazz.getSuperclass(); //獲取父類
Class<?>[] interfaceArray = clazz.getInterfaces();//獲取接口

1 /** 2 * 根據(jù)classname獲取類名 3 * @param strName 4 * @return 5 * @throws ClassNotFoundException 6 * @throws InstantiationException 7 * @throws IllegalAccessException 8 */ 9 @SuppressWarnings("unchecked") 10 public <T> T getClassByName(String strName) throws ClassNotFoundException, InstantiationException, IllegalAccessException { 11 String strClass = getClassName(strName); 12 Class<?> clazz = Class.forName(strClass); 13 Class<?> superClazz = clazz.getSuperclass(); 14 Class<?>[] interfaceArray = clazz.getInterfaces(); 15 System.out.println("className--: " + clazz.getName());//當(dāng)前類名 16 System.out.println("superClassName--: " + superClazz.getName());//父類 17 for(Class<?> interfaces: interfaceArray){ 18 System.out.println("interface--: " + interfaces.getName());//接口 19 } 20 return (T)clazz.newInstance(); 21 } getClass

>>> AnimalFactory animal = reflectFactory.getClassByName("rabit");

運(yùn)行結(jié)果:? ??

className--: pattern.creation.factory.animal.Rabit
superClassName--: pattern.creation.factory.animal.Animals
interface--: pattern.creation.factory.animal.AnimalFactory

?3. 獲取類屬性及信息

Field[] fieldArray = clazz.getDeclaredFields(); // 顯示所有的屬性
Field[] publicFieldArray = clazz.getFields(); //顯示public屬性的元素

String name = field.getName(); ? ?//獲取方法名

String modify = Modifier.toString(field.getModifiers()); ? // 修飾詞
String classType = field.getType().getSimpleName(); ? ?// 類型
Annotation[] annoArray = field.getAnnotations(); ? ? ? ?// 注解

field.setAccessible(true); ? ? ? ?//獲取value要賦予權(quán)限

Object obj = clazz.newInstance(); ? ?//對(duì)象實(shí)例
Object value = field.get(obj);// 私有屬性需要獲取權(quán)限才可以

field.set(obj, value + "-----changed..");// 修改私有屬性的值

1 /** 2 * 通過反射機(jī)制獲取類 的屬性名及其內(nèi)容 3 * @param strName 4 * @throws ClassNotFoundException 5 * @throws InstantiationException 6 * @throws IllegalAccessException 7 */ 8 public void getClassFieldByName(String strName) throws ClassNotFoundException, InstantiationException, IllegalAccessException { 9 String strClass = getClassName(strName); 10 Class<?> clazz = Class.forName(strClass); 11 Object obj = clazz.newInstance(); 12 Field[] fieldArray = clazz.getDeclaredFields(); // 顯示所有的屬性 13 Field[] publicFieldArray = clazz.getFields(); //顯示public屬性的元素 14 Field[] newFieldArray = (Field[])ArrayUtils.addAll(fieldArray, publicFieldArray); 15 for(Field field : newFieldArray){ 16 String name = field.getName(); 17 String modify = Modifier.toString(field.getModifiers()); 18 String classType = field.getType().getSimpleName(); 19 Annotation[] annoArray = field.getAnnotations(); 20 String strAnno = ""; 21 for(Annotation anno : annoArray){ 22 strAnno += "@"+anno.annotationType().getSimpleName(); 23 } 24 field.setAccessible(true); 25 Object value = field.get(obj);// 私有屬性需要獲取權(quán)限才可以 26 System.out.println("propertyName: " + strAnno + " " + modify+ " " + classType + " " + name + "=" + value); 27 if(!StringUtils.contains(modify, "final")){ 28 field.set(obj, value + "-----changed..");// 修改私有屬性的值 29 System.out.println("propertyName: " + strAnno + " " + modify+ " " + classType + " " + name + "=" + value); 30 } 31 } 32 33 Field[] fieldsArray = clazz.getSuperclass().getDeclaredFields();//父類的屬性名 34 for(Field field : fieldsArray){ 35 String name = field.getName(); 36 String modify = Modifier.toString(field.getModifiers()); 37 String classType = field.getType().getSimpleName(); 38 field.setAccessible(true); 39 Object value = field.get(obj);// 私有屬性需要獲取權(quán)限才可以 40 System.out.println("superPropertyName: " + modify+ " " + classType + " " + name + "=" + value); 41 } 42 } getClassFieldByName

>>> reflectFactory.getClassFieldByName("rabit");

運(yùn)行結(jié)果:

propertyName: private String rabitName=I am rabit
propertyName: private String rabitName=I am rabit
propertyName: private String header=
propertyName: private String header=
propertyName: private static final int LEGS=4
propertyName: @Resource public String tails=1tails
propertyName: @Resource public String tails=1tails
propertyName: @Resource public String tails=1tails-----changed..
propertyName: @Resource public String tails=1tails-----changed..
superPropertyName: private static final long serialVersionUID=8482086762730882629
superPropertyName: private int slegs=0
superPropertyName: private int shands=0
superPropertyName: private int sheader=0

?4. 獲取方法,及方法調(diào)用

String modifier = Modifier.toString(method.getModifiers()); //修飾詞
String returnType = method.getReturnType().getSimpleName();//返回類型
String name = method.getName();//方法名
Parameter[] parameters = method.getParameters();//參數(shù)列表
Annotation[] annoArray = method.getAnnotations();//注解列表

Method method = clazz.getMethod(methodName, classes); //根據(jù)方法名,獲取方法

method.invoke(obj, orgs); //方法調(diào)用? 注意invoke的第一個(gè)參數(shù)為方法對(duì)應(yīng)的類的實(shí)例。

UserDTO dto = new UserDTO(); dto.setId("12323344"); System.out.println(dto.getClass().getMethod("getId").invoke(dto));

?

1 /** 2 * 獲取方法并調(diào)用方法 3 * @param strName 4 * @param methodName 5 * @param orgs 6 * @param classes 7 * @throws ClassNotFoundException 8 * @throws InstantiationException 9 * @throws IllegalAccessException 10 * @throws NoSuchMethodException 11 * @throws SecurityException 12 * @throws IllegalArgumentException 13 * @throws InvocationTargetException 14 */ 15 public void getRunMethodByMethodName(String strName, String methodName, Object[] orgs, Class<?>[] classes) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException { 16 String strClass = getClassName(strName); 17 Class<?> clazz = Class.forName(strClass); 18 Class<?> superClazz = clazz.getSuperclass(); 19 Object obj = clazz.newInstance(); 20 Method[] methodArray = clazz.getDeclaredMethods(); 21 Method[] supeMethodArray = superClazz.getDeclaredMethods(); 22 Method[] sumMethodArray = (Method[])ArrayUtils.addAll(methodArray, supeMethodArray); 23 for(Method method : sumMethodArray){ 24 String modifier = Modifier.toString(method.getModifiers()); 25 String returnType = method.getReturnType().getSimpleName(); 26 String name = method.getName(); 27 Parameter[] parameters = method.getParameters(); 28 Annotation[] annoArray = method.getAnnotations(); 29 String strAnno = ""; 30 for(Annotation anno : annoArray){ 31 strAnno += "@"+anno.annotationType().getSimpleName(); 32 } 33 String strPara = ""; 34 for(Parameter para : parameters){ 35 strPara+=para.getType().getSimpleName() + " " + para.getName() + ","; 36 } 37 System.out.println("method:----"+strAnno + " " + modifier + " " + returnType + " " + name + "(" + strPara +")"); 38 } 39 Method method = clazz.getMethod(methodName, classes); 40 System.out.println("header: " + method.invoke(obj, orgs)); 41 } getRunMethodByMethodName

>>>?Class<?>[] classArray = {String.class,int.class,String.class};
>>>?Object[] paramsArray = {"兔子只有",1,"頭"};
>>>?reflectFactory.getRunMethodByMethodName("rabit", "getHeader",paramsArray, classArray);

運(yùn)行結(jié)果:

method:---- public String getHeader()
method:---- public String getHeader(String arg0,int arg1,String arg2,)
method:---- public int getLegs()
method:---- public int getLegs()

header: ?兔子只有$$$$1@@@@@@頭

5. 構(gòu)造體方法

clazz.getConstructors() ?// 獲取所有的構(gòu)造體

----------------------------------------------------------------------------------------------------------

?

以上,為個(gè)人總結(jié),如有寫的不當(dāng)之處,還望指正。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -----------DennyZhao

?

?

?

? ? ?

?

轉(zhuǎn)載于:https://www.cnblogs.com/DennyZhao/p/7019126.html

總結(jié)

以上是生活随笔為你收集整理的反射机制(java)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。