java反射

谁帮写一段代码
功能
给定包名类名后
可以查出这个类中有什么属性,属性类型
有什么方法,方法的参数,参数个数
我知道用反射机制,麻烦帮写一下
注释一下
[b]问题补充:[/b]
获得方法参数的名称是用什么方法?
[b]问题补充:[/b]
我想获得完整的方法
比润 public String print(String s)

[code="java"]
package utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class ReflectTest {

/**
 * @param args
 */
public static void main(String[] args) throws Exception{
    // TODO Auto-generated method stub

    Class clazz = Class.forName("utils.FileUtils");
    Field[] fields = clazz.getDeclaredFields();
    Method[] methods = clazz.getDeclaredMethods();
    System.out.println("--------------- 属性如下  -----------------");
    for(Field field : fields){
        int mod = field.getModifiers();
        System.out.println(Modifier.toString(mod) //取得修饰符
                + " " + field.getType().getName() //取得类型名
                + " " + field.getName());         //取得属性名
    }
    System.out.println("--------------- 方法如下  -----------------");
    for(Method method : methods){
        StringBuffer methodBuffer = new StringBuffer();
        int mod = method.getModifiers();
        methodBuffer.append(Modifier.toString(mod))  //取得修饰符
                    .append(" ").append(method.getReturnType().getName()) //取得返回值类型
                    .append(" ").append(method.getName())  //取得方法名
                    .append("(");
        for(Class ss : method.getParameterTypes()){
            methodBuffer.append(ss.getName()).append(",");  //取得参数
        }
        methodBuffer.deleteCharAt(methodBuffer.lastIndexOf(",")); //去掉最后一个","
        methodBuffer.append(")");
        System.out.println(methodBuffer.toString());  //打印输出
    }

}

}

[/code]

[quote]我想获得完整的方法
比润 public String print(String s)[/quote]

据我所知,是不能通过反射获得方法的具体参数,如上面的s,因为Java的Class文件根本就不会存储一个方法的参数名。不过你的这个要求可以通过一些第三方类库来完成,比如:ParaNamer(具体内容参考它的官方网站http://paranamer.codehaus.org/)

     JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。 

得到某个对象的属性 ­1 public Object getProperty(Object owner, String fieldName) throws Exception { 2 Class ownerClass = owner.getClass(); 3 4 Field field = ownerClass.getField(fieldName); 5 6 Object property = field.get(owner); 7 8 return property; 9 } Class ownerClass = owner.getClass():得到该对象的Class。 ­Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。 ­Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。
2. 得到某个类的静态属性 ­1 public Object getStaticProperty(String className, String fieldName) 2 throws Exception { 3 Class ownerClass = Class.forName(className); 4 5 Field field = ownerClass.getField(fieldName); 6 7 Object property = field.get(ownerClass); 8 9 return property; 10 } ­Class ownerClass = Class.forName(className) :首先得到这个类的Class。 ­Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。 ­Object property = field.get(ownerClass) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。
3. 执行某对象的方法 ­1 public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception { 2 3 Class ownerClass = owner.getClass(); 4 5 Class[] argsClass = new Class[args.length]; 6 7 for (int i = 0, j = args.length; i < j; i++) { 8 argsClass[i] = args[i].getClass(); 9 } 10 11 Method method = ownerClass.getMethod(methodName, argsClass); 12 13 return method.invoke(owner, args); 14 } Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class。 ­5~9行:配置参数的Class数组,作为寻找Method的条件。

看看这文章,里面有代码

http://www.iteye.com/topic/137944

哎。。。。这种问题应该baidu或google。。。

首先Bean在符合JavaBean的要求,即有一个无参的构造方法,所有属性都有一个set和get方法并且set与get方法是set/get+属性名称(属性名称先字母大写)
public class User {
private int id;

private String name;

private Date birthday;

private float money;

public User() {

}

public Date getBirthday() {
    return birthday;
}

public void setBirthday(Date birthday) {
    this.birthday = birthday;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public float getMoney() {
    return money;
}

public void setMoney(float money) {
    this.money = money;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

}

public class ORMTest {

public static void main(String[] args) throws SQLException,
        IllegalAccessException, InvocationTargetException, Exception {
    User user = (User) getObject(
            "select id as Id, name as Name, birthday as Birthday, money as Money  from user where id=1",
            User.class);
    //这里取别名就是为了便列名加set或get就可以是JavaBean中属性的set或get方法
    System.out.println(user);

    Bean b = (Bean) getObject(
            "select id as Id, name as Name, birthday as Birthday, money as Money from user where id=1",
            Bean.class);
    System.out.println(b);
}

private static String[] getColNames(ResultSet rs) throws SQLException {
    ResultSetMetaData rsmd = rs.getMetaData();
    int count = rsmd.getColumnCount();
    String[] colNames = new String[count];
    for (int i = 1; i <= count; i++) {
        colNames[i - 1] = rsmd.getColumnLabel(i);
    }
    return colNames;
}

static Object getObject(String sql, Class clazz) throws SQLException,
        Exception, IllegalAccessException, InvocationTargetException {
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
        conn = JdbcUtils.getConnection();
        ps = conn.prepareStatement(sql);
        rs = ps.executeQuery();
        String[] colNames = getColNames(rs);//得到所有的列名

        Object object = null;
        Method[] ms = clazz.getMethods();//得到javaBean中所有set或get方法
        if (rs.next()) {
            object = clazz.newInstance();
            for (int i = 0; i < colNames.length; i++) {
                String colName = colNames[i];
                String methodName = "set" + colName;//得到set或get方法名
                for (Method m : ms) {
                    if (methodName.equals(m.getName())) {
                        m.invoke(object, rs.getObject(colName));//调用set方法,将该列的值放到set方法当中去.
                        break;
                    }
                }
            }
        }
        return object;
    } finally {
        JdbcUtils.free(rs, ps, conn);
    }
}
}

再没学过反射机制的时候感觉挺神秘似的,其实很简单,看看相关例子就明白了,说白了他就是根据对象所属类及构造函数名字,在运行是人以调用而已。

没有什么意义啊,你试试用反射写一个获得表单值,放到javabean中

这个还是比较有意思的~~~

还得研究研究

为什么大家都不喜欢用代码显示功能呢 代码没有格式和高亮看起来让人很郁闷的

我下面的代码完全实现了你说的,自己打开ide试试看

[code="java"]import java.lang.reflect.*;

/**
*

  • @author zhiweiv
    */
    public class BeanInfo {

    public static void print(String className) throws ClassNotFoundException {
    Class clazz = Class.forName(className);//动态加载类,获取类的class
    Field[] fields = clazz.getDeclaredFields();//获取全部属性
    Method[] methods = clazz.getDeclaredMethods();//获取全部方法
    //使用增强for循环输出属性名和其声明类的名字
    for (Field f : fields) {
    System.out.println("属性名字:" + f.getName() + "属性类型:" + f.getType().getName());
    }
    for (Method m : methods) {
    System.out.println("方法名字"+m.getName() + "参数个数:"+m.getParameterTypes().length);
    //输出方法的参数类型
    for (Class claz : m.getParameterTypes()) {
    System.out.print(" 参数类型:" + claz.getName());
    }
    }
    }
    }[/code]