⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java_reflect.java

📁 利用反射机制对属性赋值
💻 JAVA
字号:
package org.qiming.owen.common;


import java.lang.reflect.*;
 
public class Java_reflect
{
  public Java_reflect()
  {
  }
  public static void main(String[] args)
  {
//	  Interested aInterested=new Interested();
//	  basereflect3(aInterested);
  }
  /**
   * 得到多个描述类Dept中属性的Field实例
   * **/
  public static void basereflect(Object obj)
  {
    Field[] fs= obj.getClass().getDeclaredFields();//得到多个描述类Dept中属性的Field实例
    for(int i=0;i<fs.length;i++)
    {
      Field f=fs[i];
      String fname=f.getName();  //属性名称
      String type=f.getType().toString(); //属性类型
      int modifier= f.getModifiers();//修饰:0--默认    1--public 2--private 4--protected
      System.out.println("属性名称:----"+fname+"--属性类型-----"+type+"---修饰====--"+modifier);
    }
  }
  
  public static void basereflect2(Object obj)
  {               
    Method[] ms= obj.getClass().getDeclaredMethods();//?
    for(int i=0;i<ms.length;i++)
    {
       Method m=ms[i];//?一个实例描述的是类中自己一个方法
       String mname=m.getName();  //方法名
       String returntype=m.getReturnType().toString(); //方法返回类型
       Class[]  params=m.getParameterTypes();     
       int modifier=m.getModifiers();  ////修饰:0--默认    1--public 2--private 4--protected
       System.out.println(mname);
       System.out.println("返回值类型:"+returntype);
       for(int j=0;j<params.length;j++)
       {
          String oneparam=params[j].toString();
          System.out.print("参数类型:"+oneparam+" ");
       }
       System.out.println();
    }
  }
  
  /**
   * 得到多个描述类Dept中方法的Field实例
   * **/
  public static void basereflect3(Object obj)
  {               
    Method[] ms= obj.getClass().getDeclaredMethods();//?
    for(int i=0;i<ms.length;i++)
    {
      Method m=ms[i];//?一个实例描述的是类中自己一个方法
      String mname=m.getName();
      if(mname.indexOf("get")!=-1) //getEmpid
      {
        try {
          Object o = m.invoke(obj, null);
          System.out.println(o.toString());
        }catch (InvocationTargetException ex) {
          ex.printStackTrace();
        }catch (IllegalArgumentException ex) {
          ex.printStackTrace();
        }catch (IllegalAccessException ex) {
          ex.printStackTrace();
        }
      }
      System.out.println();
    }
   }
   //反调实例中相应属性的set方法为属性付值
   public static void invokeSet(Object obj,String fname,String value)
   {
     Object[] paras=new Object[1];
     String type=getFieldType(obj,fname);
     paras[0]=value;
     if(type.equals(Integer.TYPE.toString()))//int
     {
      paras[0]=new Integer(value);
     }else if(type.equals(Float.TYPE.toString())){
       paras[0]=new Float(value);
     }else if(type.equals(Double.TYPE.toString())){
      paras[0]=new Double(value);
     }
   //先得到描述fname属性所对应的set方法的Method实例m
    String fsetname=getGETSETName(fname,1);//1--set方法 
    Method[] ms=obj.getClass().getDeclaredMethods();
    for(int i=0;i<ms.length;i++)
    {
       Method m=ms[i];//描述的是一个具体的方法
       String mname=m.getName();//得到他所描述的方法名称
       if(fsetname.equals(mname))
       {
         try{
            m.invoke(obj, paras);
         }catch (InvocationTargetException ex){
            ex.printStackTrace();
         }catch (IllegalArgumentException ex){
          ex.printStackTrace();
	     }catch (IllegalAccessException ex){
	        ex.printStackTrace();
	     }
       }
     }
    }
    //反调get方法取得实例中相应属性的值
    public static Object InvokeGet(Object obj,String fname)
    {
      Method m=getMethod(obj,fname,0);
      Object value=null;
      try{
		 value=m.invoke(obj,null);
	   }catch (IllegalArgumentException e){
		e.printStackTrace();
	   }catch (IllegalAccessException e){
		e.printStackTrace();
	   }catch (InvocationTargetException e){
		e.printStackTrace();
	   }
       return value;	
    }
    //由类或类的实例以及属性的名称可以得到描述该属性的get或set方法的Method实例
    public static Method getMethod(Object obj,String fname,int type)
    {
       Method m0=null;	
       String mname=getGETSETName(fname,type);
       Method[] ms=obj.getClass().getDeclaredMethods();
       for(int i=0;i<ms.length;i++)
       {
    	  Method m=ms[i];
    	  String methodname=m.getName();
    	  if(methodname.equals(mname)){
    		  m0=m;
    	  }
       }
       return m0;
    }
    
   
   
   
	public static String getGETSETName(String fname,int type)
	{
	  if(type==0)
	  {
	     return "get"+fname.substring(0,1).toUpperCase()+fname.substring(1).toLowerCase();
	  }else{
	     return "set"+fname.substring(0,1).toUpperCase()+fname.substring(1).toLowerCase();
	  }
	}
	public static String getFieldType(Object obj,String fieldname)
	{
	   Field[] fs= obj.getClass().getDeclaredFields();//得到多个描述类Dept中属性的Field实例
	   for(int i=0;i<fs.length;i++)
	   {
	     Field f=fs[i];
	     String fname=f.getName();//得到Field类实例所描述属性的名称
	     String type=f.getType().toString();
	     if(fname.equals(fieldname))
	     {
	        return type;
	     }
	   }
	   return null;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -