精华内容
下载资源
问答
  • Java的获取注解值       1自定义注解   1字段注解 import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang....

    Java的获取注解值

     

     

     

    1自定义注解

     

    • 1字段注解
    
    import java.lang.annotation.Documented;
    
    import java.lang.annotation.ElementType;
    
    import java.lang.annotation.Retention;
    
    import java.lang.annotation.RetentionPolicy;
    
    import java.lang.annotation.Target;
    
    
    
    @Documented
    
    @Target({ElementType.FIELD}) //注解应用类型
    
    @Retention(RetentionPolicy.RUNTIME) // 注解的类型
    
    public @interface FieldInterface {
    
    
    
    String name() default "";
    
    }

     

     

    •  方法注解


     

    
    import java.lang.annotation.Documented;
    
    import java.lang.annotation.ElementType;
    
    import java.lang.annotation.Retention;
    
    import java.lang.annotation.RetentionPolicy;
    
    import java.lang.annotation.Target;
    
    
    
    @Documented // 标记在生成javadoc时是否将注解包含进去,可有可无
    
    @Target({ElementType.METHOD}) //注解应用类型
    
    @Retention(RetentionPolicy.RUNTIME) // 注解的类型
    
    
    
    public @interface MethodInterface {
    
    
    
    String name() default "";
    
    }
    
    

     

     

    2新建实体类

    public class TestClass {
    
    
    
    @FieldInterface(name = "字段注解")
    
    private String name = "ls";
    
    private Constructor<?>[] declaredConstructors;
    
    
    
    @MethodInterface(name = "方法注解")
    
    public void isNot() {
    
    
    
    }
    
    }

     

    3获取注解值

    使用反射机制电子杂志注解值


     

    	public void getMethodAnnotationValue() {
    		// 获取所有的方法
    		Method[] name = TestClass.class.getDeclaredMethods();
    
    		for (Method str : name) {
    			// 判断是否方法上存在注解
    			boolean annotationPresent = str.isAnnotationPresent(MethodInterface.class);
    
    			if (annotationPresent) {
    				// 获取自定义注解对象
    				MethodInterface methodAnno = str.getAnnotation(MethodInterface.class);
    
    				// 根据对象获取注解值
    				String isNotNullStr = methodAnno.name();
    				 
    				System.out.println(isNotNullStr);
    
    			}
    
    		}
    
    	}
    
    	public void getFieldAnnotationValue() throws NoSuchFieldException, SecurityException {
    		// 获取所有的字段
    		Field[] fields = TestClass.class.getDeclaredFields();
    
    		for (Field f : fields) {
    			// 判断字段注解是否存在
    			boolean annotationPresent2 = f.isAnnotationPresent(FieldInterface.class);
    
    			if (annotationPresent2) {
    
    				FieldInterface name = f.getAnnotation(FieldInterface.class);
    				// 获取注解值
    				String nameStr = name.name();
    
    				System.out.println(nameStr);
    			}
    
    		}
    
    	}

     

    4进行测试

    public static void main(String[] args) throws NoSuchFieldException, SecurityException {
    
    
    
    TestClass c = new TestClass();
    
    // 获取方法上的注解值
    
    c.getMethodAnnotationValue();
    
    // 获取字段上的注解值
    
    c.getFieldAnnotationValue();
    
    
    
    }
    
    

      

    结果

      自定义注解详细

    获取注解值详细

     

    展开全文
  • 文章目录反射反射概述获取Class对象的三种方法:通过Class.forName()获取class对象,它会把参数指定的加载到内存反射class的信息class对象方法 - 01获取反射的代码示例通过反射技术访问字段(属性方法)并...

    反射

    反射概述

    反射就是根据字节码文件(Class),反射类的信息、字段、方法、构造方法等类的内容,然后根据字节码文件来创建对象,调用方法的技术

    没有源码,只有字节码文件也能够运行

    反射的基础前提,是Class对象!【记住这个非常非常非常重要,反射都是基于类Class对象的】

    什么是Class类:

    ​ 比如小猫可以抽象为Cat类,小狗抽象为Dog类,小猪抽象为Pig类,人可以抽象为Person类,字符串抽象为String类,然后在将这些抽象的Cat/Dog/Pig/Person/String等所有的类再抽象为一个Class类。

    ​ Class类描述所有类的共同特征。

    获取Class对象的三种方法:

    1. 每个通过class属性获取。【类名.class
    2. 每个对象通过getClass()方法获取。【对象.getClass()
    3. 通过**Class.forName(“类的完整名”)**获取,需要捕获异常。【Class.forName(“类的完整名”)
    /*
    * 获取class对象的方法
    * */
    public class GetClasssObject {
        public static void main(String[] args) {
            //1、每个类通过class属性 获取
            Class classObject1 = GetClasssObject.class;
    
            //2、每个对象通过getClass()方法获取。
            Class classObject2 = new GetClasssObject().getClass();
    
            //通过Class.forName("类的完整名")获取 需要抛出异常
            Class classObject3 = null;
            try {
                classObject3 = Class.forName("com.xgf.reflect.GetClasssObject");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
    
            //获取int Integer的class对象
            Class intClass = int.class;
            Class integerClass1 = Integer.class;
    
    
            System.out.println("classObject1 : " + classObject1);
            System.out.println("classObject2 : " + classObject2);
            System.out.println("classObject3 : " + classObject3);
            System.out.println("intClass : " + intClass);
            System.out.println("integerClass1 : " + integerClass1);
    
        }
    }
    

    运行结果:

    发现三种方式都可以获取类的对象,结果相同!

    通过Class.forName()获取class对象,它会把参数指定的类加载到内存中

    package com.xgf.bean;
    public class User {
        static {
            System.out.println("我是User的一个静态代码块");
        }
    }
    
    /*
    * 通过Class.forName()获取class对象,它会把参数指定的类加载到内存中
    *   通过测试是否运行了类的static静态代码块来判断是否加载到内存中
    * */
    public class ClassFormName {
    
        public static void main(String[] args) {
    
            System.out.println(" 1、类.Class ");
            Class<User> userClass = User.class;
            System.out.println();//换行
    
            System.out.println(" 2、 Class.forName(完整类名) ");
            try {
                Class<?> aClass = Class.forName("com.xgf.bean.User");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
    

    运行结果(只有class.forName()方法运行了User类的静态代码块)

    在这里插入图片描述

    总结:

    1. 类名.class  不将类加载到内存,Class.forName()会将类加载到内存
    2. 对象.getClass()创建对象就会加载到内存中去
    

    反射类class的信息

    class对象方法 - 01

    class对象方法 描述
    int getModifiers() 获取反射类的修饰符,需要通过Modifier.toString()将其转化为字符串
    getName() 返回完整类名(java.lang.String)
    getSimpleName() 返回简易类名(String)
    getSuperclass() 获取反射类的父类
    getInterfaces() 获取反射类的接口数组,如果没有实现接口,返回长度为0

    获取反射类的代码示例

    public class ReflectParentClass {
        public static void main(String[] args) {
            //1、通过类名获取Calss对象
            Class<String> stringClass = String.class;
    
            StringBuilder sb = new StringBuilder();//字符串拼接
    
            //2、通过class对象获取反射类的信息
            //2.1 getModifiers()获取反射类的修饰符
            int modifiers = stringClass.getModifiers();
            //Modifier.toString()将其转化为字符串,拼接到StringBuilder
            sb.append(Modifier.toString(modifiers));
    
    
            //2.2 getName()获取反射类的类名
            sb.append(" class ");//public final class java.lang.String 需要拼接class
            //getName()返回完整类名 : java.lang.String
            sb.append(stringClass.getName());
            //getSimpleName()返回简易类名 String
            //sb.append(stringClass.getSimpleName());
    
            //2.3 getSuperclass()获取反射类的父类
            Class superclass = stringClass.getSuperclass();
            sb.append(" extends ");//拼接关键字
            sb.append(superclass);
    
            //2.4 getInterfaces() 获取反射类的接口,如果没有实现接口,返回长度为0
            Class<?>[] interfaces = stringClass.getInterfaces();
            if( interfaces.length > 0){
                sb.append(" implements ");
                //遍历接口数组
                for(int i = 0; i<interfaces.length; i++){
                    sb.append(interfaces[i].getSimpleName());//获取接口简易名
                    //不是最后一个接口需要用逗号,隔开
                    if(i != interfaces.length-1){
                        sb.append(",");
                    }
                }
            }
            //输出拼接的类信息
            System.out.println(sb);
        }
    }
    

    运行结果:这里的接口我用了getSimpleName()获取的是它们的简易名

    在这里插入图片描述

    通过反射技术访问类的字段(属性方法)并赋值

    class对象方法 - 02

    方法名 描述
    Field getField(string fields, mixed condition, string spea) 获取反射的字段。fields 必须有,需要查询的字段名称,可以是一个或多个字段。condition 可选,查询条件,可以是字符或数组。spea 多个字段数据生成关联数组时,数据间隔符号,默认为空格。 如果输入的字段名称fields在反射类中找不到就会抛出NoSuchFieldException异常这个方法只能访问公共字段(public),但是可以通过setAccessible(true)方法设置访问权限,就可以访问private的字段了
    Field 、getDeclaredField() 该方法可以访问所有的字段,包括私有字段(private)
    Object newInstance() 通过反射对象创建类的实例,默认调用类的无参构造方法创建对象
    Field方法 描述
    field.set(对象名,字段值) 给object对象的field字段赋值
    field.get(对象名) 返回字段的值
    field.setAccessible(true) 设置字段的访问属性,比如getField()获取的字段只能访问public的,可以通过该方法设置为true访问

    通过反射技术反射类的字段(属性)

    public class User {
    
        static {
            System.out.println("我是User的一个静态代码块");
        }
        public String userName;
        public int userAge;
    
        @Override
        public String toString() {
            return "User{" +
                    "userName='" + userName + '\'' +
                    ", userAge=" + userAge +
                    '}';
        }
    }
    
    /*
    * 通过反射技术反射类的字段(属性) -- 反射User类
    *   并给字段赋值
    * */
    public class ReflectClassField {
        public static void main(String[] args) throws NoSuchFieldException, InstantiationException, IllegalAccessException {
            //1、通过类名获取User的Calss对象 反射的前提是Class对象
            Class<User> userClass = User.class;
    
            System.out.println(" === 给user对象的userName赋值 ===");
           //2、getField()获取 反射User的字段username 反射字段要与类字段一致,否自会报NoSuchFieldException
            Field userNameField = userClass.getField("userName");
            
    		//getDeclaredField()方法能访问所有的字段,包括私有的
            //Field declaredField = userClass.getDeclaredField("userName");
            
            //3、设置字段的值(给字段赋值),对对象赋值,就需要创建对象
            //3.1 newInstance()通过反射技术创建对象的实例,默认调用类的无参构造方法
            User user = userClass.newInstance();    //相当于new User()
    
            //3.2 field.set(对象名,字段值) 设置字段的值 赋值
            userNameField.set(user,"我通过userNameField字段设置了userName的值");
            System.out.println(user);
            
            //3.3 field.get(对象名)返回字段的值
            System.out.println(userNameField.get(user));
    
            System.out.println("\n === 给user对象的setAge赋值 ===");
            Field userAgeField = userClass.getField("userAge");//获取字段
            userAgeField.set(user,20);//赋值
            System.out.println(user);
    
        }
    }
    
    

    运行结果:
    在这里插入图片描述


    通过反射技术反射方法

    Class对象方法 - 03

    方法名 描述
    getMethod(方法名, 方法参数类型列表) 反射指定方法签名的公共public方法
    Method.invoke(对象实例名,方法参数列表) 通过invoke调用方法

    通过反射技术反射类的方法

    public class User {
    
        static {
            System.out.println("我是User的一个静态代码块");
        }
        public String userName;
        public int userAge;
    
        /* 有参构造方法 */
        public void set(String userName,int userAge){
            this.userName = userName;
            this.userAge = userAge;
            System.out.println("调用set方法");
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "userName='" + userName + '\'' +
                    ", userAge=" + userAge +
                    '}';
        }
    }
    
    public class ReflectClassMenthod {
        public static void main(String[] args) throws NoSuchFieldException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
            //1、通过类名获取User的Calss对象 反射的前提是Class对象
            Class<User> userClass = User.class;
    
            //2、getMethod(方法名, 方法参数类型列表)  反射指定方法签名的公共public方法
            //反射toString方法  -- 无参构造方法
            Method toStringMethod = userClass.getMethod("toString", null);
    
            //3、 newInstance()通过反射技术创建对象的实例,默认调用类的无参构造方法
            User user = userClass.newInstance();//相当于new User()
    
            //4、 调用方法 方法.invoke(对象实例名,方法实参列表)
            toStringMethod.invoke(user,null);
    
            //5、反射有参构造方法set
            Method setMethod = userClass.getMethod("set", String.class, int.class);
            setMethod.invoke(user,"set对象设置userName",21);
    
            System.out.println(user);
    
        }
    }
    

    运行结果

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K5Wg4qSI-1599814571748)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200911165548469.png)]

    展开全文
  • Class.getField(String)方法可以获取类中的指定字段(可见的), 如果是私有的可以用getDeclaedField("name")方法获取,通过set(obj, "李四")方法可以设置指定对象上该字段的值, 如果是私有的需要先调用setAccessible...

    **

    • Class.getField(String)方法可以获取类中的指定字段(可见的),
    • 如果是私有的可以用getDeclaedField("name")方法获取,通过set(obj, "李四")方法可以设置指定对象上该字段的值,
    • 如果是私有的需要先调用setAccessible(true)设置访问权限,用获取的指定的字段调用get(obj)可以获取指定对象中该字段的值
    • @throws Exception
      */

      
      public static void main(String[] args) throws Exception {
          Class clazz = Class.forName("com.heima.bean.Person");
          Constructor c = clazz.getConstructor(String.class,int.class);   //获取有参构造
          Person p = (Person) c.newInstance("张三",23);                     //通过有参构造创建对象
      
          //Field f = clazz.getField("name");                             //获取姓名字段
          //f.set(p, "李四");                                               //修改姓名的值
          Field f = clazz.getDeclaredField("name");                       //暴力反射获取字段
          f.setAccessible(true);                                          //去除私有权限
          f.set(p, "李四"); 
      
          System.out.println(p);
      }

    转载于:https://blog.51cto.com/357712148/2158300

    展开全文
  • java 获取类中字段值的方法

    千次阅读 2019-01-21 22:44:01
    java获取字段值的方法。 public class BaseEntity&lt;PK&gt; implements Serializable { private PK test1; public PK getTest1() { return test1; } public void setTest1(PK test1) { t...

    java获取字段值的方法。

    public class BaseEntity<PK> implements Serializable {
    
        private PK test1;
    
        public PK getTest1() {
            return test1;
        }
    
        public void setTest1(PK test1) {
            this.test1 = test1;
        }
    
    }
    
      private static class Test extends BaseEntity<String> {
            private String test;
    
            public String getTest() {
                return test;
            }
    
            public void setTest(String test) {
                this.test = test;
            }
        }
    

    1.通过内省:
    必须要有get/set方法,才能读到,由于用反射获取值,故性能不高,只要有get/set方法,不考虑字段的修饰符,在spring中大多数采用的是内省复制
    形如:

        <bean id="mySpringBootstrap" class="com.config.MySpringBootstrap">
            <property name="bufferSize" value="4"></property>
        </bean>
    
        public final static <T> Object getField(String fieldName, T t) {
            Object invoke = null;
            try {
                PropertyDescriptor propertyDescriptor = new PropertyDescriptor(fieldName, t.getClass());
                Method readMethod = propertyDescriptor.getReadMethod();
                readMethod.setAccessible(true);
                invoke = readMethod.invoke(t);
                return invoke;
            } catch (IntrospectionException | IllegalAccessException
                    | InvocationTargetException e) {
                return invoke;
            }
        }
    

    2.通过Field对象:
    如果在所要查找的字段在父类中,需要递归去获取,而且还要设置可访问,私有字段和公共字段获取的方法不一样,需要自己判断,但是性能高。以下是获取私有字段的方法

     public final static <T> Object getFastField(String fieldName, T t) {
            Class<?> aClass = t.getClass();
            do {
                try {
                    Field field = aClass.getDeclaredField(fieldName);
                    field.setAccessible(true);
                    Object o = field.get(t);
                    return o;
                } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
                    aClass = aClass.getSuperclass();
                }
            } while (aClass == Object.class);
            return null;
        }
    
    展开全文
  • Java获取实体类字段

    千次阅读 2020-10-20 11:33:29
    * 使Function获取序列化能力 */ @FunctionalInterface public interface SFunction<T, R> extends Function<T, R>, Serializable { } 工具 public class SFunctionUtil { public static <T> ...
  • 引用空间: System.Reflection.PropertyInfo AnUser anUser = new AnUser(); anUser.Id = "514f275979f64531b7fbbb2f89c8af49"; anUser.UserNo = "5566110"; PropertyInfo[] props = typeof...//实体的字段列表 f
  • 1、实体代码如下 import cn.afterturn.easypoi.excel.annotation.Excel; import cn.afterturn.easypoi.handler.inter.IExcelDataModel; import cn.afterturn.easypoi.handler.inter.IExcelModel; import ...
  • Vb.Net 通过反射获取类字段

    千次阅读 2012-05-17 14:49:21
    'IU2DefineData类名 'IU2DefineData类中IU2AddressInf类名 'address是IU2AddressInf类中字段 Private Shared mIU2Data As IU2DefineData Public Function GetDate() As DataTable  Dim t As Type = GetType(IU
  • 通过反射获取类属性字段的个数

    千次阅读 2014-07-29 13:55:20
     import java.lang.reflect.Field; public class Test { public static void main(String[] args) { User user = new User(); // Java的反射 Field[] field = user.getClass().getDeclaredFields();...
  • 实现:选择的内容是根据实体类中字段动态获取,其中字段注解的内容就是字段的说明,导出时将作为excle的header 其中获取实体属性及属性固定注解上的内容 实体: @ApiModel(value = "员工信息") @Entity @...
  • 获取对象中字段的get和set方法

    千次阅读 2014-12-19 16:47:52
    获取对象中字段的get和set方法,兼有判断字段是否有get和set方法
  • jdbc 获取 字段的长度

    千次阅读 2017-11-14 14:14:07
    使用JDBC连接数据库获取表字段的注释信息:https://my.oschina.net/Thinkeryjgfn/blog/169384   在实现一个代码生成器的时候,遇到过一个问题,需要输出字段的长度 然后发现数字类型的字段,无符号的会少一个...
  • 直接上代码: type User struct{ Username string `json:"Username"` Socre float`json:"Socre...//获取结构体中字段的名称 func GetFieldName(columnName string, info User) float64 { var val float64...
  • 关于获取类字段有两种方式:getFields()和getDeclaredFields()。我们先来看看这两者的区别吧: getFields():获得某个的所有的公共(public)的字段,包括父类字段。  getDeclaredFields():获得某个的...
  • Class类中获取字段: public Field[] getFields();//获取包括自身和继承(实现)过来的所有的public字段——Field不支持泛型&lt;&gt;,即后面不接&lt;&gt; public Field[] getDeclaredFields(...
  • 我们利用JDK的sun.misc.Unsafe来计算下字段的偏移地址,一则验证下之前文章的结论,再则跟jol输出结果对比下。...有了字段的偏移地址,在加上对象的起始地,我们就能够通过Unsafe直接获取字段的值了。
  • 在LitJson里面有个是JsonMapper 映射 有些方法 public static T ToObject<T>(JsonReader reader); public static T ToObject<T>(TextReader reader); public static T ToObject<T&...
  • 循环获取类所有: public static void main(String[] args) throws Exception { //entity Student s = new Student(); s.name = "11"; s.address="老街"; getAll(s); getOne(s,"address"); } /** ...
  • 第一步,创建一个实体:欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、...
  • C# 获取实体字段名称和值

    万次阅读 2018-01-11 09:25:53
    // 设置Dictionary 得到实体字段名称和值 public static Dictionary GetProperties(T t) { Dictionary ret = new Dictionary(); if (t == null) { re
  • JAVA反射机制是在运行状态,对于任意一个,都能够知道这个的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。...
  • 这次说一下Blob字段的出库,也就是读取Blob字段中存的数据,因为不知道Blob字段中存的数据(文件)时什么类型的,所以可以在存入数据库的时候,每一条数据对应的存上Blob中存入的文件的文件名(一定带上文件格式),...
  • 反射工具反射获取对象属性 反射获取对象属性 public class ReflectionUtils { /** * 根据字段名称获取对象的属性 * @param fieldName * @param target * @param <T> * @return * @throws Exception ...
  • 获取JS对象中字段的数量

    千次阅读 2019-06-25 10:47:33
    数据如上图所示,要想获取数组每一项的对象的长度,实际应用场景是上传前的数据判断是否字段全部都填写,即获取每一项的长度 1.for of 获取数组的每一项 for(const m of tableData) { console.log(m) } m即为数组...
  • 以前遇到要获取当前以及所有父类的的field的时候,都是递归一直往上找,一直到Object ,个人觉得这种方法是不是太low了,有没有更好的办法?或者jdk其实是有这种方法的,只是我不知道,今天看了下spring的实现,...
  • Java反射获取字段属性值

    万次阅读 2019-03-10 14:20:16
    反射获取Java的所有字段,包括所有父类的字段。 自身的字段可直接通过方法 getDeclaredFields()【获取所有修饰符字段】或者getFields()【获取...如果要获取字段值, 则需要设置字段可访问即:field.setAcc...
  •  今天跟大家分享的是通过java的反射,获取pojo的所有字段值。 为什么要做这个操作的呢?主要是为了重写实体的toString方法。有人会说,直接重写toString方法,返回字段.toString()的字符串不就行了。这么做...
  • obj._meta.fields 为关键 obj为model 推荐使用函数 from django.apps import apps def getmodelfield(appname,modelname,... 获取model的verbose_name和name的字段 """ modelobj = apps.get_model(app...
  • java使用反射获取pojo(实体)的所有字段

    万次阅读 热门讨论 2014-04-19 15:43:54
     今天跟大家分享的是通过java的反射,获取pojo的所有字段值。  为什么要做这个操作的呢?主要是为了重写实体的toString方法。有人会说,直接重写toString方法,返回字段.toString()的字符串不就行了。
  • SQL获取多个字段中最大小值

    万次阅读 2018-01-18 15:56:48
    背景:表存在多个字段,对比查出最大、最小值 1、最大值greatest select greatest(字段1,字段2,字段N) maxs from 表 where a.条件= '条件值' 执行结果: 2、最小值least select least(字段1,字段...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 966,646
精华内容 386,658
关键字:

获取类中的字段