java技巧:反射判断field类型的操作
JAVA 反射机制中,Field的getModifiers()方法返回int类型值表示该字段的修饰符。
其中,该修饰符是java.lang.reflect.Modifier的静态属性。
对应表如下:
//判断是不是private类型方法public static boolean is Private(int modifiers){ retrurn ((modifiers & 0x2)!=0);}
分析一下,&是按位与操作符,0x2是十六进制,二进制是10,所以只有private类型按位与不为0.
补充:java反射获取类的类名、属性名、属性类型、方法、执行方法、构造函数
public class Demo02 { @SuppressWarnings('all') public static void main(String[] args) throws Exception {// 另一个com.sg.myReflection.bean包下的User类String path = 'com.sg.myReflection.bean.User';try { Class clazz = Class.forName(path); // 获取类名 String strName01 = clazz.getName();// 获取完整类名com.sg.myReflection.bean.User String strName02 = clazz.getSimpleName();// 直接获取类名 User // 获取属性 Field[] field01 = clazz.getFields(); // 返回属性为public的字段 Field[] field02 = clazz.getDeclaredFields(); // 返回所有的属性 Field field03 = clazz.getDeclaredField('id'); // 获取属性为id的字段 // 获取普通方法 Method[] Method01 = clazz.getDeclaredMethods(); // 返回public方法 Method method = clazz.getDeclaredMethod('getId', null); // 返回getId这个方法,如果没有参数,就默认为null // 获取构造方法 User u1 = (User) clazz.newInstance(); // 获取无参的构造函数这里的前提的保证类中应该有无参的构造函数 // 获取参数为(int,String,int)的构造函数 Constructor c2 = clazz.getDeclaredConstructor(int.class, String.class, int.class); // 通过有参构造函数创建对象 User u2 = (User) c2.newInstance(1001, '小小', 18); // 通过反射调用普通方法 User u3 = (User) clazz.newInstance(); Method method03 = clazz.getDeclaredMethod('setId', int.class); method.invoke(u3, 1002); // 把对象u3的id设置为1002 // 通过反射操作普通的属性 User u4 = (User) clazz.newInstance(); Field f = clazz.getDeclaredField('name'); f.setAccessible(true); // 设置属性可以直接的进行访问 f.set(u4, '石头');} catch (ClassNotFoundException e) { e.printStackTrace();} }}
public static void getObjectValue(Object object) throws Exception {//我们项目的所有实体类都继承BaseDomain (所有实体基类:该类只是串行化一下)//不需要的自己去掉即可if (object != null && object instanceof BaseDomain) {//if (object!=null ) ----begin // 拿到该类 Class<?> clz = object.getClass(); // 获取实体类的所有属性,返回Field数组 Field[] fields = clz.getDeclaredFields(); for (Field field : fields) {// --for() beginSystem.out.println(field.getGenericType());//打印该类的所有属性类型// 如果类型是Stringif (field.getGenericType().toString().equals('class java.lang.String')) { // 如果type是类类型,则前面包含'class ',后面跟类名 // 拿到该属性的gettet方法 /** * 这里需要说明一下:他是根据拼凑的字符来找你写的getter方法的 * 在Boolean值的时候是isXXX(默认使用ide生成getter的都是isXXX) * 如果出现NoSuchMethod异常 就说明它找不到那个gettet方法 需要做个规范 */ Method m = (Method) object.getClass().getMethod( 'get' + getMethodName(field.getName())); String val = (String) m.invoke(object);// 调用getter方法获取属性值 if (val != null) {System.out.println('String type:' + val); }}// 如果类型是Integerif (field.getGenericType().toString().equals('class java.lang.Integer')) { Method m = (Method) object.getClass().getMethod( 'get' + getMethodName(field.getName())); Integer val = (Integer) m.invoke(object); if (val != null) {System.out.println('Integer type:' + val); }}// 如果类型是Doubleif (field.getGenericType().toString().equals('class java.lang.Double')) { Method m = (Method) object.getClass().getMethod( 'get' + getMethodName(field.getName())); Double val = (Double) m.invoke(object); if (val != null) {System.out.println('Double type:' + val); }}// 如果类型是Boolean 是封装类if (field.getGenericType().toString().equals('class java.lang.Boolean')) { Method m = (Method) object.getClass().getMethod( field.getName()); Boolean val = (Boolean) m.invoke(object); if (val != null) {System.out.println('Boolean type:' + val); }}// 如果类型是boolean 基本数据类型不一样 这里有点说名如果定义名是 isXXX的 那就全都是isXXX的// 反射找不到getter的具体名if (field.getGenericType().toString().equals('boolean')) { Method m = (Method) object.getClass().getMethod( field.getName()); Boolean val = (Boolean) m.invoke(object); if (val != null) {System.out.println('boolean type:' + val); }}// 如果类型是Dateif (field.getGenericType().toString().equals('class java.util.Date')) { Method m = (Method) object.getClass().getMethod( 'get' + getMethodName(field.getName())); Date val = (Date) m.invoke(object); if (val != null) {System.out.println('Date type:' + val); }}// 如果类型是Shortif (field.getGenericType().toString().equals('class java.lang.Short')) { Method m = (Method) object.getClass().getMethod( 'get' + getMethodName(field.getName())); Short val = (Short) m.invoke(object); if (val != null) {System.out.println('Short type:' + val); }}// 如果还需要其他的类型请自己做扩展 }//for() --end}//if (object!=null ) ----end } // 把一个字符串的第一个字母大写、效率是最高的、 private static String getMethodName(String fildeName) throws Exception{byte[] items = fildeName.getBytes();items[0] = (byte) ((char) items[0] - ’a’ + ’A’);return new String(items); }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持好吧啦网。
相关文章:
1. IDEA 使用mybatis插件Free Mybatis plugin的步骤(推荐)2. 解决idea使用maven编译正常但是运行项目时却提示很多jar包找不到的问题3. Hadoop 使用IntelliJ IDEA 进行远程调试代码的配置方法4. idea的easyCode的 MybatisPlus模板的配置详解5. 关于IDEA git 只有Commit没有Push的问题6. 一文读懂IDEA里面的Artifact到底是什么7. Intellij IDEA 2019 最新乱码问题及解决必杀技(必看篇)8. 一篇文章带你解决 IDEA 每次新建项目 maven home directory 总是改变的问题9. IDEA 使用 SpotBugs 找出你代码中的bug问题10. Java FileInputStream与FileOutputStream使用详解

网公网安备