zoukankan      html  css  js  c++  java
  • Java反射的应用


    /**每天进步一点点
    */
    //该包读取的是properties文件中的内容PersonType=com.anby.damain.Person
    package com.anby.demo;
     
    import java.lang.reflect.Field;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.ResourceBundle;
     
    public class Reflect {
     
    public static void main(String[] args)throws Exception {
    //设置数据集
    Map<String,String> dataMap=new HashMap<String,String>();
    dataMap.put("name", "Anby");
    dataMap.put("age", "20");
    dataMap.put("sex", "man");
    dataMap.put("qq", "190241347");
    dataMap.put("Email", "ailaohuyou123@yahoo.com");
     
     
     
    Class clzz=Class.forName(getProperties("PersonType"));//若此处报异常,说明文件访问权限不够(java.lang.IllegalAccessException)
         //獲取实例对象
         Object obj=clzz.newInstance();
         //获取所有对象中的字段
         Field[] field=clzz.getDeclaredFields();
         for (Field f : field)
         {
         f.setAccessible(true);
         String fieldname=f.getName();
         String value=dataMap.get(fieldname);
         if(value!=null)
         {
         f.set(obj, value);
         }
         }
         System.out.println(obj);
    }
     
     
     
    public static String getProperties(String key) {
    //*获取properties下的字段
     //1,指定资源文件名称
       ResourceBundle rb=ResourceBundle.getBundle("Data");
       //2,获取资源文件中相应字段的值
        String type=rb.getString(key);
        return type;
    }
     
    }
     
     
     
     
    package com.anby;
     
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
     
    //简单了解反射
    public class ClssDemo  {
    public static void main(String[] args) throws Exception
    {
    Class cls=Class.forName("com.anby.Student");
       Object obj=cls.newInstance();
       Method[] m=cls.getDeclaredMethods();
       for(int i=0;i<m.length;i++)
       {
       System.out.println(m[i].getName());//方法是打印不出來結果的,只能調用
     
       }
        Method m1=cls.getDeclaredMethod("print",null);
       //Method m1=cls.getDeclaredMethod("print",String.class,int.class);  
        m1.invoke();//调用该方法
    }
     
     
    public static void getConstructor() throws Exception
    {
    String stu="com.anby.Student";
    //通过字节码获取类名称 并存放到内存
    Class clss=Class.forName(stu);
     
    //获取该类的默认构造函数
    Constructor cons1=clss.getConstructor(null);
    System.out.println(cons1);
     
    //获取该类的的实例 \
    //两种调用默认构造的方法
    //1,通过构造函数Constructor对象获取
    Object obj1=cons1.newInstance(null);
    //2,通过Class对象获得
    Object obj2=clss.newInstance();
     
    //获得指定参数的构造函数(包括私有)
    Constructor cons2=clss.getDeclaredConstructor(String.class,Integer.class);
    //设置访问权限
    cons2.setAccessible(true);
    //使用私有构造函数进行初始化
    Object obj3=cons2.newInstance("asd",123);
    }
     
     
    public static void getField() throws Exception
    {
    //同理,字段,方法,以及枚举都可以获取
    // Field[] field= clss.getDeclaredFields();
    // System.out.println(field);
    Class c=Class.forName("com.anby.Student");
    Object obj4=c.newInstance();
     
    Field namef=c.getDeclaredField("name");
    Field agef=c.getDeclaredField("age");
     
    namef.setAccessible(true);// 访问私有字段时,若不加这句话,会抛出java.lang.IllegalAccessException
    namef.set(obj4, "james");
    Object namevalue= namef.get(obj4);
     
    agef.get(obj4);
    agef.set(obj4, 123);
    Object agevalue=agef.get(obj4);
     
    System.out.println(namevalue);
    System.out.println(agevalue);
    //设置age值
    }
    }
     
    class Student
    {
    private  String name="anby";
    public int age=18;
       public Student()
       {
      System.out.println("默认构造函数");
       }
       private Student(String name,Integer age)
       {
      System.out.println("带参数的构造函数");
       }
       public void print()
       {
      System.out.println("print");
       }
    }
  • 相关阅读:
    C,LINUX,数据结构部分
    LINUX应用开发工程师职位(含答案)
    INT32 System_UserKeyFilter(NVTEVT evt, UINT32 paramNum, UINT32 *paramArray)
    屏幕调试
    1.ARM嵌入式体系结构与接口技术(Cortex-A8版)
    NT9666X调试log
    DemoKit编译过程错误
    selenium 代理设置
    pandas 轮询dataframe
    Spring 定时任务
  • 原文地址:https://www.cnblogs.com/anbylau2130/p/3041356.html
Copyright © 2011-2022 走看看