1、为什么会用到反射机制?
最近需要写定时服务,如果一个一个去写定时服务的话,后期维护是很烦人的,通过反射机制,我们就可以将定时服务的信息通过数据配置来实现,这样我们后期就可以将整个模块交给运维人员去管理,这样就大大的减少了我们的运维时间,可以更多的时间和精力投入到新项目或者学习中。原来在用.net的时候已经实现了这部分的功能,现在公司大方向转到java,我们也只能跟着转了。
因为接到了这个任务后面还是要做类似.net的运维功能,所以趁着空闲了解了一下java中的反射机制:
下面写一个简单的例子:
首先,定义一个父类(因为是测试代码,命名之类的都比较随意)
public interface test { public abstract void test1(); }
其次,定义两个子类(这边是测试所以就写了两个,实际开发中可以自行添加)
public class test1 implements test { @Override public void test1() { System.out.println("测试1"); } }
public class test2 implements test { @Override public void test1() { System.out.println("测试2"); } }
做完上面两步,最后就是通过反射机制来实现了:
public static void main(String[] args){
try {
//list可以将这部分配置在数据库中
List<String>list=new ArrayList<>();
list.add("service.impl.test2");
list.add("service.impl.test1");
for (String className:list) {
test t1=(test)Class.forName(className).newInstance();//test对应的父类
t1.test1();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
注:list部分如果是做定时服务的话,可以将每个方法对应的运行时间配置在数据库这样我们就可以通过数据库配置灵活的控制每个服务的运行时间,就不需要每次时间改变都要去手动修改代码。
2、反射之获取实体属性
@Data public class Company { private Integer CompanyID ; private String CompanyMainName; private String UsedName; private Integer OfficerID; private String OfficerName ; private Integer Area; private String CountrywideName ; private String Code ; private String RegisterAddress; private String RegisterPostCode; private String DetailAddress; private String DetailRegisterPostCode; private String BussinessCharter; private String CorporationNumber; private String SocialCreditCode; private Integer Principal; private Integer MonetaryUnitID; private String MonetaryUnitName ; private Integer EconomyTypeID; private String EconomyTypeName; private Date BussinessDateStart; private String Fax; private String Phone; private String LinkManMobile; private String EMail ; private String WebSite; private String LinkMan; private String LinkManTelephone; private Integer BusinessSystemTypeID; private Integer BusinessSystemTypeName; private Integer Guid; }
public static void main(String[] args){ try { Field []field = model.Company.class.getDeclaredFields(); String ss=Arrays.toString(model.Company.class.getClasses()); for (Field info:field) { System.out.println(info.getName()); } } catch (Exception e) { e.printStackTrace(); } }
3、通过反射获取类中的方法
public static void main(String[] args){ try { //list可以将这部分配置在数据库中 List<String>list=new ArrayList<>(); list.add("service.impl.test2"); list.add("service.impl.test1"); for (String className:list) { test t1=(test)Class.forName(className).newInstance();//test对应的父类 Class cl = t1.getClass(); Method[] methods = cl.getDeclaredMethods(); for (Method m:methods) { System.out.println(m); } } catch (Exception e) { e.printStackTrace(); } }