`

java反射(得到属性名,类型)学习篇二

    博客分类:
  • java
阅读更多

 

//用来测试的javaBean

public class Stu {

private int id;
private String stuName;

public Stu(){}
public Stu(int id,String stuName){
   this.id=id;
   this.stuName=stuName;
}
public void setAll(int id,String stuName){
   this.id=id;
   this.stuName=stuName;
}
public int getId() {
   return id;
}
public void setId(int id) {
   this.id = id;
}
public String getStuName() {
   return stuName;
}
public void setStuName(String stuName) {
   this.stuName = stuName;
}
public String toString(){
   return id+stuName;
}
}
//

public static void main(String[] args) throws ClassNotFoundException {

   Class cla=Class.forName("com.testBean.Stu");
   //解析属性信息
   Field[] f=cla.getDeclaredFields();
   for (Field field : f) {
    System.out.println("属性="+field.toString());
    System.out.println("数据类型="+field.getType());
    System.out.println("属性名="+field.getName());
    int mod=field.getModifiers();
    System.out.println("属性修饰符="+Modifier.toString(mod));
   }
   //解析方法信息
   Method[] methodlist=cla.getDeclaredMethods();
   for (Method method : methodlist) {
    System.out.println("---------------");
    System.out.println("方法="+method.toString());
    System.out.println("方法名="+method.getName());
    int mod=method.getModifiers();
    System.out.println("方法修饰符="+Modifier.toString(mod));
    System.out.println("方法参数列表");
    Class pts[]=method.getParameterTypes();
    for (int i = 0; i < pts.length; i++) {
     Class class1 = pts[i];
     if(i!=0){
      System.out.println(class1);
     }
     System.out.println("返回类型"+method.getReturnType());
    }
   }
}

//result:

输入一个类名:
属性=private int com.testBean.Stu.id
数据类型=int
属性名=id
属性修饰符=private
属性=private java.lang.String com.testBean.Stu.stuName
数据类型=class java.lang.String
属性名=stuName
属性修饰符=private
---------------
方法=public void com.testBean.Stu.setAll(int,java.lang.String)
方法名=setAll
方法修饰符=public
方法参数列表
返回类型void
class java.lang.String
返回类型void
---------------
方法=public void com.testBean.Stu.setId(int)
方法名=setId
方法修饰符=public
方法参数列表
返回类型void
---------------
方法=public java.lang.String com.testBean.Stu.getStuName()
方法名=getStuName
方法修饰符=public
方法参数列表
---------------
方法=public void com.testBean.Stu.setStuName(java.lang.String)
方法名=setStuName
方法修饰符=public
方法参数列表
返回类型void
---------------
方法=public java.lang.String com.testBean.Stu.toString()
方法名=toString
方法修饰符=public
方法参数列表
---------------
方法=public int com.testBean.Stu.getId()
方法名=getId
方法修饰符=public
方法参数列表

//方法一
public static void mm(Class cla){
   Field[] fs=cla.getDeclaredFields();
   //fs=cla.getFields();加了这个的话就只获得public 公有的
   for (Field f : fs) {
    System.out.println(f.getName());
   }
}

//方法一输出结果:

id

stuName

////////////一个应用实例

package com.reflect;

import java.beans.IntrospectionException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import com.testBean.Stu;
public class Test {

/**
* 利用反射对实体bean赋值
*
*/
public static void main(String[] args) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchFieldException {
   // TODO 自动生成方法存根
   Stu stu=new Stu();
   Test t=new Test();
   List propertyVales=t.getPropertyVal();
   for (Object object : propertyVales) {
    System.out.println(object.toString());
   }
   List propertyNames=t.getPropertyNames(Stu.class);
   for (Object object : propertyNames) {
    System.out.println(object);
   }
   t.method(stu, propertyNames, propertyVales);
   System.out.println(stu);
  

}

public List getPropertyVal(){
   List propertyValues=new ArrayList();
   propertyValues.add(10);
   propertyValues.add("my name");
   return propertyValues;
}

public void method(Object obj,List propertyNames,List propertyVales) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
   Class cla=obj.getClass();
   for(int i=0;i<propertyNames.size();i++){
   Field f=cla.getField(propertyNames.get(i).toString());
   f.set(obj, propertyVales.get(i));
   }
}
public List getPropertyNames(Class cla){
   List list=new ArrayList();
   Field[] fs=cla.getDeclaredFields();
   //fs=cla.getFields();加了这个的话就只获得public 公有的
   for (Field f : fs) {
    list.add(f.getName());
   }
   return list;
}

}
//输出:

10
my name
id
stuName
10my name

//从上面的例子我觉得我们可以利用反射来简化struts(Action)中对数据库插入的操作人们可以写一个方法impl.save(StuBean.class,request);

如此种用反射从request中得到页面的值,可从StuBean中得到属性,然后利用反射配起来。忧点可以避免写重复的Bean.setXxx().....

可以这样三步解决:

StuBean stu=new StuBean();

impl.save(stu,request);

dao.save(stu);//hibernate DAO 或Spring DAO

//如果实体bean是私有的,用这个代替上面的方法

public void method(Object obj,List propertyNames,List propertyVales) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
   Class cla=obj.getClass();
   for(int i=0;i<propertyNames.size();i++){
   Field f=cla.getDeclaredField(propertyNames.get(i).toString());
   f.setAccessible(true);//加了这句才能改私有的值
   f.set(obj, propertyVales.get(i));
   }
}

 

分享到:
评论

相关推荐

    java 反射取得类的私有属性,通过私有属性取得属性值

    Java反射API提供了一系列类和接口,如`Class`、`Field`、`Method`等,它们让我们能够在运行时动态地获取类的信息,包括类的结构、方法签名以及字段等。这为编程提供了极大的灵活性,尤其是在处理第三方库或者进行元...

    java反射机制学习(四):通过反射执行方法、操作属性、操作数组中的数据

    总结来说,Java反射机制提供了强大的动态类型功能,让我们能够在运行时检查类的信息,创建对象,调用方法,访问属性,以及操作数组。这种能力在很多场合都非常有用,如插件系统、代码生成、测试工具等。但同时,反射...

    Java基础入门四泛型反射注解.pdf

    Java基础入门系列是帮助初学者掌握Java编程的重要学习材料,本篇主要介绍了泛型、反射和注解这三大高级特性。 泛型是Java SE 5版本引入的一个新特性,它的主要目的是允许在使用类、接口和方法时能够引用到任何类型...

    java反射应用实例

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在标题“Java反射应用实例”中,我们关注的是如何在实际项目中利用反射来实现特定的功能。这篇博客...

    java反射机制与动态代理

    通过本篇文章的学习,我们可以了解到Java反射机制的强大之处在于它能在运行时动态地获取类的信息,并对其进行操作。这对于编写高度灵活的代码非常有帮助。同时,动态代理技术为实现AOP(面向切面编程)等高级功能提供...

    Java Virtual Machine Specification Java SE 7 中文版

    7. 反射:Java反射机制允许程序在运行时检查类、接口、字段和方法的信息,甚至可以在运行时创建和调用对象。这对于框架和元编程非常有用。 8. 动态类型与Lambda表达式:Java SE 7虽然不包含Lambda表达式,但为后来...

    Java语言程序设计 第10版 进阶篇 中文part1(共2部分) Y.Daniel Liang 梁勇

    5. **反射**:Java反射机制允许在运行时检查类、接口、字段和方法的信息,甚至可以动态调用方法和访问私有属性。这部分将讲解如何使用`Class`对象、`Constructor`、`Method`和`Field`。 6. **异常处理**:Java的...

    commons-beanutils-1.6.1-src.zip

    在1.6.1版本中,Apache Commons BeanUtils可能已经进行了性能优化,例如缓存了反射得到的方法对象,减少了不必要的反射调用。 总的来说,Apache Commons BeanUtils 1.6.1源码提供了丰富的工具和策略,帮助开发者更...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

     本书非常适合Java的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合Java程序员参考、查阅。 目 录 第1篇 Java语法与面向对象技术 第1章 开发环境的应用 2 1.1 Java环境 3 实例001 下载JDK开发...

    传智播客 Spring 完全文档 笔记总结

    ### 传智播客 Spring 完全文档 笔记总结 #### 一、Spring入门 ...通过本篇文档的学习,读者可以对 Spring 的基本概念和使用方法有一个全面的认识。无论是初学者还是有一定经验的开发者,都能从中获益匪浅。

Global site tag (gtag.js) - Google Analytics