因为使用spring data jpa时生成了多个名字相似的方法(根据数据库表自动生成的类与对应的Repository,有的类有setCol,setCol1,setCol2。。。setCol100个方法),业务需要,代码每次执行的setCol方法都根据情况而变,所以需要使用动态生成代码的方法。也就是Java的反射
Java的反射机制是在运行状态中,对于任意一个类,都能通过该类的字节流文件(.Class)来知道这个类的所有属性和方法;从而进行动态的调用。
1.反射使用前准备
获得Class类Class c=Class.forName("org.ben.user");
注意这里类名需要全名。
Class类是所有数据类型都有的一个“静态”属性。通过forName(String)来获取。
如果已经有示例对象了,还可以使用
User u=new User();
Class uClass=u.getClass();
2.反射的核心方法
1.获得类的属性:
Field[] fields=uClass.getDeclaredFields();
for(Field f:fields){
System.out.println(f.getName()+":"+(Double)f.get(u);
}
- getDeclaredFields是获取类的所有属性,包括私有的。因为现在类的属性普遍私有,所以使用这个更合适。
- 当赋值对象是Double时,使用f.getDouble这类的反而会报错,不够方便(正常来说double与Double是可以自动转化的),所以直接使用get就不会了。
- getName()获取属性名
2.获得类的方法并调用
String methodName="setCol";
Method m=uClass.getDeclaredMethod(methodName, Double.class);
m.invoke(u,1.0);
//try catch省略
- 同上,getDeclaredMethod(String methodName,Class.. Type)来获取方法名,比如上例表示methodName=“setCol1“,方法setCol1的参数为Double。
加入要对调用一个实例的方法对其属性进行修改,则 invoke要使用实例参数,否则只是普通的调用了该方法,invoke第二个参数(甚至第三第四。。)都是参数值,要与getDeclaredMethod中的对应。
- 基础类型如double,int使用的是Double.Type,Integer.Type, Double,Integer,User使用的是Double.class,Integer.class,user.class
完整:
//将vCol-vCol的值都存入数组中
public double[] getCols(DevElrDetailAUnion devElrDetailAUnion){
double[] Cols=new double[106];
int i=0;
String regEx="vCol\\d*";
Pattern pattern = Pattern.compile(regEx);
try {
Class devUnion = Class.forName("com.xx.Domain.DevElrDetailAUnion");
Field[] fields=devUnion.getDeclaredFields();
for(Field f:fields){
Matcher matcher = pattern.matcher(f.getName());
if(matcher.matches()){
if((Double)f.get(devElrDetailAUnion)!=null)
Cols[i++]=(Double)f.get(devElrDetailAUnion);
else
Cols[i++]=0.0;
}
}
}catch (Exception e){
e.printStackTrace();
}
return Cols;
}
String methodName="setvCol";
if(ColNo!=0)
methodName+=ColNo;
try {
Class devClass =Class.forName("com.xx.Domain.DevElrDetailAUnion");
Method saveToCol=devClass.getDeclaredMethod(methodName,Double.class);
saveToCol.invoke(devElrDetailAUnion, devElrDetailA.getParaValue());
}catch(Exception e){
e.printStackTrace();
}
贴一个更加详细的教程:Java反射
本文介绍如何利用Java反射机制解决因SpringDataJPA自动生成大量相似方法导致的问题,具体讲解了如何通过反射动态调用这些方法,并提供了代码示例。
1584

被折叠的 条评论
为什么被折叠?



