A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 李印东 于 2011-11-20 10:17 编辑

如果有,那带参数的又怎么被初始化的?

5 个回复

倒序浏览
需要自己初始化的,反射最开始得到的只是一个字节码文件Class class1=Person.class。用Constructor constructor=class1.getConstructor()方法来获得构造方法  然后用 constructor.newInstance()来初始化。

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
杨杰 黑马帝 2011-11-16 20:39:25
藤椅
  1. import java.lang.reflect.Method;
  2. import java.lang.reflect.Field;
  3. import java.beans.PropertyDescriptor;

  4. public class PropertyUtil {
  5.         public  static PropertyDescriptor getPropertyDescriptor(Class clazz, String propertyName){
  6.                 StringBuffer sb = new StringBuffer();//构建一个可变字符串用来构建方法名称
  7.                 Method setMethod = null;
  8.                 Method getMethod = null;
  9.                 PropertyDescriptor  pd =null;
  10.                
  11.                  try
  12.                  {
  13.                         Field f = clazz.getDeclaredField(propertyName);//根据字段名来获取字段
  14.                         if(f==null){
  15.                         //构建方法的后缀
  16.                     String methodEnd = propertyName.substring(0,1).toLowerCase()+propertyName.substring(1);
  17.                     sb.append("set"+methodEnd);//构建set方法
  18.                     //构建set 方法
  19.                     setMethod = clazz.getDeclaredMethod(sb.toString(),new Class[]{f.getType()} );
  20.                     sb.delete(0, sb.length());//清空整个可变字符串
  21.                         sb.append("get"+methodEnd);//构建get方法
  22.                         //构建get 方法
  23.                         getMethod = clazz.getDeclaredMethod(sb.toString(), new Class[]{});
  24.                         //构建一个属性描述器 把对应属性 propertyName 的 get 和 set 方法保存到属性描述器中
  25.                         pd = new PropertyDescriptor(propertyName,getMethod,setMethod);
  26.                   }
  27.                 }catch(Exception ex){
  28.                         ex.printStackTrace();   
  29.                 }
  30.                 return pd;
  31.         }
  32.        
  33.         public static void setProperty(Object obj,String propertyName,Object value){
  34.                 Class clazz = obj.getClass();//获取对象的类型
  35.                 PropertyDescriptor pd = getPropertyDescriptor(clazz,propertyName);//获取 clazz 类型中的 propertyName 的属性描述器
  36.                 Method setMethod = pd.getWriteMethod();//从属性描述器中获取 set 方法
  37.                 try {
  38.                         setMethod.invoke(obj, new Object[]{value});//调用 set 方法将传入的value值保存属性中去
  39.                 } catch (Exception e){
  40.                         e.printStackTrace();
  41.                 }
  42.         }
  43.        
  44.         public static Object getProperty(Object obj, String propertyName){
  45.                 Class clazz = obj.getClass();//获取对象的类型
  46.                 PropertyDescriptor  pd = getPropertyDescriptor(clazz,propertyName);//获取 clazz 类型中的 propertyName 的属性描述器
  47.                 Method getMethod = pd.getReadMethod();//从属性描述器中获取 get 方法
  48.                 Object value =null ;
  49.                  try {
  50.                         value = getMethod.invoke(clazz, new Object[]{});//调用方法获取方法的返回值
  51.                 } catch (Exception e) {
  52.                         e.printStackTrace();
  53.                 }
  54.                 return value;//返回值
  55.         }
  56.     }
  57. 用反射实现带参方法,原理都是一样的,希望对你有帮助。
复制代码

评分

参与人数 1技术分 +2 收起 理由
宁超 + 2 不错,学习了。

查看全部评分

回复 使用道具 举报
import java.lang.reflect.Constructor;

public class Instance {

public static void main(String[] args)throws Exception {
  
   Class localClass = Class.forName("ins.Instance");
       Constructor localConstructor = localClass.getConstructor(new Class[0]);
       Instance localInstance = (Instance)localConstructor.newInstance(new Object[0]);
     

  localInstance.p();
}

void p(){
  System.out.println("不使用new ,使用反射,实例化一个对象!");
}
}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
多谢各位。。已经搞定了{:soso_e183:}
回复 使用道具 举报
反射对象是直到程序运行期间才知道类的名字的实例,这时才获取对象的成员,并设置属性。此时要用到类的全路径 ,用类的全路径来加载类,并返回该类的对象。以后就可以遍历类中的各个方法,各个属性。初始化得自己手动解决!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马