package org.lxh.demo.classdemo05;import java.lang.reflect.Method;public class InvokeMethodDemo04 { public static void main(String[] args) throws Exception {
Class<?> c = Class.forName("org.lxh.demo.classdemo05.Person");
Object o = c.newInstance() ;
set("name","MLDN") ;
set("age",30) ;   // 这个地方有错误 ,难道反射的时候不通自动的装箱吗?
get("name",o) ;
get("age",o) ;
}
/**
 * 
 * @param name 属性名称
 * @param value 属性值
 * @param obj 要操作的对象
 */
public static void set(String name, Object value, Object obj)
throws Exception {
Method met = obj.getClass().getMethod("set" + initStr(name),
value.getClass());
met.invoke(obj, value); // 调用方法
}
public static void get(String name, Object obj) throws Exception {
Method met = obj.getClass().getMethod("get" + initStr(name));
Object value = met.invoke(obj);
System.out.println(value);
}
public static String initStr(String name) {
StringBuffer buf = new StringBuffer();
buf.append(name.substring(0, 1).toUpperCase())
.append(name.substring(1));
return buf.toString();
}
}
我传int类型的时候给我报错.
ReflectDemo.invokDemo.Person.setAge(java.lang.Integer)
难道反射的时候int不能自动装箱成Integer吗.

解决方案 »

  1.   

    我记得不错的话是不能的- -还是用Integer吧
      

  2.   

    我怎么写成Integer.class也不行,只写成int.class就好用.这是为啥啊
      

  3.   

    Interger是int的原生类,Int是虚拟对象
      

  4.   

    在JDK1.5之后自动装箱是没问题的,即便在反射部分。
    楼主的编译错误根本不是 不能自动装箱,而是你调用set方法的参数不正确,你仔细看下eclipse里面的提示,set声明需要三个参数调用public static void set(String name, Object value, Object obj)
    而你调用的时候却是两个,这能不出错么?
    set("name","MLDN") ;
    set("age",30) ; 
      

  5.   

    int.class和Integer.class不是同一个类的,所以不一样,Integer只是int的封装类,区别还是很大的哦!
      

  6.   

    基本类型是需要写String.class, int.class...
      

  7.   

    package com.iss.invoke;import java.lang.reflect.Method;/**
     * @author wangweifeng 此实例主要演示反射机制
     * 
     */public class InvokeMethodDemo {
    public static void main(String[] args) throws Exception {
    Class<?> c = Class.forName("com.iss.invoke.Modle");
    Object o = c.newInstance();
    setString("Name", "MLDN", o);
    setInt("age", 30, o);
    get("name", o);
    get("age", o);
    } /**
     * @param name
     *            属性名称
     * @param value
     *            属性值
     * @param obj
     *            要操作的对象
     */
    public static void setString(String name, Object value, Object obj)
    throws Exception { Class[] parameterTypes = new Class[1];
    parameterTypes[0] = String.class;
    // parameterTypes[1]=int.class;
    Method method = (Method) obj.getClass().getMethod(
    "set" + initStr(name), parameterTypes);
    method.invoke(obj, value);
    } /**
     * @param name
     *            属性名称
     * @param value
     *            属性值
     * @param obj
     *            要操作的对象
     */
    public static void setInt(String name, Object value, Object obj)
    throws Exception { Class[] parameterTypes = new Class[1];
    parameterTypes[0] = int.class;
    // parameterTypes[1]=int.class;
    Method method = (Method) obj.getClass().getMethod(
    "set" + initStr(name), parameterTypes);
    method.invoke(obj, value);
    } /**
     * @param name
     *            属性名称
     * @param obj
     *            要操作的对象
     */
    public static void get(String name, Object obj) throws Exception { Method met = obj.getClass().getMethod("get" + initStr(name));
    Object value = met.invoke(obj);
    System.out.println(value);
    } public static String initStr(String name) {
    StringBuffer buf = new StringBuffer();
    buf.append(name.substring(0, 1).toUpperCase())
    .append(name.substring(1));
    return buf.toString();
    }}
      

  8.   

    这样才是对的,Method method = (Method) obj.getClass().getMethod(
    "set" + initStr(name), parameterTypes);
    需要一个参数类型说明
      

  9.   

    public static void set(String name, Object value, Object obj)
    这是三个参数
    你调的时候怎么才两个
      

  10.   

    调的时候没有两个啊。setString("Name", "MLDN", o);
    setInt("age", 30, o);
    拜托,麻烦自己将代码拷下去debug下。