JAVA反射Field使用
2015-10-20 12:05
411 查看
1.获取类的成员变量:
返回一个包含某些
示例1:
3.执行方射方法:
a)结构:方法.invoke(类实例,参数); b)method.setAccessible(true);作用打破封装,获取权限用;
a)Class.getDeclaredField(String name);
返回一个 Field
对象,该对象反映此 Class对象所表示的类或接口的指定已声明字段。
b)Class.getDeclaredFields();
返回 Field
对象的一个数组,这些对象反映此 Class对象所表示的类或接口所声明的所有字段。
c)Class.getField(String
name)
; 返回一个 Field
对象,它反映此 Class对象所表示的类或接口的指定公共成员字段。
d)Class.getFields()
;返回一个包含某些
Field对象的数组,这些对象反映此
Class对象所表示的类或接口的所有可访问公共字段。
示例1:
public static int getPppoeType() { int result = 14; Class<ConnectivityManager> cls = ConnectivityManager.class; Field[] fields = cls.getFields(); for (Field f : fields) { if (f.getName().equals("TYPE_PPPOE")) { try { result = f.getInt(cls); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } break; } } return result; }2.获取类反射方法:a)首先通过反射获取类的类型:
// 第一种方式:通过Class静态方法forName(返回与带有给定字符串名的类或接口相关联的 Class 对象) try { Class ClasscType1 = Class.forName("com.sunniwell.UserInfo");//必须加上包名,否则报错 } catch (ClassNotFoundException e) { e.printStackTrace(); } // 第二种方式:java中每个类型都有class属性 Class ClasscType2 = UserInfo.class; // 第三种方式:java语言中任何一个java对象都有getClass 方法 UserInfo userInfo = new UserInfo(); Class ClasscType3 = userInfo.getClass(); // ClasscType3是运行时类b)其次通过newInstance创建类对象新实例:此方法要求对应类必须有无参的构造方法,否则无法创建。
// 第二种方式:java中每个类型都有class属性 Class ClasscType2 = UserInfo.class; try { Object object=ClasscType2.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); }
3.执行方射方法:
a)结构:方法.invoke(类实例,参数); b)method.setAccessible(true);作用打破封装,获取权限用;
Class<? extends Class> vClass = herosClass.getClass(); try { Method method1 = herosClass.getMethod("setName", String.class); Method method2 = herosClass.getMethod("getName"); Object userInfo = herosClass.newInstance();// 创建新实例 method1.setAccessible(true); method1.invoke(userInfo, "hello"); System.out.println("调用set方法:" + userInfo); System.out.println("调用get方法:" + method2.invoke(userInfo)); } catch (Exception e) { e.printStackTrace(); }
相关文章推荐
- 黑马程序员----多线程3(线程间通信、JDK1.5新特性、线程类的其他方法)
- Zookeeper浏览器工具和Eclipse插件分享
- java IO 知识大总(转+编辑)
- Java接口中的成员变量为什么必须是public static final?
- Eclipse导出可运行的jar包并运行
- Java中的static关键字解析
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- Java发送Post请求
- 使用eclipse插件mybatis generator来生成文件代码
- Java Web角色权限设计
- JAVA设计模式(9) —<结构型>外观模式(Facade)
- MyEclipse 下安装外置的jdk7
- Mars.1 Release (4.5.1)安装velocity插件Veloeclipse.ui_2.0.8
- 生成二维码
- Java New Thread start() 与 run()的区别
- Thinking in Java 第二章 一切都是对象
- 简单的递归打印阶乘
- spring AOP @Around @Before @After 区别
- Mac下安装JDK 6
- org.springframework.scheduling.quartz.CronTriggerBean定时任务配置