zoukankan      html  css  js  c++  java
  • java反射(基本知识)

    在java中反射降低了模块间的依赖性这个过程称解耦---高内聚,低耦合

     

    在java中,万物皆对象,则将字节码看成一个对象,将一个方法看成一个对象.....

    反射--剖析类,分析类的字节码,产生对象的字节码对象以及实例对象

      Class---代表字节码的类---代表类的类

      Field---代表属性的类

      Method---代表方法的类

      Constructor---代表构造方法的类

      Package--代表包的类

    如何获取一个类的对象:(三种方式)

      1. 通过对象的getClass()方法来获取这个对象所对应的类的字节码对象;

      2. 通过类名.class 的方式来获取代表这个类的字节码对象;

      3. 通过Class.forName()方法来获取这个字符串所代表的类的字节码对象;(用的比较多)

        Class<Person> c = Class<Person>Class.forName(Reflect.Students.”);

    重要方法

      forName(String className)---返回的是一个Class<?>;获得的是一个字节码对象(类的对象)

      newInstance()---创建字节码对象所对应的实例对象(必须是无参构造时)

      getConstructor(Class ... paramterTypes)---获取指定的构造函数,该构造函数必须是public,

      getDeclaredMethod:--获取指定构造函数。是全部的构造函数(包括默认的和私有的),但是只能是本类的。

     1 import java.io.File;
     2 import java.io.FileInputStream;
     3 import java.lang.reflect.Constructor;
     4 import java.lang.reflect.Field;
     5 import java.lang.reflect.Method;
     6 import java.text.SimpleDateFormat;
     7 import java.util.Properties;
     8 
     9 import java.util.Date;
    10 
    11 public class ProfessionDemo {
    12     public static void main(String[] args) throws Exception {
    13         File file = new File("D:\Workspaces\SGB1704\bin\Reflect\config.properties");
    14         Properties pro = new Properties();
    15         pro.load(new FileInputStream(file));
    16 
    17         String classname = pro.getProperty("classname");
    18         String[] attrname = pro.getProperty("attrname").split("/");
    19         String[] attrvalue = pro.getProperty("attrvalue").split("/");
    20         String methodname = pro.getProperty("methodname");
    21 
    22         // 获取字节码对象
    23         Class<Profession> pf = (Class<Profession>) Class.forName(classname);
    24         // 参数类型
    25         Class[] parameterList = { String.class, int.class, Date.class,char.class };
    26         // 列举参数
    27         Object[] objargs = new Object[] { 
    28                 attrvalue[0],
    29                 Integer.parseInt(attrvalue[1]),
    30                 new SimpleDateFormat("yyyy-MM-dd").parse(attrvalue[2]),
    31                 attrvalue[3].charAt(0) 
    32         };
    33         // 获取构造函数
    34         Constructor<Profession> prop = pf.getDeclaredConstructor(parameterList);
    35         // 实例化对象(有参构造)
    36         Profession p = prop.newInstance(objargs);
    37         // 遍历属性名
    38         for (int i = 0; i < attrname.length; i++) {
    39             // 每个参数名
    40             String attrnameStr = attrname[i];
    41             // 根据属性名来获取这个属性对象
    42             Field f = pf.getDeclaredField(attrnameStr);
    43             Class fpf = f.getType();
    44             // 拼接出set方法
    45             String setMethodName = "set"
    46                     + attrnameStr.substring(0, 1).toUpperCase()
    47                     + attrnameStr.substring(1);
    48             // 获取指定方法
    49             Method setMothod = pf.getMethod(setMethodName, fpf);
    50             // 判断类型执行不同的方法
    51             if (fpf == int.class || fpf.equals(Integer.class)) {
    52                 setMothod.invoke(p, Integer.parseInt(attrvalue[i]));
    53             } else if (fpf.equals(Date.class)) {
    54                 setMothod.invoke(p,
    55                         new SimpleDateFormat("yyyy-MM-dd").parse(attrvalue[i]));
    56             } else if (fpf == char.class || fpf.equals(Character.class)) {
    57                 setMothod.invoke(p, attrvalue[i].charAt(0));
    58             } else {
    59                 setMothod.invoke(p, attrvalue[i]);
    60             }
    61 
    62             // 获取指定的方法
    63             Method m = pf.getDeclaredMethod(pro.getProperty("methodname"), null);
    64 
    65             // 执行指定的方法
    66             m.invoke(p, null);
    67 
    68         }
    69 
    70     }
    71 
    72 }
  • 相关阅读:
    [React] Improve developer experience for accessing context with a custom React hook
    [CSS] Create a self-centering, full-width stripe with CSS Grid
    android之使用mvn构建创造项目步骤
    Android读取Excel文件
    Android之RAS加密算法测试
    android 内存溢出oom错误的一些小见解
    Android之在应用程序内部关注某人的微信
    Android之使用picker打开相应的app
    MAC之查看日历
    MAC之tar解压与压缩打包命令
  • 原文地址:https://www.cnblogs.com/tongxuping/p/6832492.html
Copyright © 2011-2022 走看看