反射机制(java)
反射機(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();//獲取接口
>>> 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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Node.JS+MongoDB搭建个人
- 下一篇: 三相不平衡的原因、危害以及解决措施