Java反射机制梳理(一)
2016-02-27 11:13
417 查看
至于什么是反射,利用反射技术有什么好处,在这里文章中有一个详细的介绍了。具体可以查看公共技术点之 Java 反射 Reflection
下面梳理一下,在复习研究反射机制中,遇到的知识点:
(一).获取对象(3中方式)
1.通过类的完整路径来获取对象
(二).获取对象属性
/**
* 该方法用于获取传递过来的属性以及属性对应的值
* @param ob
*/
public void show(Object ob) {
// 获得传递过来的对象
Class cl = ob.getClass();
// 获得对应的属性集合
Field[] fi = cl.getDeclaredFields();
try {
for (Field ff : fi) {
ff.setAccessible(true);
//获取私有属性的时候要先开启访问权限。否则会报错
System.out.println("属性" + ff.getName() + ",对应的值:" + ff.get(ob));
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
(三).获取对象中的方法以及调用
1 .获取方法以及参数
下面梳理一下,在复习研究反射机制中,遇到的知识点:
(一).获取对象(3中方式)
1.通过类的完整路径来获取对象
Class demo1 = Class.forName("com.fangdingjie.bean.Book");2.通过实例化来获取对象
Book book = new Book(); Object ob = book; Class demo2 = ob.getClass();3直接类名称.class获取对象
Class demo3 = Book.class;
(二).获取对象属性
/**
* 该方法用于获取传递过来的属性以及属性对应的值
* @param ob
*/
public void show(Object ob) {
// 获得传递过来的对象
Class cl = ob.getClass();
// 获得对应的属性集合
Field[] fi = cl.getDeclaredFields();
try {
for (Field ff : fi) {
ff.setAccessible(true);
//获取私有属性的时候要先开启访问权限。否则会报错
System.out.println("属性" + ff.getName() + ",对应的值:" + ff.get(ob));
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
(三).获取对象中的方法以及调用
1 .获取方法以及参数
/** * 该方法用于返回 获取对象的所有方法,返回值类型以及参数信息 * @param ob */ public void show(Object ob){ Class cl = ob.getClass(); Method [] method = cl.getDeclaredMethods(); for(Method m:method){ //获取方法的参数,返回的是一个Class类型的数组 Class [] paramCl = m.getParameterTypes(); System.out.println("方法名"+m.getName()+",返回值类型"+m.getReturnType()+",方法修饰值"+m.getModifiers()); } }2.方法的调用。
//该方法用于传递过来的实体对象方法的调用 public void showUser(Object ob){ Class cl = ob.getClass(); try { Method mt = cl.getMethod("getName", null); System.out.println("方法名"+mt.getName()); //invoke位调用该方法 mt.invoke(ob, new Object[0]); //调用有带1个参数的方法 Method mt1 = cl.getMethod("setName", String.class); mt1.invoke(ob, "Android疯狂讲义"); //调用多个参数的方法 Class [] cll = {String.class,int.class}; Method mt2 = cl.getMethod("test", cll); Object [] object = {"test",154}; mt2.invoke(ob, object); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } }以上为反射的基础知识,只是做为个人备忘。大神勿喷。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法