Java——反射
2016-07-23 10:47
513 查看
Java不是动态语言,但有着一个非常突出的动态相关机制:Reflection,我们可以于运行时加载、探知、使用编译期间完全未知的classes。通过运行时才得知名称的class,可以获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
所有类的对象其实都是Class的实例。
【输出结果】
true
true
行时动态加载的方式获取Class比较常用
c3.newInstance() 通过无参构造实例化对象,要求该类必须包含无参构造方法,否则将抛出异常。
c3.newInstance() 得到一个Object对象,需要强制转换
如类名、构造方法、成员变量、方法名等
【输出结果】
Lok tar o’gar!
基本功能
在面向对象的世界里,万事万物皆对象。(java语言中,静态的成员、普通数据类型除外)。所有类的对象其实都是Class的实例。
1、获取Class的三种方法
- 通过类的隐含class静态成员变量获取Class - 通过类的实例对象,获取该类的Class - 动态加载
Class c1 = AdultVideoStar.class;//通过类获取Class,任何一个类都有一个隐含的class静态成员变量。 Class c2 = (new AdultVideoStar()).getClass();//通过类的实例对象,获取该类的Class。 Class c3 = Class.forName("org.app.base.common.excel.AdultVideoStar");//动态加载(包名+类名) System.out.println(c1==c2); System.out.println(c2==c3);
【输出结果】
true
true
2、实例化对象
Class c3 = Class.forName("org.app.base.common.excel.AdultVideoStar");//动态加载(包名+类名) AdultVideoStar av =(AdultVideoStar)c3.newInstance();
行时动态加载的方式获取Class比较常用
c3.newInstance() 通过无参构造实例化对象,要求该类必须包含无参构造方法,否则将抛出异常。
c3.newInstance() 得到一个Object对象,需要强制转换
3、获取类的相关信息
如类名、构造方法、成员变量、方法名等
运用实例
动态工厂,相比普通工厂,更加通用,不用更改工厂类,只需要增加实现类即可。public interface Games { public abstract void play(); }
public class LOL implements Games{ @Override public void play() { // TODO Auto-generated method stub System.out.println("Legendary!"); } }
public class WOW implements Games{ @Override public void play() { // TODO Auto-generated method stub System.out.println("Lok tar o'gar!"); } }
public class DynamicFactory { public static Games getInstance(String ClassName) { Games game = null; try { game = (Games) Class.forName(ClassName).newInstance(); } catch (Exception e) { e.printStackTrace(); } return game; } public static void main(String[] a) throws FileNotFoundException, IOException { Games game = DynamicFactory.getInstance("org.app.base.common.study.reflection.WOW"); if (game != null) { game.play(); } } }
【输出结果】
Lok tar o’gar!
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树