java--反射
来源:互联网 发布:好搜seo 好搜索引擎 编辑:程序博客网 时间:2024/05/29 11:51
第一次去接触反射,感觉很陌生,接触一点后,只感觉很强大,自己只知道皮毛中的皮毛,只通过类名来获取类中的属性和方法,这是我接触反射的第一种方式,也是兴趣的出发点,想想这种技术是黑客技术的一种吧,就觉得虽然只是了解了一点点,但还是激起了我对JAVA的极大兴趣 ;
下面是通过反射来从一个学生类名中取得它的属性和与属性相关的方法:
这个是学生类:
- package com.yc.bean;
- public class Student{
- private String name;
- private double high;
- private Integer age;
- public Student(){
- System.out.println("enen");
- }
- public void setName(String name){
- this.name=name;
- }
- public String getName(){
- return this.name;
- }
- public void setHigh(double high){
- this.high=high;
- }
- public double getHigh(){
- return this.high;
- }
- public void setAge(Integer age){
- this.age=age;
- }
- public Integer getAge(){
- return this.age;
- }
- }
运行Test类可得到在 主函数中赋值的两个数据:即在只知道类 名的时候调用了Student类的两个方法:
代码如下:
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import java.util.List;
- import java.util.ArrayList;
- public class Test{
- public static void main(String[] args) throws Exception{
- Class c=Class.forName("com.yc.bean.Student");
- System.out.println(c);
- Object oselect * from mye01;select * from mye01;bj=c.newInstance();
- System.out.println("新创建出来的对象"+obj);
- //取出属性名
- List<String> propertyNames=getFieldNames(c);
- if(propertyNames==null||propertyNames.size()<=0){
- return ;
- }
- for(String propertyName:propertyNames){
- String setMethodName=getMethodName("set",propertyName);
- Method toInvokedMethod=getInvokeMethod(setMethodName,c);
- if(toInvokedMethod.getParameterTypes()[0].getName().equals("java.lang.Integer")||toInvokedMethod.getParameterTypes()[0].getName().equals("int")){
- toInvokedMethod.invoke(obj,44);
- }else if(toInvokedMethod.getParameterTypes()[0].getName().equals("java.lang.Double")||toInvokedMethod.getParameterTypes()[0].getName().equals("double")){
- toInvokedMethod.invoke(obj,22.0);//激活方法
- }else{
- toInvokedMethod.invoke(obj,"mingjun");
- }
- //get方法
- String getMethodName=getMethodName("get",propertyName);
- toInvokedMethod=getInvokeMethod(getMethodName,c);
- System.out.println(toInvokedMethod.invoke(obj));
- }
- }
- //将方法名用stringbuffer类连接成方法名:
- private static String getMethodName(String prefix,String propertyName){
- String suffix=propertyName.substring(0,1).toUpperCase()+propertyName.substring(1);
- return prefix+suffix;
- }
- //取出所有属性名
- private static List<String> getFieldNames(Class c){
- List<String> propertyNames=new ArrayList<String>();
- Field[] fs=c.getDeclaredFields();
- if(fs!=null&&fs.length>0){
- for(Field f:fs){
- propertyNames.add(f.getName());
- }
- }
- return propertyNames;
- }
- //根据方法在Class对象中查找到方法对象 Method
- private static Method getInvokeMethod(String methodName,Class c){
- Method[] ms=c.getMethods();
- if(ms!=null&&ms.length>0){
- for(Method m:ms){
- if(m.getName().equals(methodName)){
- return m;
- }
- }
- }
- return null;
- }
- }
只学了点皮毛,希望在今后的学习中可以接触到更多:
0 0
- 【反射】JAVA反射机制
- JAVA 反射
- java 反射
- Java反射
- java反射
- java反射
- JAVA反射
- java 反射
- Java 反射
- java 反射
- Java反射
- java反射
- JAVA 反射
- java 反射
- Java反射
- java反射
- java 反射
- java 反射
- Java中的集合框架
- 关于背面剔除的概念。
- JSON.parse()和JSON.stringify()
- 二叉搜索树与双向链表
- Android研究院之ListView原理学习与优化总结(二十一)
- java--反射
- Spring+Velocity中模板路径的问题
- C++之:函数调用的名字查找与继承
- MFC多国语言——配置文件
- java 传值、传引用总结
- RoadFlow工作流显示当前工作流节点背景
- HTMl5中sessionStorage和localStorage的区别
- SAX解析XMl文件
- Android CardView使用和导入出错问题