前言
之前韩脑,我寫了一篇關(guān)于java反射的使用——花一杯茶的時間氢妈,學(xué)會Java反射(基礎(chǔ)篇),今天就拿一些實例和應(yīng)用給大家看看如何在項目中用反射段多。
實例
反射可以提高代碼的擴展性允懂,低耦合,高內(nèi)聚衩匣。就拿工廠模式來說。
-
首先是簡單工廠模式粥航,沒有使用反射琅捏。
/** * 動物接口 * * @author chenjunxu * */ public interface IAnimal { /** * 品種 */ public void kind(); } /** * 貓類 * * @author chenjunxu * */ public class Cat implements IAnimal { @Override public void kind() { System.out.println("I am cat!"); } } /** * 狗類 * * @author chenjunxu * */ public class Dog implements IAnimal { @Override public void kind() { System.out.println("I am dog!"); } } /** * 動物工廠類 * * @author chenjunxu * */ public class AnimalFactory { /** * 根據(jù)名稱獲取動物的實例 * * @param className * @return */ public static IAnimal chooseAnimal(String className) { if (className.equalsIgnoreCase("Dog")) { return new Dog(); } else if (className.equalsIgnoreCase("Cat")) { return new Cat(); } return null; } } /** * 主類 * * @author chenjunxu * */ public class Main { public static void main(String[] args) { IAnimal animal = AnimalFactory.chooseAnimal("Cat"); if (null != animal) { animal.kind(); } else { System.out.println("沒有此動物!"); } } }
假設(shè)我們要新增一個動物:mouse递雀。那么我們需要新建一個mouse類柄延,然后在AnimalFactory工廠類中,加多一個if...else...
的判斷缀程。假設(shè)需要添加十多個動物呢搜吧?大家也知道,if...else...
用的越多杨凑,可能代碼的可讀性就越差滤奈,而且容易出錯。
那么能不能每次添加一個新的動物類撩满,然后不需要修改工廠類呢蜒程?答案就是反射。
接口IAnimal
和類Cat
伺帘、Dog
昭躺、Main
不改變,將工廠類修改成以下:
/**
* 動物工廠類
*
* @author chenjunxu
*
*/
public class AnimalFactory {
/**
* 根據(jù)動物類名獲取動物的實例
*
* @param className(包名+類名)
* @return
*/
public static IAnimal chooseAnimal(String className) {
try {
Class<?> clazz = Class.forName(className);
return (IAnimal) clazz.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
只要你的參數(shù)正確(記住是包名+類名)伪嫁,就可以獲取到對應(yīng)類的實例领炫。
-
現(xiàn)在假設(shè)一種場景。有一個APP的通用框架张咳,可以用來做多種多樣的APP〉酆椋現(xiàn)在似舵,有一些APP需要分享功能,有一些不需要分享功能碟狞。那我們最好以插件的形式啄枕,將分享功能封裝成jar包或者library。
分享的jar包(分享庫):package com.share.lib; /** * 分享庫的分享類 * * @author chenjunxu * */ public class ShareLib { /** * 顯示分享框 * * @param content */ public static void showShareDialog(String content) { System.out.println(content); } }
工具類:調(diào)用分享庫ShareLib的分享方法:
package com.share.demo;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 分享工具類
*
* @author chenjunxu
*
*/
public class ShareUtils {
/**
* 分享
*
* @param content
* 分享內(nèi)容
*/
public static void share(String content) {
try {
Class<?> clazz = Class.forName("com.share.lib.ShareLib");
Method method = clazz.getMethod("showShareDialog", String.class);
method.invoke(null, content);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
主方法調(diào)用工具類的分享方法:
package com.share.demo;
/**
* 主類
*
* @author chenjunxu
*
*/
public class Main {
public static void main(String[] args) {
ShareUtils.share("我要分享內(nèi)容族沃!");
}
}
若是我們不需要使用分享功能频祝,那就不需要修改工具類,直接不調(diào)用ShareUtils.share
方法就行了脆淹。